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

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

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

由馬罕德拉西達帕(AWS)創建

PoC 或試驗

技術:DevOps;安全、身份、合規

AWS 服務:Amazon EKS; Amazon Route 53

Summary

憑證型相互傳輸層安全性 (TLS) 是選用的 TLS 元件,可在伺服器和用戶端之間提供雙向對等驗證。使用相互 TLS 時,用戶端必須在工作階段交涉程序期間提供 X.509 憑證。伺服器會使用此憑證來識別和驗證用戶端。

相互 TLS 是物聯網 (IoT) 應用程式的常見需求,可用於企業對企業應用程式或標準,例如開放式銀行業

此模式說明如何使用 NGINX 入口控制器,為在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上執行的應用程式設定相互 TLS。您可以藉由註釋入口資源來啟用 NGINX 入口控制器的內建相互 TLS 功能。如需有關 NGINX 控制器上相互 TLS 註釋的詳細資訊,請參閱用戶端憑證驗證在 Kubernetes 文件中。

重要:此模式使用自我簽署的憑證。我們建議僅搭配測試叢集使用此模式,不要在生產環境中使用。如果要在生產環境中使用此模式,可以使用AWS Certificate Manager 私有憑證授權機構或您現有的公有金鑰基礎設施 (PKI) 標準來發行私有憑證。

先決條件和限制

先決條件

  • 使用中的 Amazon Web Services (AWS) 帳戶。

  • 現有 Amazon EKS 叢集。

  • AWS Command Line Interface (AWS CLI) 1.7 版或更新版本,在 macOS、Linux 或視窗中安裝並設定。

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

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

限制

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

Architecture

技術堆疊

  • Amazon EKS

  • Amazon Route 53

  • 庫貝特

Tools

  • Amazon EKS— Amazon Elastic Kubernetes Service (Amazon EKS) 讓您輕鬆於 AWS 執行 Kubernetes,而無需自行安裝、操作和維護您的 Kubernetes 控制窗格。

  • Amazon Route 53—Route 53 是一種可用性高、可擴展性強的 DNS Web 服務。

  • 庫貝特kubectl是用來與 Amazon EKS 叢集互動的命令列公用程式。

Epics

任務描述所需技能
下載並儲存 Kubernetes 組態。

下載 inress.yaml 和 mtls.yaml 檔案 (已附加),並將它們儲存到電腦上的本機路徑。

DevOps
任務描述所需技能
產生 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-0.32.0/deploy/static/provider/aws/deploy.yaml

DevOps
確認 NGINX 入口控制器服務在執行中。

使用下列命令以確認 NGINX 輸入控制器服務正在執行:

kubectl get svc -n ingress-nginx

重要:請確定服務位址欄位包含網路負載平衡器的網域名稱。

DevOps
任務描述所需技能
在 Amazon EKS 叢集中建立命名空間。

執行kubectl create ns mtls命令來建立名空間mtls在您的 Amazon EKS 叢集中。這會部署範例應用程式以測試相互 TLS。

DevOps
任務描述所需技能
在 mtls 命名空間中建立 Kubernetes 部署和服務。

建立 Kubernetes 部署和服務,在mtls命名空間,藉由執行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 命名空間中建立入口資源。

開啟輸入的 .yaml 檔案,並取代為 <your_domain_name> 您現有的網域名稱。

建立入口資源在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 入口控制器的負載平衡器。

如需此項目的詳細資訊,請參閱使用 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 命令。您應該會收到「MTLS 正在運作」的回應。

DevOps

相關資源

Attachments

attachment.zip