使用双向 TLS 访问私有 Amazon API 网关 API 计算博客

使用互信 TLS 消耗私有 Amazon API Gateway API

文章重点

互信 TLS (mTLS) 提供双向身份验证,增强安全性。使用 Application Load Balancer (ALB) 可以简化 mTLS 的实施流程。支持私有的自定义域名,并可配置证书撤销列表,以增强安全性。通过这种方式,提升了私有 API 的安全性和便利性。

在本文中,我们将探讨如何使用互信 TLSmTLS来安全地消耗私有 Amazon API Gateway API。mTLS 是一种先进的安全协议,通过证书进行双向身份验证,确保客户端和伺服器的身份有效且可信。这对于在 AWS 中跨帐号运作的企业特别重要,因为它们希望在虚拟专用云VPC中安全地连接。

mTLS 的工作原理

mTLS 通过以下过程确保安全连接:

客户端连接到伺服器。伺服器展示其证书并供客户端验证。客户端展示其证书并由伺服器验证。建立加密的 TLS 连接。

这一过程可防止中间人攻击、数据拦截和篡改,为重要数据的传输提供了额外的安全层。虽然使用 mTLS 会增加证书管理的开销,但对于处理敏感数据的应用来说,这额外的安全性至关重要。

Application Load Balancer 的 mTLS 配置

要在新建或现有的 Application Load Balancer 上启用 mTLS,你可以选择两种配置模式:

通过模式:客户端证书链作为 XAmznMtlsClientcert HTTP 标头传递,应用程序根据其进行授权验证。

使用信任存储进行验证模式:此模式下,负载均衡器会验证客户端证书并只允许提供受信任证书的客户端连接。这一方法简化了管理并减少了后端应用的负担。

以下是使用 AWS 私有证书授权机构配置信任存储的步骤:

创建一个 AWS 私有证书授权机构,指定常见名称 (CN) 为你用来托管应用程序的域名例如,apiexamplecom。将 CA 导出并上传到 Amazon S3 桶中。创建并配置信任存储,指向先前上传的证书。更新 ALB 的监听器以使用这个信任存储并选择所需的 mTLS 验证行为。生成客户端应用的证书并进行管理。

详细流程可以参考 使用 ACM 私有证书授权机构进行 Amazon API Gateway 互信 TLS。

使用 ALB 与 API Gateway 的 mTLS 验证

利用 ALB 的“使用信任存储进行验证”模式,可以实现私有 API Gateway 的 mTLS,减少自我管理代理服务的运营负担。

这一模式能够支持同一 AWS 帐号内或跨帐号的 API Gateway 访问。

在 VPC 内的客户端可以通过调用 ALB 的 URL 来消耗私有 API Gateway。ALB 被配置为在将请求转发至 API Gateway 之前,验证提供的客户端证书。

如果证书无效,API Gateway 将永远不会接收到请求。

为了进一步加强安全性,可以在 ALB 的信任存储中配置证书撤销列表,这使得在证书到期之前,你可以撤销和作废已发出的证书。

使用私有 API Gateway 的 mTLS 流程范例

客户端请求的流动过程如下:

客户端向生产者 API 端点发送请求。请求通过 AWS PrivateLink 路由到消费者帐号的网络负载均衡器。网络负载均衡器使用 Application Load Balancer 类型的目标组。ALB 监听器配置为在验证信任存储模式下使用 mTLS。准许决策是根据客户端证书与信任存储中的证书链进行比较。如果客户端证书被允许,请求将路由至 API Gateway。

以下是发送有效证书的成功请求的示例响应:

飞鸟机场

使用双向 TLS 访问私有 Amazon API 网关 API 计算博客

bashcurl key myclientkey cert myclientpem https//apiexamplecom/widgets {id1value499}

若发送无效证书,则得到的响应为:

bashcurl (35) Recv failure Connection reset by peer

自定义域名的支持

一个额外的好处是 ALB 支持私有自定义域名,而私有 API Gateway 端点目前不支持自定义域名。因此,客户端首先连接到支持自定义域名的 ALB 端点。

总结

这篇文章探讨了如何为私有 API Gateway 端点提供互信 TLS 认证。通过利用 Application Load Balancer 现在支持的原生 mTLS,这一模式简化了架构并实现了集中的边缘身份验证,从而提升了私有 API 的安全性。

随著安全控制在云端服务架构中日益重要,企业应更加重视互信验证及逐步提高的安全性控制。要开始实施,可以访问 GitHub 库 获取示例代码。

有关无伺服器学习的更多资源,请访问 Serverless Land。