为在 Amazon EKS 上运行的应用程序配置双向 TLS 身份验证 - AWS Prescriptive Guidance

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

为在 Amazon EKS 上运行的应用程序配置双向 TLS 身份验证

由 Mahendra Siddappa (AWS) 编写

摘要

基于证书的传输层安全性协议(TLS)是一个可选的 TLS 组件,可在服务器和客户端之间提供双向对等身份验证。使用双向 TLS,客户端必须在会话协商过程中提供 X.509 证书。服务器使用此证书来识别和验证客户端。

双向 TLS 是物联网 (IoT) 应用的常见要求,可用于开放银行等 business-to-business应用或标准。

此模式描述如何使用 NGINX 入口控制器为运行在 Amazon Elastic Kubernetes Service(Amazon EKS)集群上的应用程序配置双向 TLS。您可以通过注释入口资源来为 NGINX 入口控制器启用内置的双向 TLS 功能。有关 NGINX 控制器上双向 TLS 注释的更多信息,请参阅 Kubernetes 文档中的客户端证书身份验证

重要

此模式使用自签名证书。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。如果您想在生产环境中使用此模式,则可以使用 AWS 私有证书颁发机构(AWS Private CA)或您现有的公有密钥基础设施(PKI)标准来颁发私有证书。

先决条件和限制

先决条件

  • 一个 Amazon Web Services(AWS)有效账户。

  • 现有 Amazon EKS 集群。

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

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

  • 用于测试应用程序的现有域名系统(DNS)名称。

限制

  • 此模式使用自签名证书。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。

架构

为在 Amazon EKS 上运行的应用程序配置双向 TLS 身份验证

技术堆栈

  • Amazon EKS

  • Amazon Route 53

  • Kubectl

工具

操作说明

Task描述所需技能

生成 CA 密钥和证书。

通过运行以下命令生成证书颁发机构(CA)密钥和证书。

openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Test Cert Authority'
DevOps 工程师

生成服务器密钥和证书,并使用 CA 证书进行签名。

通过运行以下命令生成服务器密钥和证书,并使用 CA 证书进行签名。

openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN= <your_domain_name> ' && openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
重要

请务必使用现有域名<your_domain_name>进行替换。

DevOps 工程师

生成客户端密钥和证书,并使用 CA 证书进行签名。

通过运行以下命令生成客户端密钥和证书,并使用 CA 证书进行签名。

openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Test' && openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
DevOps 工程师
Task描述所需技能

将 NGINX 入口控制器部署到 Amazon EKS 集群中。

使用以下命令部署 NGINX 入口控制器。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml
DevOps 工程师

验证 NGINX 入口控制器服务正在运行。

使用以下命令验证 NGINX 入口控制器服务正在运行。

kubectl get svc -n ingress-nginx
重要

确保服务字段地址包含网络负载均衡器的域名。

DevOps 工程师
Task描述所需技能

在 Amazon EKS 集群中创建命名空间。

通过运行以下命令在 Amazon EKS 集群中创建名为 mtls 的命名空间。

kubectl create ns mtls

这将部署示例应用程序来测试双向 TLS。

DevOps 工程师
Task描述所需技能

在 mtls 命名空间中创建 Kubernetes 部署和服务。

创建一个名为 mtls.yaml的文件。将以下代码粘贴到该文件中。

kind: Deployment apiVersion: apps/v1 metadata: name: mtls-app labels: app: mtls spec: replicas: 1 selector: matchLabels: app: mtls template: metadata: labels: app: mtls spec: containers: - name: mtls-app image: hashicorp/http-echo args: - "-text=mTLS is working" --- kind: Service apiVersion: v1 metadata: name: mtls-service spec: selector: app: mtls ports: - port: 5678 # Default port for image

通过运行以下命令在 mtls 命名空间中创建 Kubernetes 部署和服务。

kubectl create -f mtls.yaml -n mtls
DevOps 工程师

验证已创建 Kubernetes 部署。

运行以下命令验证部署是否已创建,且有一个容器组(pod)处于可用状态。

kubectl get deploy -n mtls
DevOps 工程师

验证是否已创建 Kubernetes 服务。

通过运行以下命令验证是否已创建 Kubernetes 服务。

kubectl get service -n mtls
DevOps 工程师
Task描述所需技能

创建入口资源的密钥。

运行以下命令,使用您之前创建的证书为 NGINX 入口控制器创建密钥。

kubectl create secret generic mtls-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt -n mtls

您的密钥有一个服务器证书供客户端识别服务器,还有一个 CA 证书供服务器验证客户端证书。

DevOps 工程师
Task描述所需技能

在 mtls 命名空间中创建入口资源。

创建一个名为 ingress.yaml的文件。将以下代码粘贴到文件中(将 <your_domain_name> 替换为现有域名)。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: mtls/mtls-certs name: mtls-ingress spec: ingressClassName: nginx rules: - host: "*.<your_domain_name>" http: paths: - path: / pathType: Prefix backend: service: name: mtls-service port: number: 5678 tls: - hosts: - "*.<your_domain_name>" secretName: mtls-certs

通过运行以下命令以在 mtls 命名空间中创建入口资源。

kubectl create -f ingress.yaml -n mtls

这意味着 NGINX 入口控制器可以将流量路由到示例应用程序。

DevOps 工程师

验证入口资源是否已创建。

通过运行以下命令验证是否已创建入口资源。

kubectl get ing -n mtls
重要

确保入口资源的地址显示为 NGINX 入口控制器创建的负载均衡器。

DevOps 工程师
Task描述所需技能

创建指向 NGINX 入口控制器的负载均衡器的 CNAME 记录。

登录 AWS 管理控制台,打开 Amazon Route 53 控制台,然后创建将 mtls.<your_domain_name> 指向 NGINX 入口控制器的负载均衡器的规范名称(CNAME)记录。

有关更多信息,请参阅 Route 53 文档中的使用 Route 53 控制台创建记录

DevOps 工程师
Task描述所需技能

在没有证书的情况下测试双向 TLS 设置。

运行以下命令。

curl -k https://mtls.<your_domain_name>

您应该收到“400 未发送必需的 SSL 证书”错误响应。

DevOps 工程师

在有证书的情况下测试双向 TLS 设置。

运行以下命令。

curl -k https://mtls.<your_domain_name> --cert client.crt --key client.key

您应该收到“mTLS 正在运行”的响应。

DevOps 工程师

相关资源