传输层安全性 (TLS) - Amazon App Mesh
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

传输层安全性 (TLS)

重要

此功能在中国区域中不可用。

在 App Mesh 中,传输层安全 (TLS) 加密部署在计算资源上的 Envoy 代理之间的通信,这些代理在 App Mesh 中由网格端点表示,例如虚拟节点虚拟网关. 代理协商并终止 TLS。当代理与应用程序一起部署时,您的应用程序代码不负责协商 TLS 会话。代理代表您的应用程序协商 TLS。

App Mesh 允许您通过以下方式向代理提供 TLS 证书:

  • 来自的私有证书Amazon Certificate Manager(ACM) 由Amazon Certificate Manager Private Certificate Authority(ACM PCA)。

  • 存储在虚拟节点本地文件系统上的证书,由您自己的证书颁发机构 (CA) 颁发

  • 由密钥发现服务 (SDS) 端点通过本地 Unix 域套接字提供的证书。

Envoy 代理授权必须为由网状端点表示的已部署 Envoy 代理启用。我们建议在启用代理授权时,将访问权限限制在启用加密的网状端点上。

证书要求

证书上的主题备用名称 (SAN) 之一必须符合特定标准,具体取决于如何发现网状端点所代表的实际服务。

  • DNS— 其中一个证书 SAN 必须与 DNS 服务发现设置中提供的值相匹配。对于具有服务发现名称的应用程序mesh-endpoint.apps.local,您可以创建与该名称匹配的证书,也可以创建带有通配符的证书*.apps.local.

  • Amazon Cloud Map— 其中一个证书 SAN 必须与中提供的值相匹配Amazon Cloud Map使用以下格式的服务发现设置service-name.namespace-name. 对于带有Amazon Cloud MapServiceName 的服务发现设置mesh-endpoint和 namespaceNameapps.local,您可以创建与名称匹配的证书mesh-endpoint.apps.local,或带有通配符的证书*.apps.local.

对于这两种发现机制,如果没有一个证书 SAN 与 DNS 服务发现设置匹配,则 Envoy 之间的连接将失败并显示以下错误消息,如客户端 Envoy 所示。

TLS error: 268435581:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

TLS 身份验证证书

使用 TLS 身份验证时,App Mesh 支持多个证书来源。

ACM PCA

证书必须存储在同一区域的 ACM 中Amazon账户作为将使用证书的网格端点。CA 的证书不必相同Amazon账户,但它仍然需要与网格端点位于同一个区域。如果您没有 ACM 私有 CA,则必须创建一个然后才能向其申请证书。有关使用 ACM 请求现有 ACM PCA 证书的更多信息,请参阅请求私有证书. 该证书不能是公共证书。

用于 TLS 客户端策略的私有 CA 必须是根 CA。

要使用来自 ACM PCA 的证书和 CA 配置虚拟节点,您用来调用 App Mesh 的委托人(例如用户或角色)必须具有以下 IAM 权限:

  • 对于您添加到侦听器的 TLS 配置中的任何证书,委托人必须具有acm:DescribeCertificate权限。

  • 对于在 TLS 客户端策略上配置的任何 CA,委托人必须具有acm-pca:DescribeCertificateAuthority权限。

重要

与其他账户共享 CA 可能会向 CA 授予这些账户意外权限。我们建议使用基于资源的策略将访问权限限制为acm-pca:DescribeCertificateAuthorityacm-pca:GetCertificateAuthorityCertificate适用于不需要颁发 CA 证书的账户。

您可以将这些权限添加到附加到委托人的现有 IAM 策略中,或者创建新的委托人和策略并将该策略附加到委托人。有关更多信息,请参阅 。编辑 IAM polic,创建 IAM 策略,以及添加 IAM 身份权限.

注意

您需要为每个 ACM PCA 的运行支付月费,直到将其删除。您还需要为每月颁发的私有证书和导出的私有证书付费。有关更多信息,请参阅 Amazon Certificate Manager 定价

当你启用时代理授权对于网状终端节点代表的 Envoy 代理,必须为您使用的 IAM 角色分配以下 IAM 权限:

  • 对于在虚拟节点的侦听器上配置的任何证书,该角色必须具有acm:ExportCertificate权限。

  • 对于在 TLS 客户端策略上配置的任何 CA,角色必须具有acm-pca:GetCertificateAuthorityCertificate权限。

文件系统

