双向 TLS 身份验证 - AWS App Mesh

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

双向 TLS 身份验证

双向 TLS(传输层安全)身份验证是 TLS 的可选组件,可提供双向对等身份验证。双向 TLS 身份验证在 TLS 的基础上增加了一层安全性,并允许您的服务验证正在建立连接的客户端。

客户端-服务器关系中的客户端还在会话协商过程中提供 X.509 证书。服务器使用此证书来识别和验证客户端。此过程有助于验证证书是否由可信证书颁发机构 (CA) 颁发,以及该证书是否为有效证书。它还使用证书上的主题备用名称 (SAN) 来识别客户端。

您可以为 AWS App Mesh 支持的所有协议启用双向 TLS 身份验证。它们是 TCP、HTTP/1.1、HTTP/2、gRPC。

注意

使用 App Mesh,您可以为来自您的服务的 Envoy 代理之间的通信配置双向 TLS 身份验证。但是,您的应用程序与 Envoy 代理之间的通信未加密。

双向 TLS 身份验证

AWS App Mesh 支持双向 TLS 身份验证的两种可能的证书来源。TLS 客户端策略中的客户端证书和侦听器 TLS 配置中的服务器验证可以从以下来源获取:

  • 文件系统 - 来自正在运行的 Envoy 代理的本地文件系统的证书。要向 Envoy 分发证书,您需要提供证书链的文件路径和 App Mesh API 的私钥。

  • Envoy 密钥发现服务 (SDS) – 自带 sidecar,用于实现 SDS 并允许向 Envoy 发送证书。它们包括 SPIFFE 运行时系统环境 (SPIRE)。

重要

App Mesh 不存储用于双向 TLS 身份验证的证书或私钥。相反,Envoy 会将它们存储在内存中。

配置网格端点

为您的网格端点(例如虚拟节点或网关)配置双向 TLS 身份验证。这些端点提供证书并指定可信机构。

为此,您需要为客户端和服务器配置 X.509 证书,并在 TLS 终止和 TLS 来源的验证上下文中明确定义可信机构证书。

网格内部的信任

服务器端证书在虚拟节点侦听器(TLS 终止)中配置,客户端证书在虚拟节点服务后端(TLS 发起)中配置。作为此配置的替代方案,您可以为虚拟节点的所有服务后端定义默认的客户端策略,然后,如果需要,可以根据需要为特定后端覆盖此策略。虚拟网关只能使用适用于其所有后端的默认客户端策略进行配置。

您可以通过为两个网格的虚拟网关上的入站流量启用双向 TLS 身份验证来配置不同网格之间的信任。

网格之外的信任

在虚拟网关侦听器中指定服务器端证书以终止 TLS。配置与您的虚拟网关通信的外部服务以提供客户端证书。证书应派生自服务器端证书在虚拟网关侦听器上用于发起 TLS 的相同证书颁发机构 (CA)。

将服务迁移到双向 TLS 身份验证

在 App Mesh 中将现有服务迁移到双向 TLS 身份验证时,请遵循以下准则以保持连接。

迁移服务通过明文进行通信
  1. 在服务器端点上启用 TLS 配置 PERMISSIVE 模式。此模式允许纯文本流量连接到终端节点。

  2. 在服务器上配置双向 TLS 身份验证,指定服务器证书、信任链以及可选的可信 SAN。

  3. 确认通信是通过 TLS 连接进行的。

  4. 在您的客户端上配置双向 TLS 身份验证,指定客户端证书、信任链以及可选的可信 SAN。

  5. 在服务器上启用 TLS 配置的 STRICT 模式。

迁移通过 TLS 通信的服务
  1. 在您的客户端上配置双向 TLS 设置,指定客户端证书和可信的 SAN(可选)。直到后端服务器请求客户端证书后,才会将其发送到其后端。

  2. 在服务器上配置双向 TLS 设置,指定信任链和可信的 SAN(可选)。为此,您的服务器会请求客户端证书。

双向 TLS 身份验证

您可以参阅传输层安全:验证加密文档,了解 Envoy 究竟是如何发出与 TLS 相关的统计数据的。对于双向 TLS 身份验证,您应该检查以下统计信息:

  • ssl.handshake

  • ssl.no_certificate

  • ssl.fail_verify_no_cert

  • ssl.fail_verify_san

以下两个统计示例共同表明,成功端接到虚拟节点的 TLS 连接都来自提供证书的客户端。

listener.0.0.0.0_15000.ssl.handshake: 3
listener.0.0.0.0_15000.ssl.no_certificate: 0

下一个统计数据示例显示,从虚拟客户端节点(或网关)到后端虚拟节点的连接失败。服务器证书中显示的主题备用名称 (SAN) 与客户端信任的任何 SAN 都不匹配。

cluster.cds_egress_my-mesh_my-backend-node_http_9080.ssl.fail_verify_san: 5

App Mesh 双向 TLS 身份验证演练