使用证书管理器和 “让我们加 end-to-end密” 为 Amazon EKS 上的应用程序设置加密 - AWS Prescriptive Guidance

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

使用证书管理器和 “让我们加 end-to-end密” 为 Amazon EKS 上的应用程序设置加密

Mahendra Revanasiddappa 和 Vasanth Jeyaraj,Amazon Web Services

摘要

实施 end-to-end加密可能很复杂,您需要管理微服务架构中每项资产的证书。尽管您可以使用网络负载均衡器或 Amazon API Gateway 终止亚马逊网络服务 (AWS) 网络边缘的传输层安全 (TLS) 连接,但有些组织需要 end-to-end加密。

此模式使用 Nginx Ingress Controller 作为入口。这是因为当您创建 Kubernetes 入口时,入口资源使用网络负载均衡器。网络负载均衡器不允许上传客户端证书。因此,您无法通过 Kubernetes 入口实现双向 TLS。

这种模式旨在针对需要在其应用程序中所有微服务之间相互认证的组织。双向 TLS 减轻了用户名或密码的维护负担,还可以使用交钥匙安全框架。如果您的组织具有大量连接的设备或必须遵守严格的安全指南,则此模式的方法是兼容的。

这种模式通过对在 Amazon Elastic Kubernetes Service (Amazon EKS) 上运行的应用程序实施 end-to-end加密,有助于提高组织的安全状况。此模式在 Amazon EKS 存储库中的 GitHub End-to-end 加密中提供了示例应用程序和代码,以显示微服务如何在 Amazon EKS 上通过 end-to-end加密运行。该模式的方法使用 cert-manager(Kubernetes 的附加组件),将 Let 's Encrypt 作为证书颁发机构 (CA)。Let's Encrypt 是一款经济实惠的证书管理解决方案,它提供有效期为 90 天的免费证书。当在 Amazon EKS 上部署新的微服务时,CERT-MANAGER自动化证书的按需供应和旋转。 

目标受众

建议使用 Kubernetes、TLS、Amazon Route 53 和域名系统(DNS)的用户使用此模式。

先决条件和限制

先决条件

  • 一个有效的 Amazon Web Services account。

  • 现有 Amazon EKS 集群。

  • 已在 macOS、Linux 或 Windows 上安装和配置的 AWS 命令行界面(AWS CLI)1.7 或更高版本

  • kubectl 命令行实用程序,已安装并配置以便访问 Amazon EKS 集群。有关这方面的更多信息,请参阅 Amazon EKS 文档中的安装 kubectl

  • 用于测试应用程序的现有 DNS 名称。有关更多信息,请参阅 Amazon Route 53 文档中的使用 Amazon Route 53 注册域名。 

  • 最新 Helm 版本,安装在您的本地计算机上。有关这方面的更多信息,请参阅 Amazon EKS 文档和 Helm 存储库中的将 Hel GitHub m 与 Amazon EKS 配合使用。 

  • Amazon EKS 存储库上的 GitHub End-to-end 加密已克隆到您的本地计算机。 

  • 替换 Amazon EKS 存储库中克隆 GitHub End-to-end 加密policy.jsontrustpolicy.json文件中的以下值:

    • <account number> — 替换为您要在其中部署解决方案的账户的 Amazon Web Services account ID。 

    • <zone id> — 替换为域名的 Route 53 区域 ID。 

    • <node_group_role> – 替换为与 Amazon EKS 节点关联的 AWS Identity and Access Management(IAM) 角色的名称。

    • <namespace> — 替换为在其中部署 NGINX Ingress Controller和示例应用程序的 Kubernetes 命名空间。

    • <application-domain-name> — 替换为 Route 53 中的 DNS 域名。

限制

  • 该模式无法描述如何旋转证书,而仅演示如何在 Amazon EKS 上使用微服务的证书。 

架构

下图显示了此模式的工作流和体系结构组件。

使用证书管理器和让我们加密在 Amazon EKS 上为应用程序设置加密的工作流程。

图表显示了以下工作流:

  1. 客户端发送请求将应用程序访问到DNS名称。

  2. Route 53 记录为网络负载均衡器的别名记录。

  3. 网络负载均衡器将请求转发至配置了 TLS 侦听器的 NGINX Ingress Controller。NGINX Ingress Controller与网络负载均衡器之间的通信遵循 HTTPS 协议。

  4. NGINX Ingress Controller 根据客户端对应用程序服务的请求进行基于路径的路由。

  5. 应用程序服务将请求转发至应用程序容器组(pod)。该应用程序旨在通过调用秘密使用相同的证书。

  6. 容器组(pod)使用证书管理器证书运行示例应用程序。NGINX Ingress Controller 和容器组(pod)之间的通信使用 HTTPS。

注意:证书管理器在自己的命名空间运行。它使用 Kubernetes 集群角色来提供特定名称空间中的秘密证书。您可以将这些名称空间附加到应用程序容器组(pod)和 Nginx Ingress Controller。

工具

Amazon Web Services

其他工具

  • cert-manager 是 Kubernetes 的附加组件,用于请求证书、将证书分发到 Kubernetes 容器和自动续订证书。

  • NGINX Ingress Controller 是一款适用于 Kubernetes 和容器化环境中的云原生应用程序的流量管理解决方案。

操作说明

Task描述所需技能

在 Route 53 中创建一个公有托管区。