您可以使用文件系统向 Envoy 分发证书。您可以通过在文件路径上提供证书链和相应的私钥来实现此目的。这样,就可以通过 Envoy sidecar 代理访问这些资源。

特使的秘密发现服务 (SDS)

Envoy 通过密钥发现协议从特定端点获取 TLS 证书等机密。有关此协议的更多信息,请参阅 Envoy 的SDS 文档.

当 SDS 充当证书和证书链的来源时,App Mesh 将 Envoy 代理配置为使用代理本地的 Unix 域套接字作为秘密发现服务 (SDS) 端点。您可以使用配置此端点的路径APPMESH_SDS_SOCKET_PATH环境变量。

重要

App Mesh Envoy 代理版本 1.15.1.0 及更高版本支持使用 Unix 域套接字的本地机密发现服务。

App Mesh 支持使用 gRPC 的 V2 SDS 协议。

与 SPIFFE 运行时环境 (SPIRE) 集成

你可以使用 SDS API 的任何 sidecar 实现,包括现有的工具链,例如SPIFFE 运行时环境 (SPIRE). SPIRE 旨在支持在分布式系统中的多个工作负载之间部署双向 TLS 身份验证。它证明了运行时工作负载的身份。SPIRE 还为工作负载直接提供特定工作负载的、短期的、自动轮换的密钥和证书。

您应该将 SPIRE 代理配置为 Envoy 的 SDS 提供商。允许它直接向 Envoy 提供提供双向 TLS 身份验证所需的密钥材料。在 Envoy 代理旁边的边车中运行 SPIRE 特工。代理负责根据需要重新生成短期密钥和证书。代理对 Envoy 进行认证,并确定在 Envoy 连接到 SPIRE 代理公开的 SDS 服务器时应向 Envoy 提供哪些服务身份和 CA 证书。

在此过程中,服务身份和 CA 证书将轮换,更新将传回 Envoy。Envoy 立即将其应用于新连接,不会出现任何中断或停机,私钥也不会触及文件系统。

  • Amazon Certificate Manager–Amazon Certificate Manager Private Certificate Authority(ACM PCA) 可以与 SPIRE 一起使用,用作上游证书颁发机构。通过使用私有证书颁发机构 (PCA),CA 的私钥是基于硬件的,不存储在内存或磁盘上。这增加了一层额外的安全保护。有关更多信息,请参阅 。SPIRE 文档.

App Mesh 如何配置 Envoy 以协商 TLS

在确定如何配置网格中 Envoy 之间的通信时,App Mesh 使用客户端和服务器的网状端点配置。

使用客户政策

当客户端策略强制使用 TLS,并且客户端策略中的一个端口与服务器策略的端口匹配时,客户端策略用于配置客户端的 TLS 验证上下文。例如,如果虚拟网关的客户端策略与虚拟节点的服务器策略相匹配,则将尝试使用虚拟网关的客户端策略中定义的设置在代理之间进行 TLS 协商。如果客户端策略与服务器策略的端口不匹配,则代理之间的 TLS 可能会协商,也可能不进行协商,具体取决于服务器策略的 TLS 设置。

没有客户政策

如果客户端尚未配置客户端策略,或者客户端策略与服务器的端口不匹配,App Mesh 将使用服务器来确定是否与客户端协商 TLS 以及如何协商。例如,如果虚拟网关未指定客户端策略,且虚拟节点未配置 TLS 终止,则不会在代理之间协商 TLS。如果客户端未指定匹配的客户端策略,并且服务器已配置为 TLS 模式STRICT要么PERMISSIVE,代理将被配置为协商 TLS。根据为 TLS 终止提供证书的方式,以下附加行为适用。

  • ACM 管理的 TLS 证书— 当服务器使用 ACM 管理的证书配置 TLS 终止时,App Mesh 会自动将客户端配置为协商 TLS,并根据证书链的根 CA 对证书进行验证。

  • 基于文件的 TLS 证书— 当服务器使用来自代理的本地文件系统的证书配置 TLS 终止时,App Mesh 会自动将客户端配置为协商 TLS,但服务器的证书未经过验证。

主题备用名称

您可以选择指定要信任的主题备用名称 (SAN) 列表。SAN 必须采用 FQDN 或 URI 格式。如果提供了 SAN,Envoy 将验证所提供证书的主题备用名称是否与该列表中的其中一个名称相匹配。

如果您没有在终止网格端点上指定 SAN,则该节点的 Envoy 代理不会验证对等客户端证书上的 SAN。如果您没有在起源网格端点上指定 SAN,则终止端点提供的证书上的 SAN 必须与网格端点服务发现配置匹配。

