基于微服务的安全架构文档备忘录¶
简介¶
微服务架构正越来越多地用于设计和实现基于云和本地基础设施的应用程序系统。在应用程序设计和实现阶段,需要解决许多安全挑战。为了应对一些安全挑战,有必要收集应用程序架构中与安全相关的信息。本文旨在提供一种具体的方法建议,用于收集基于微服务的架构信息,以确保应用程序安全。
背景¶
在保护基于微服务架构的应用程序时,安全架构师/工程师通常会面临以下问题(主要参考 OWASP 应用程序安全验证标准项目的 V1“架构、设计和威胁建模要求” 部分):
- 威胁建模和最小权限原则的强制执行
- 微服务最少需要哪些范围或 API 密钥来访问其他微服务 API?
- 微服务最少需要哪些授权才能访问数据库或消息队列?
- 数据泄露分析
- 哪些存储或消息队列包含敏感数据?
- 微服务是否从特定数据库或消息队列读取/写入数据?
- 专用微服务调用了哪些微服务?微服务之间传递了哪些数据?
- 攻击面分析
- 在安全测试期间需要测试哪些微服务端点?
在大多数情况下,现有的应用程序架构文档不适合回答这些问题。以下部分提出了可以收集哪些架构安全特定信息来回答上述问题。
目标¶
本备忘录的目标是解释可以收集哪些架构安全特定信息来回答上述问题,并提供一种具体的方法建议,用于收集基于微服务的架构信息以确保应用程序安全。
方案¶
收集构建块信息¶
识别和描述应用功能服务¶
应用功能服务实现一个或多个业务流程或功能(例如,存储客户详细信息,存储和显示产品目录)。收集与每个应用功能服务相关的以下参数信息。
参数名称 | 描述 |
---|---|
服务名称 (ID) | 唯一的服务名称或 ID |
简要描述 | 微服务实现的业务流程或功能的简要描述 |
源代码仓库链接 | 指定服务源代码仓库的链接 |
开发团队 | 指定开发该微服务的开发团队 |
API 定义 | 如果微服务暴露外部接口,请指定接口描述链接(例如,OpenAPI 规范)。建议定义使用的安全方案,例如,定义调用特定端点所需的范围或 API 密钥(例如,参见)。 |
微服务架构描述 | 指定微服务架构图和描述的链接(如果可用) |
操作手册链接 | 指定微服务操作手册的链接 |
识别和描述基础设施服务¶
包括远程服务在内的基础设施服务可能实现认证、授权、服务注册和发现、安全监控、日志记录等。收集与每个基础设施服务相关的以下参数信息。
参数名称 | 描述 |
---|---|
服务名称 (ID) | 唯一的服务名称或 ID |
简要描述 | 服务实现的功能简要描述(例如,认证、授权、服务注册和发现、日志记录、安全监控、API 网关)。 |
源代码仓库链接 | 指定服务源代码仓库的链接(如果适用) |
服务文档链接 | 指定服务文档的链接,包括服务 API 定义、操作指南/操作手册等。 |
识别和描述数据存储¶
收集与每个数据存储相关的以下参数信息。
参数名称 | 描述 |
---|---|
存储名称 (ID) | 唯一的存储名称或 ID |
软件类型 | 指定实现数据存储的软件(例如,PostgreSQL, Redis, Apache Cassandra)。 |
识别和描述消息队列¶
消息系统(例如,RabbitMQ 或 Apache Kafka)用于实现异步微服务通信机制。收集与每个消息队列相关的以下参数信息。
参数名称 | 描述 |
---|---|
消息队列 (ID) | 唯一的消息队列名称或 ID |
软件类型 | 指定实现消息队列的软件(例如,RabbitMQ, Apache Kafka)。 |
识别和描述数据资产¶
识别和描述由系统微服务/服务处理的数据资产。建议首先识别从安全角度来看有价值的资产(例如,“用户信息”、“支付”)。收集与每个资产相关的以下参数信息。
参数名称 | 描述 |
---|---|
资产名称 (ID) | 唯一的资产名称或 ID |
保护级别 | 指定资产保护级别(例如,PII,机密) |
附加信息 | 添加澄清信息 |
收集构建块之间的关系信息¶
识别“服务到存储”关系¶
收集与每个“服务到存储”关系相关的以下参数信息。
参数名称 | 描述 |
---|---|
服务名称 (ID) | 指定上面定义的服务名称 (ID) |
存储名称 (ID) | 指定上面定义的存储名称 (ID) |
访问类型 | 指定访问类型,例如“读取”或“读/写” |
识别“服务到服务”同步通信¶
收集与每个“服务到服务”同步通信相关的以下参数信息。
参数名称 | 描述 |
---|---|
调用服务名称 (ID) | 指定上面定义的调用服务名称 (ID) |
被调用服务名称 (ID) | 指定上面定义的被调用服务名称 (ID) |
使用的协议/框架 | 指定通信使用的协议/框架,例如 HTTP (REST, SOAP), Apache Thrift, gRPC |
简要描述 | 简要描述通信目的(信息查询请求或状态更改业务功能的请求/命令)以及服务之间传递的数据(如果可能,根据上面定义的资产术语) |
识别“服务到服务”异步通信¶
收集与每个“服务到服务”异步通信相关的以下参数信息。
参数名称 | 描述 |
---|---|
发布者服务名称 (ID) | 指定上面定义的发布者服务名称 (ID) |
订阅者服务名称 (ID) | 指定上面定义的订阅者服务名称 (ID) |
消息队列 (ID) | 指定上面定义的消息队列 (ID) |
简要描述 | 简要描述通信目的(接收信息或状态更改业务功能的命令)以及服务之间传递的数据(如果可能,根据上面定义的资产术语) |
识别“资产到存储”关系¶
收集与每个“资产到存储”关系相关的以下参数信息。
参数名称 | 描述 |
---|---|
资产名称 (ID) | 上面定义的资产名称 (ID) |
存储名称 (ID) | 指定上面定义的存储名称 (ID) |
存储类型 | 指定资产的存储类型,例如“黄金来源”或“缓存” |
创建应用程序架构的图形化表示¶
建议以服务调用图或数据流图的形式创建应用程序架构(上述构建块和关系)的图形化表示。为此,可以使用专用软件工具(例如 Enterprise Architect)或 DOT 语言。有关使用 DOT 语言的示例,请参见此处。
在安全软件开发实践中使用收集到的信息¶
收集到的信息可能有助于进行应用程序安全实践,例如在定义安全要求、威胁建模或安全测试期间。以下部分包含与保护应用程序架构相关的活动示例(及其与 OWASP 项目的映射)以及使用上述收集信息实现这些活动的技巧。
攻击面分析¶
实施技巧¶
要枚举在安全测试期间需要测试并在威胁建模期间进行分析的微服务端点,请分析以下部分收集的数据
- 识别和描述应用功能服务(参数“API 定义”)
- 识别和描述基础设施服务(参数“服务文档链接”)
映射到 OWASP 项目¶
数据泄露分析¶
实施技巧¶
要分析可能的数据泄露,请分析以下部分收集的数据
- 识别和描述数据资产
- 识别“服务到存储”关系
- 识别“服务到服务”同步通信
- 识别“服务到服务”异步通信
- 识别“资产到存储”关系
映射到 OWASP 项目¶
应用程序的信任边界、组件和重要数据流的论证¶
实施技巧¶
要验证所有应用程序信任边界、组件和重要数据流的文档和论证,请分析以下部分收集的数据
- 识别和描述应用功能服务
- 识别和描述基础设施服务
- 识别和描述数据存储
- 识别和描述消息队列
- 识别“服务到存储”关系
- 识别“服务到服务”同步通信
- 识别“服务到服务”异步通信
映射到 OWASP 项目¶
应用程序高级架构分析¶
实施技巧¶
要验证应用程序高级架构和所有连接的远程服务的定义和安全分析,请分析以下部分收集的数据
- 识别和描述应用功能服务
- 识别和描述基础设施服务
- 识别和描述数据存储
- 识别和描述消息队列
映射到 OWASP 项目¶
集中式安全控制验证的实施¶
实施技巧¶
要验证集中、简单(设计经济)、经过验证、安全且可重用的安全控制的实施,以避免重复、缺失、无效或不安全的控制,请分析“识别和描述基础设施服务”部分收集的数据。
映射到 OWASP 项目¶
最小权限原则的强制执行¶
实施技巧¶
要定义微服务所需的最低权限,请分析以下部分收集的数据
- 识别和描述应用功能服务(参数“API 定义”)
- 识别“服务到存储”关系
- 识别“服务到服务”同步通信
- 识别“服务到服务”异步通信
映射到 OWASP 项目¶
敏感数据识别和分类¶
实施技巧¶
要验证所有敏感数据是否已识别并分类为保护级别,请分析以下部分收集的数据
- 识别和描述数据资产
- 识别“资产到存储”关系
映射到 OWASP 项目¶
应用程序组件业务/安全功能验证¶
实施技巧¶
要验证所有应用程序组件在其提供的业务或安全功能方面的定义和文档,请分析以下部分(参数“简要描述”)收集的数据
- 识别和描述应用功能服务
- 识别和描述基础设施服务