為在 Amazon EKS 上執行的應用程式設定相互 TLS 身份驗證 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為在 Amazon EKS 上執行的應用程式設定相互 TLS 身份驗證

創建者:馬亨德拉·西達帕 (AWS)

環境:PoC 或試點

技術: DevOps; 安全性,身份,合規性

AWS 服務:Amazon EKS;Amazon Route 53

Summary

憑證型相互傳輸層安全性 (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 Command Line Interface (AWS CLI) (AWS CLI) 1.7 版或更新版本,可在 macOS、Linux 或視窗上安裝和設定。

  • kubectl 命令列公用程式已安裝並設定為存取 Amazon EKS 叢集。如需這方面的詳細資訊,請參閱 Amazon EKS 文件中的安裝 kubectl

  • 用於測試應用程式的現有網域名稱系統 (DNS) 名稱。

限制

  • 此模式使用自我簽署憑證。我們建議您僅在測試叢集中使用此模式,而不要在生產環境中使用。

架構

為在 Amazon EKS 上執行的應用程式設定相互 TLS 身份驗證

技術堆疊

  • Amazon EKS

  • Amazon Route 53

  • 庫貝克特爾

工具

史诗

任務描述所需技能

產生 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 工程師
任務描述所需技能

在您的 Amazon EKS 叢集中部署 NGINX 輸入控制器。

使用下列指令部署 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 工程師
任務描述所需技能

在 Amazon EKS 叢集中建立命名空間。

執行下列命令,建立mtls在 Amazon EKS 叢集中呼叫的命名空間。

kubectl create ns mtls

這會部署範例應用程式以測試相互 TLS。

DevOps 工程師
任務描述所需技能

在 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 部署。

執行下列命令以確認已建立部署,並且有一個網繭處於可用狀態。

kubectl get deploy -n mtls
DevOps 工程師

確認已建立 Kubernetes 服務。

請執行下列命令,確認是否已建立 Kubernetes 服務。

kubectl get service -n mtls
DevOps 工程師
任務描述所需技能

為輸入資源建立密碼。

執行下列命令,使用您先前建立的憑證,為 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 工程師
任務描述所需技能

在 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 工程師
任務描述所需技能

建立指向 NGINX 輸入控制器之負載平衡器的 CNAME 記錄。

登入 AWS 管理主控台,開啟 Amazon Route 53 主控台,然後建立指mtls.<your_domain_name>向 NGINX 輸入控制器的負載平衡器的標準名稱 (CNAME) 記錄。

如需詳細資訊,請參閱 Route 53 說明文件中的使用 Route 53 主控台建立記錄

DevOps 工程師
任務描述所需技能

測試不使用憑證的相互 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

您應該收到「MTL 正在工作」的響應。

DevOps 工程師

相關資源