在 Amazon EKS 上使用 AWS Private CA 在 AWS App Mesh 中啟用 mTLS - AWS 方案指引

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

在 Amazon EKS 上使用 AWS Private CA 在 AWS App Mesh 中啟用 mTLS

由 Omar Kahil (AWS)、Emmanuel Saliu (AWS)、Muhammad Shahzad (AWS) 和 Andy Wong (AWS) 建立

Summary

此模式說明如何使用 AWS App Mesh 中 AWS Private Certificate Authority (AWS Private CA) 的憑證,在 Amazon Web Services (AWS) 上實作互通傳輸層安全性 (mTLS)。它透過 Secure Production Identity Framework for Everyone (SPIFFE) 使用 Envoy 秘密探索服務 (SDS) API。SPIFFE 是雲端原生運算基金會 (CNCF) 開放原始碼專案,具有廣泛的社群支援,可提供精細且動態的工作負載身分管理。若要實作 SPIFFE 標準,請使用 SPIRE SPIFFE 執行時間環境。

在 App Mesh 中使用 mTLS 提供雙向對等身分驗證,因為它透過 TLS 增加一層安全性,並允許網格中的服務驗證正在建立連線的用戶端。用戶端-伺服器關係中的用戶端也會在工作階段交涉過程中提供 X.509 憑證。伺服器使用此憑證來識別和驗證用戶端。這有助於驗證憑證是否由信任的憑證授權機構 (CA) 發行,以及憑證是否為有效的憑證。

先決條件和限制

先決條件

  • 具有自我管理或受管節點群組的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集

  • 在啟用 SDS 的叢集上部署的 App Mesh 控制器

  • AWS Certificate Manager (ACM) 發行的私有憑證,由 AWS Private CA 發行

限制

  • SPIRE 無法安裝在 AWS Fargate 上,因為 SPIRE Agent 必須作為 Kubernetes DaemonSet 執行。

產品版本

  • AWS App Mesh Controller 圖表 1.3.0 或更新版本

架構

下圖顯示 VPC 中具有 App Mesh 的 EKS 叢集。一個工作者節點中的 SPIRE 伺服器會與其他工作者節點中的 SPIRE 代理程式,以及與 AWS Private CA 通訊。Envoy 用於 SPIRE Agent 工作者節點之間的 mTLS 通訊。

EKS 叢集工作者節點,具有適用於 mTLS 的 SPIRE Agents 和 Server、App Mesh 和 Envoys。

此圖說明了下列步驟:

  1. 發出憑證。

  2. 請求憑證簽署和憑證。

工具

AWS 服務

  • AWS Private CA – AWS Private Certificate Authority (AWS Private CA) 可建立私有憑證授權機構 (CA) 階層,包括根 CA 和次級 CAs,而無須承擔操作內部部署 CA 的投資和維護成本。

  • AWS App Mesh – AWS App Mesh 是一種服務網格,可讓您更輕鬆地監控和控制服務。App Mesh 會標準化您的服務通訊方式,為應用程式中的每個服務提供一致的可見性和網路流量控制。

  • Amazon EKS – Amazon Elastic Kubernetes Service (Amazon EKS) 是一項受管服務,可讓您在 AWS 上執行 Kubernetes,而無需安裝、操作和維護您自己的 Kubernetes 控制平面或節點。

其他工具

  • Helm – Helm 是 Kubernetes 的套件管理員,可協助您在 Kubernetes 叢集上安裝和管理應用程式。此模式使用 Helm 來部署 AWS App Mesh Controller。

  • AWS App Mesh Controller 圖表 – 此模式使用 AWS App Mesh Controller 圖表來啟用 Amazon EKS 上的 AWS App Mesh。

史詩

任務描述所需的技能

使用 Amazon EKS 設定 App Mesh。

遵循 儲存庫中提供的基本部署步驟。

DevOps 工程師

安裝 SPIRE。

使用 pipe_setup.yaml 在 EKS 叢集上安裝 SPIRE。

DevOps 工程師

安裝 AWS Private CA 憑證。

遵循 AWS 文件中的指示,為您的私有根 CA 建立並安裝憑證。

DevOps 工程師

將許可授予叢集節點執行個體角色。

若要將政策連接至叢集節點執行個體角色,請使用其他資訊區段中的程式碼。

DevOps 工程師

新增適用於 AWS Private CA 的 SPIRE 外掛程式。

若要將外掛程式新增至 SPIRE 伺服器組態,請使用其他資訊區段中的程式碼。將 certificate_authority_arn Amazon Resource Name (ARN) 取代為您的私有 CA ARN。使用的簽署演算法必須與私有 CA 上的簽署演算法相同。將 取代your_region為您的 AWS 區域。

如需外掛程式的詳細資訊,請參閱伺服器外掛程式:UpstreamAuthority "aws_pca"

DevOps 工程師

更新 bundle.cert。

建立 SPIRE 伺服器之後,將會建立 spire-bundle.yaml 檔案。將spire-bundle.yaml檔案中bundle.crt的值從私有 CA 變更為公有憑證。

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

向 SPIRE 註冊節點和工作負載項目。

若要向 SPIRE Server 註冊節點和工作負載 (服務),請使用 儲存庫中的程式碼。

DevOps 工程師

在啟用 mTLS 的 App Mesh 中建立網格。

使用微服務應用程式的所有元件 (例如虛擬服務、虛擬路由器和虛擬節點),在 App Mesh 中建立新的網格。

DevOps 工程師

檢查已註冊的項目。

您可以執行下列命令來檢查節點和工作負載的已註冊項目。

kubectl exec -n spire spire-server-0 -- /opt/spire/bin/spire-server entry show

這會顯示 SPIRE 代理程式的項目。

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

驗證 mTLS 流量。

  1. 從前端服務,將 HTTP 標頭傳送至後端服務,並使用在 SPIRE 中註冊的服務驗證成功回應。

  2. 對於交互 TLS 身分驗證,您可以執行下列命令來檢查ssl.handshake統計資料。

    kubectl exec -it $POD -n $NAMESPACE -c envoy -- curl http://localhost:9901/stats | grep ssl.handshake

    執行先前的命令後,您應該會看到接聽程式ssl.handshake計數,看起來會與下列範例類似:

    listener.0.0.0.0_15000.ssl.handshake: 2
DevOps 工程師

確認憑證是從 AWS Private CA 發出。

您可以檢視 SPIRE 伺服器的日誌,以檢查外掛程式是否已正確設定,且憑證正在從您的上游私有 CA 發出。執行下列命令。

kubectl logs spire-server-0 -n spire

然後檢視產生的日誌。此程式碼假設您的伺服器已命名,spire-server-0且託管於您的 pipe 命名空間中。您應該會看到成功載入外掛程式,以及連線到上游私有 CA。

DevOps 工程師

相關資源

其他資訊

將許可連接至叢集節點執行個體角色

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ACMPCASigning", "Effect": "Allow", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:IssueCertificate", "acm-pca:GetCertificate", "acm:ExportCertificate" ], "Resource": "*" } ] } AWS Managed Policy: "AWSAppMeshEnvoyAccess"

新增適用於 ACM 的 SPIRE 外掛程式

Add the SPIRE plugin for ACM Change certificate_authority_arn to your PCA ARN. The signing algorithm used must be the same as the signing algorithm on the PCA. Change your_region to the appropriate AWS Region. UpstreamAuthority "aws_pca" { plugin_data { region = "your_region" certificate_authority_arn = "arn:aws:acm-pca:...." signing_algorithm = "your_signing_algorithm" } }