微服务架构越来越多地用于在基于云的和本地基础设施、大规模应用程序和服务中设计和实现应用程序系统。在应用程序设计和实施阶段需要解决许多安全挑战。在设计阶段必须解决的基本安全要求是身份验证和授权。因此,对于应用程序安全架构师来说,理解和正确使用现有架构模式在基于微服务的系统中实现身份验证和授权至关重要。本备忘单的目标是识别此类模式,并为应用程序安全架构师提供有关使用它的可能方式的建议。
在简单的场景中,授权只能发生在边缘级别(API 网关)。API 网关可用于集中执行所有下游微服务的授权,无需为每个单独的服务提供身份验证和访问控制。在这种情况下,NIST 建议实施缓解控制,例如相互身份验证,以防止与内部服务的直接匿名连接(API 网关绕过)。需要注意的是,边缘层的授权有以下限制:
在大多数情况下,开发团队在两个地方都实施授权——在边缘级别,在粗略的粒度级别和服务级别。验证外部实体边缘可以使用通过 HTTP 标头(例如“Cookie”或“授权”)传输的访问令牌(引用令牌或自包含令牌)或使用 mTLS。
服务级别授权为每个微服务提供了更多控制权来执行访问控制策略。为了进一步讨论,我们使用符合NIST SP 800-162的术语和定义。门禁系统的功能组件可分为以下几种方式:
开发团队直接在微服务代码级别实现 PDP 和 PEP。所有访问控制规则以及需要实现该规则的属性都定义并存储在每个微服务上(步骤 1)。当微服务收到(步骤 2)请求以及一些授权元数据(例如,最终用户上下文或请求的资源 ID)时,微服务对其进行分析(步骤 3)以生成访问控制策略决策,然后执行授权(步骤 4)。
现有的编程语言框架允许开发团队在微服务层实现授权。例如,Spring Security 允许开发人员在资源服务器中启用范围检查(例如,使用从传入 JWT 中提取的范围)并使用它来强制授权。在源代码级别实现授权意味着无论何时开发团队想要修改授权逻辑,都必须更新代码。
在该模式中,访问控制规则被集中定义、存储和评估。访问控制规则使用 PAP 定义(步骤 1)并交付给集中式 PDP 以及需要实施该规则的属性(步骤 2)。当主体调用微服务端点(步骤 3)时,微服务代码通过网络调用调用集中式 PDP,PDP 通过根据访问控制规则和属性评估查询输入来生成访问控制策略决策(步骤 4)。基于 PDP 决策微服务强制授权(步骤 5)。
要定义访问控制规则,开发/运营团队必须使用某种语言或符号。一个例子是可扩展访问控制标记语言 (XACML) 和下一代访问控制 (NGAC),它是实现策略规则描述的标准。由于远程 PDP 端点的额外网络调用,这种模式会严重影响延迟,但可以通过在微服务级别缓存授权策略决策来缓解这种情况。值得一提的是,由于弹性和可用性问题,PDP 必须在高可用性模式下运行。应用程序安全架构师应将其与其他模式(例如,API 网关级别的授权)结合起来,以实施“纵深防御”原则。
在该模式中,访问控制规则是集中定义的,但在微服务级别存储和评估。访问控制规则使用 PAP 定义(步骤 1)并交付给嵌入式 PDP 以及需要实施该规则的属性(步骤 2)。当主体调用微服务端点(步骤 3)时,微服务代码调用 PDP,PDP 通过根据访问控制规则和属性评估查询输入来生成访问控制策略决策(步骤 4)。基于 PDP 决策微服务强制授权(步骤 5)。
在这种情况下,PDP 代码可以实现为微服务内置库或服务网格架构中的 sidecar。由于可能的网络/主机故障和网络延迟,建议在具有微服务的同一主机上将嵌入式 PDP 实现为微服务库或 sidecar。嵌入式 PDP 通常将授权策略和与策略相关的数据存储在内存中,以最大限度地减少授权执行期间的外部依赖性并获得低延迟。与缓存方法的“单一策略决策点的集中模式”的主要区别在于授权决策不存储在微服务端,而是将最新的授权策略存储在微服务端。应该提到的是,缓存授权决策可能会导致应用过时的授权规则和访问控制违规。呈现的网络修复 (link , link ) 一个使用“Centralized Pattern with Embedded PDP”模式实现微服务级别授权的真实案例。
要在微服务级别做出精细授权决策,微服务必须了解调用者上下文(例如用户 ID、用户角色/组)。为了允许内部服务层强制执行授权,边缘层必须将经过身份验证的外部实体身份(例如,最终用户上下文)连同对下游微服务的请求一起传播。传播外部实体身份的最简单方法之一是重用边缘接收到的访问令牌并将其传递给内部微服务。应该提到的是,由于可能存在外部访问令牌泄漏,这种方法非常不安全,并且可能会减少攻击面,因为通信依赖于基于专有令牌的系统实现,并且内部微服务必须了解外部访问令牌。这种模式也不是外部访问令牌不可知的,即
在这种方法中,调用微服务从传入的请求中提取外部实体身份(例如,通过解析传入的访问令牌),创建带有上下文的数据结构(例如 JSON 或自签名 JWT),并将其传递给内部微服务。在这种情况下,接收者微服务必须信任调用微服务——如果调用微服务想要违反访问控制规则,它可以通过将任何用户/客户端 ID 或用户角色设置为 HTTP 标头来实现。该方法适用于高度可信的环境,其中每个微服务都是由可信的开发团队根据安全的软件开发实践开发的。
在此模式中,在边缘层的身份验证服务对外部请求进行身份验证后,代表外部实体身份的数据结构(例如,包含的用户 ID、用户角色/组或权限)由受信任的颁发者生成、签名或加密并传播到内部微服务。
Netflix 展示了一个使用该模式的真实案例:名为“Passport”的结构包含用户 ID 及其属性,并且在边缘级别为每个传入请求创建受 HMAC 保护的结构,传播到内部微服务并且从不暴露于外部:
应该提到的是,模式与外部访问令牌无关,并且允许将外部实体及其内部表示解耦。
在 mTLS 方法中,除了实现传输数据的机密性和完整性之外,每个微服务都可以合法地识别它与谁交谈。部署中的每个微服务都必须携带一个公钥/私钥对,并使用该密钥对通过 mTLS 对接收方微服务进行身份验证。 mTLS 通常使用自托管的公钥基础设施来实现。使用 mTLS 的主要挑战是:密钥配置和信任引导、证书撤销和密钥轮换。
基于令牌的方法适用于应用层。Token 是一个容器,可能包含调用者 ID(微服务 ID)及其权限(范围)。调用者微服务可以通过使用自己的服务 ID 和密码调用特殊的安全令牌服务来获取签名令牌,然后将其附加到每个传出请求,例如通过 HTTP 标头。被调用的微服务可以提取令牌并在线或离线验证它。
基于微服务的系统中的日志服务旨在满足问责制和可追溯性的原则,并通过日志分析帮助检测操作中的安全异常。因此,对于应用程序安全架构师来说,了解并充分利用现有架构模式在基于微服务的系统中实现审计日志记录以进行安全操作至关重要。高级架构设计如下图所示,基于以下原则:
下面列出了对日志子系统架构及其基本原理的高级建议。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。