有关更多信息,请参阅 App MeshTLS:证书要求.

重要

如果将 TLS 的客户端策略设置为,则只能使用通配符 SANnot enforced. 如果将客户端虚拟节点或虚拟网关的客户端策略配置为强制执行 TLS,则它不能接受通配符 SAN。

验证加密

启用 TLS 后,您可以查询 Envoy 代理以确认通信已加密。Envoy 代理发布资源统计信息,可帮助您了解 TLS 通信是否正常。例如,Envoy 代理会记录其为指定网格端点协商的成功的 TLS 握手次数的统计信息。确定名为的网格端点有多少次成功的 TLS 握手my-mesh-endpoint使用以下命令。

curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep ssl.handshake

在以下示例返回的输出中,网格端点进行了三次握手,因此通信是加密的。

listener.0.0.0.0_15000.ssl.handshake: 3

当 TLS 协商失败时,Envoy 代理也会发出统计信息。确定网格端点是否存在 TLS 错误。

curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep -e "ssl.*\(fail\|error\)"

在返回的输出示例中,多个统计数据没有错误,因此 TLS 协商成功。

listener.0.0.0.0_15000.ssl.connection_error: 0 listener.0.0.0.0_15000.ssl.fail_verify_cert_hash: 0 listener.0.0.0.0_15000.ssl.fail_verify_error: 0 listener.0.0.0.0_15000.ssl.fail_verify_no_cert: 0 listener.0.0.0.0_15000.ssl.ssl.fail_verify_san: 0

有关 Envoy TLS 统计数据的更多信息,请参阅特使监听器统计信息.

证书续订

ACM PCA

当您使用 ACM 续订证书时,续订后的证书将在续订完成后的 35 分钟内自动分发给您连接的代理。我们建议使用托管续订在证书有效期即将结束时自动续订证书。有关更多信息,请参阅 。ACM 亚马逊颁发的证书的托管续订在Amazon Certificate Manager用户指南。

您自己的证书

使用来自本地文件系统的证书时,Envoy 不会在证书更改时自动重新加载证书。您可以重新启动或重新部署 Envoy 进程来加载新证书。您还可以在不同的文件路径上放置较新的证书,并使用该文件路径更新虚拟节点或网关配置。

将 Amazon ECS 工作负载配置为使用 TLS 身份验证Amazon App Mesh

您可以将网格配置为使用 TLS 身份验证。确保您添加到工作负载中的 Envoy 代理边车可以使用证书。你可以将 EBS 或 EFS 卷附加到你的 Envoy 边车,也可以存储和检索来自的证书AmazonSecrets Manager。

  • 如果您使用基于文件的证书分发,请将 EBS 或 EFS 卷附加到您的 Envoy 边车。确保证书和私钥的路径与中配置的路径相匹配Amazon App Mesh.

  • 如果您使用的是基于 SDS 的发行版,请添加一辆实现 Envoy 的 SDS API 并具有证书访问权限的辅助车。

注意

亚马逊 ECS 不支持 SPIRE。

将 Kubernetes 工作负载配置为使用 TLS 身份验证Amazon App Mesh

您可以配置Amazon App MeshKubernetes 控制器,用于为虚拟节点和虚拟网关服务后端和侦听器启用 TLS 身份验证。确保您添加到工作负载中的 Envoy 代理边车可以使用证书。您可以在中查看每种分布类型的示例演练双向 TLS 认证部分。

  • 如果您使用基于文件的证书分发,请将 EBS 或 EFS 卷附加到您的 Envoy 边车。确保证书和私钥的路径与控制器中配置的路径相匹配。或者,你可以使用安装在文件系统上的 Kubernetes 密钥。

  • 如果您使用基于 SDS 的分发,则应设置一个实现 Envoy 的 SDS API 的节点本地 SDS 提供商。特使将通过 UDS 找到它。在 EKS 中启用基于 SDS 的 MTL 支持 AppMesh 控制器,设置enable-sdsflag到true并通过以下方式向控制器提供本地 SDS 提供商的 UDS 路径sds-uds-pathflags。如果你使用 helm,你可以在控制器安装过程中设置它们:

    --set sds.enabled=true
注意

如果你在 Fargate 模式下使用Amazon Elastic Kubernetes Service(亚马逊 EKS),你将无法使用 SPIRE 分发证书。