登录 AWS 管理控制台,打开 Amazon Route 53 控制台,选择托管区域,然后选择创建托管区域。创建公共托管区域,并记录区域 ID。有关更多信息,请参阅 Amazon Route 53 文档中的创建公有托管区

注意

ACME DNS01 使用 DNS 提供商发布质疑,要求证书管理器颁发证书。这项挑战要求您通过将特定值放在该域名下的TXT记录中来证明您控制域名的 DNS。在 Let's Encrypt 向您的 ACME 客户端提供令牌后,您的客户端会创建一条从该令牌和您的账户密钥派生的 TXT 记录,并将该记录置于 _acme-challenge.<YOURDOMAIN>。然后 Let's Encrypt 在 DNS 中查询此记录。如找到匹配项,则可以继续颁发证书。

AWS DevOps
Task描述所需技能

为证书管理器创建 IAM policy。

要求 IAM policy 为证书管理器提供许可,以验证您拥有53号公路域。A mazon EKS 存储库中的克隆 GitHub End-to-end 加密1-IAMRole目录中提供了policy.json示例 IAM 策略。

在 AWS CLI 中输入以下命令以创建 IAM policy。

aws iam create-policy \ --policy-name PolicyForCertManager \ --policy-document file://policy.json
AWS DevOps

为证书管理器创建 IAM 角色。

创建 IAM policy后,必须创建 IAM 角色。1-IAMRole 目录中提供了 trustpolicy.json 示例 IAM 角色。

在 AWS CLI 中输入以下命令以创建 IAM 角色。

aws iam create-role \ --role-name RoleForCertManager \ --assume-role-policy-document file://trustpolicy.json
AWS DevOps

将 策略附加到该角色。

在 AWS CLI 中输入以下命令以将 IAM policy 附加到 IAM 角色。将 AWS_ACCOUNT_ID 替换为您的 Amazon Web Services account 的 ID。

aws iam attach-role-policy \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/PolicyForCertManager \ --role-name RoleForCertManager
AWS DevOps
Task描述所需技能

部署 NGINX Ingress Controller。

使用 Helm 安装最新版nginx-ingress。在部署 nginx-ingress 配置之前,您可以根据自己的要求对其进行修改。此模式使用带注释的、面向内部的网络负载均衡器,该网络负载均衡器可在 5-Nginx-Ingress-Controller 目录中找到。 

通过从 5-Nginx-Ingress-Controller 目录中运行以下 Helm 命令来安装 NGINX Ingress Controller。

helm install test-nginx nginx-stable/nginx-ingress  -f  5-Nginx-Ingress-Controller/values_internal_nlb.yaml

AWS DevOps

验证 NGINX Ingress Controller 是否已安装。

输入 helm list命令。输出应显示 NGINX Ingress Controller 已安装。

AWS DevOps

创建 Route 53 A 记录。

创建指向 NGINX Ingress Controller 的网络负载均衡器的别名记录。

  1. 获取网络负载均衡器的 DNS 名称。有关说明,请参阅获取 ELB 负载均衡器的 DNS 名称

  2. 在 Amazon Route 53 控制台,选择托管区域

  3. 选择要在其中创建记录的公共托管区域,然后选择创建记录

  4. 输入记录的名称。 

  5. 记录类型中,选择 A-将流量路由到 IPv4 和一些 AWS 资源。  

  6. 启用别名

  7. 流量路由目标,执行以下操作:

    1. 选择网络负载均衡器的别名

    2. 选择部署网络负载均衡器的 AWS 区域。

    3. 输入网络负载均衡器的 DNS 名称。

  8. 选择创建记录

AWS DevOps
Task描述所需技能

部署 NGINX VirtualServer。

NGINX VirtualServer 资源是一种负载平衡配置,可以替代入口资源。创建 NGINX VirtualServer 资源的配置可在目录中的nginx_virtualserver.yaml文件中找到。6-Nginx-Virtual-Server在中输入以下命令kubectl以创建 NGINX 资源 VirtualServer 。

kubectl apply -f  nginx_virtualserver.yaml

重要

确保更新nginx_virtualserver.yaml文件中的应用程序域名、证书密钥和应用程序服务名称。

AWS DevOps

验证是否已创建 NGINX VirtualServer 。

在中输入以下命令kubectl以验证 NGINX VirtualServer 资源是否已成功创建。

kubectl get virtualserver

注意

验证该Host列是否与您的应用程序的域名相匹配。

AWS DevOps

在启用 TLS 的情况下部署 NGINX Web 服务器。

此模式使用启用了 TLS 的 NGINX Web 服务器作为测试 end-to-end加密的应用程序。部署测试应用程序所需配置文件可在 demo-webserver 目录中找到。 

kubectl 中输入以下命令以部署测试应用程序。

kubectl apply -f nginx-tls-ap.yaml

AWS DevOps

验证测试应用程序资源是否已创建。

kubectl 中输入以下命令,以验证是否为测试应用程序创建了所需资源:

  • kubectl get deployments

    注意

    验证Ready列和Available列。

  • kubectl get pods | grep -i example-deploy

    注意

    Pod 应处于running状态。

  • kubectl get configmap 

  • kubectl get svc 

AWS DevOps

验证应用程序。

  1. <application-domain-name> 替换为您之前创建的 Route53 DNS 名称,输入以下命令。

    curl --verbose https://<application-domain-name>

  2. 验证您是否可访问应用程序。

AWS DevOps

相关资源

AWS 资源

其他资源