Transport Layer Security (TLS) - AWS App Mesh

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

Transport Layer Security (TLS)

在 App Mesh 中,傳輸層安全性 (TLS) 會加密部署在應用程式網格中由網狀端點 (例如和) 在 App Mesh 中表示之計算資源上的 Envoy Proxy 之間的通訊。虛擬節點 虛擬閘道代理伺服器會交涉並終止 TLS。使用應用程式部署 Proxy 時,您的應用程式程式碼不負責交涉 TLS 工作階段。代理伺服器代表您的應用程式交涉 TLS。

App Mesh 可讓您透過下列方式將 TLS 憑證提供給代理伺服器:

  • 來自 AWS Certificate Manager (ACM) 的私人憑證,由 AWS Private Certificate Authority (AWS Private CA) 發行。

  • 儲存在虛擬節點本機檔案系統上的憑證,由您自己的憑證授權單位 (CA) 發行

  • 由密碼探索服務 (SDS) 端點透過本機 Unix 網域通訊端提供的憑證。

特使代理授權必須為由網格端點表示的已部署 Envoy 代理啟用。我們建議您在啟用 Proxy 授權時,將存取限制為只啟用加密的網狀端點。

憑證需求

憑證上的其中一個主體別名 (SAN) 必須符合特定條件,具體取決於探索網狀端點所代表的實際服務的方式而定。

  • DNS — 其中一個憑證 SAN 必須符合 DNS 服務探索設定中提供的值。對於具有服務探索名稱的應用程式mesh-endpoint.apps.local,您可以建立與該名稱相符的憑證,或建立具有萬用字元的憑證*.apps.local

  • AWS Cloud Map— 其中一個憑證 SAN 必須符合使用該格式service-name.namespace-name的 AWS Cloud Map 服務探索設定中提供的值。對於具有 serviceName mesh-endpoint 和命名空間名稱 AWS Cloud Map 服務探索設定的應用程式apps.local,您可以建立與名稱相符的憑證mesh-endpoint.apps.local,或建立具有萬用字元的憑證 *.apps.local.

對於這兩種探索機制,如果沒有任何憑證 SAN 符合 DNS 服務探索設定,Envoys 之間的連線會失敗,並顯示下列錯誤訊息,如用戶端 Envoy 所示。

TLS error: 268435581:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

TLS 認證憑證

使用 TLS 驗證時,應用 App Mesh 支援多個憑證來源。

AWS Private CA

憑證必須與將使用憑證的網狀端點儲存在相同的區域和 AWS 帳戶中的 ACM 中。CA 的憑證不需要位於相同的 AWS 帳戶中,但仍需要與網狀端點位於相同的區域中。如果您沒有 AWS 私有 CA,則必須先建立一個,然後才能從中要求憑證。如需有關使用 ACM 向現有 AWS Private CA 使用 ACM 要求憑證的詳細資訊,請參閱要求私有憑證。憑證不能是公用憑證。

您用於 TLS 用戶端原則的私人 CA 必須是根使用者 CA。

若要使用憑證和 CA 來設定虛擬節點 AWS Private CA,您用來呼叫 App Mesh 的主體 (例如使用者或角色) 必須具有下列 IAM 權限:

  • 對於您新增至接聽程式 TLS 組態的任何憑證,主體必須具有acm:DescribeCertificate權限。

  • 對於 TLS 用戶端原則上設定的任何 CA,主體必須具有acm-pca:DescribeCertificateAuthority權限。

重要

與其他帳戶共用 CA 可能會將這些帳戶提供非預期的權限給 CA。我們建議您使用以資源為基礎的政策acm-pca:DescribeCertificateAuthorityacm-pca:GetCertificateAuthorityCertificate限制只存取不需要從 CA 發行憑證的帳戶。

您可以將這些許可新增至附加至主體的現有 IAM 政策,或建立新的主體和政策,然後將該政策附加到主體。如需詳細資訊,請參閱編輯 IAM 政策建立 IAM 政策新增 IAM 身分許可。

注意

您每月支付每個操作的費用, AWS Private CA 直到刪除它為止。您也需要支付每個月發行的私有憑證和匯出的私有憑證費用。如需詳細資訊,請參閱 AWS Certificate Manager 定價

當您為網狀端點所代表的 Envoy Proxy 啟用代理授權時,必須為您使用的 IAM 角色指派下列 IAM 許可:

  • 對於在虛擬節點的接聽程式上設定的任何憑證,角色必須具有acm:ExportCertificate權限。

  • 對於 TLS 用戶端原則上設定的任何 CA,角色必須具有acm-pca:GetCertificateAuthorityCertificate權限。

檔案系統

您可以使用檔案系統將憑證散發給 Envoy。您可以透過在檔案路徑上使用憑證鏈結和對應的私密金鑰來執行此操作。這樣,可以從 Envoy 側車代理訪問這些資源。

特使的秘密發現服務(SDS)

Envoy 透過秘密探索通訊協定從特定端點擷取 TLS 憑證等機密。如需有關此通訊協定的詳細資訊,請參閱 Envoy 的 SDS 文件。

當 SDS 作為證書和證書鏈的源時,應用程序網格配置 Envoy 代理以使用代理本地的 Unix 域套接字作為秘密發現服務(SDS)端點。您可以使用APPMESH_SDS_SOCKET_PATH環境變數來設定此端點的路徑。

重要

使用 Unix 域套接字的本地密碼發現服務在 App Mesh 特使代理版本 1.15.1.0 及更高版本上支持。

App Mesh 格支援使用 GrPC 的 V2 SDS 通訊協定。

與 SPIRE 運行時環境(SPIRE)集成

您可以使用 SDS API 的任何側車實現,包括現有的工具鏈,如 SPIRE 運行時環境(SP IRE)。SPIRE 旨在在分散式系統中的多個工作負載之間部署相互 TLS 驗證。它會在執行階段驗證工作負載的身分。SPIRE 還提供工作負載特定、短期使用時間,並自動將金鑰和憑證直接旋轉至工作負載。

您應該將 SPIRE 代理配置為特使的 SDS 提供商。允許其直接向 Envoy 提供提供相互 TLS 驗證所需的金鑰材料。在特使代理旁邊的側車中運行 SPIRE 代理。代理程式會根據需要重新產生短暫的金鑰和憑證。當 Envoy 連線至 SPIRE 代理程式所公開的 SDS 伺服器時,代理程式會驗證特使,並決定應提供給特使的哪些服務身分識別和 CA 憑證。

在此程序期間,會輪替服務身分識別和 CA 憑證,並將更新串流回 Envoy。Envoy 立即將它們應用於新的連接,而不會造成任何中斷或停機,並且沒有私鑰接觸文件系統。

App Mesh 如何設定使者以協商 TLS

當決定如何在網狀中設定 Envoys 之間的通訊時,App Mesh 會使用用戶端和伺服器的網狀端點組態。

使用用戶端原則

當用戶端原則強制使用 TLS,且用戶端原則中的其中一個連接埠符合伺服器策略的通訊埠時,用戶端原則會用來設定用戶端的 TLS 驗證內容。例如,如果虛擬閘道的用戶端原則符合虛擬節點的伺服器策略,則會使用虛擬閘道用戶端策略中定義的設定,在 Proxy 之間嘗試 TLS 交涉。如果用戶端原則與伺服器策略的連接埠不符,則代理伺服器之間的 TLS 可能會進行交涉,也可能不會交涉,這取決於伺服器策略的 TLS 設定。

沒有用戶端政策

如果用戶端尚未設定用戶端原則,或者用戶端原則與伺服器的連接埠不符,則 App Mesh 將使用伺服器判斷是否從用戶端交涉 TLS,以及如何交涉 TLS。例如,如果虛擬閘道尚未指定用戶端原則,且虛擬節點尚未設定 TLS 終止,則不會在 Proxy 之間交涉 TLS。如果用戶端尚未指定相符的用戶端原則,且伺服器已設定 TLS 模式PERMISSIVESTRICT或是 Proxy 會設定為交涉 TLS。視提供 TLS 終止的憑證方式而定,會套用下列其他行為。

  • ACM 管理的 TLS 憑證 — 當伺服器使用 ACM 管理的憑證設定 TLS 終止時,App Mesh 會自動設定用戶端以交涉 TLS,並針對憑證鏈結至的根使用者 CA 驗證憑證。

  • 檔案型 TLS 憑證 — 當伺服器使用 Proxy 本機檔案系統的憑證設定 TLS 終止時,App Mesh 會自動設定用戶端以交涉 TLS,但不會驗證伺服器的憑證。

主題替代名稱

您可以選擇性地指定要信任的主體別名 (SAN) 清單。SAN 的格式必須為 FQDN 或 URI 格式。如果提供 SAN,Envoy 會驗證所顯示憑證的主體替代名稱是否符合此清單上的其中一個名稱。

如果您未在終止網格端點上指定 SAN,則該節點的 Envoy 代理不會在對等用戶端憑證上驗證 SAN。如果您未在原始網格端點上指定 SAN,則終止端點提供的憑證上的 SAN 必須與網格端點服務探索組態相符。

如需詳細資訊,請參閱 App Mesh TLS:憑證需求

重要

只有當 TLS 的用戶端原則設定為時,您才能使用萬用字元 SAN。not enforced如果用戶端虛擬節點或虛擬閘道的用戶端原則設定為強制執行 TLS,則無法接受萬用字元 SAN。

驗證加密

啟用 TLS 後,您可以查詢 Envoy 代理以確認通訊是否已加密。Envoy 代理伺服器會發出有關資源的統計資料,以協助您瞭解 TLS 通訊是否正常運作。例如,Envoy 代理伺服器會記錄其針對指定網狀端點交涉的成功 TLS 交涉次數的統計資料。判斷使用下列命令命名my-mesh-endpoint的網格端點有多少成功 TLS 交握。

curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep ssl.handshake

在下列範例傳回的輸出中,網狀端點有三個交握,因此通訊已加密。

listener.0.0.0.0_15000.ssl.handshake: 3

當 TLS 協商失敗時,特使代理也會發出統計信息。判斷網格端點是否有 TLS 錯誤。

curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep -e "ssl.*\(fail\|error\)"

在傳回輸出的範例中,數個統計資料沒有錯誤,因此 TLS 交涉成功。

listener.0.0.0.0_15000.ssl.connection_error: 0 listener.0.0.0.0_15000.ssl.fail_verify_cert_hash: 0 listener.0.0.0.0_15000.ssl.fail_verify_error: 0 listener.0.0.0.0_15000.ssl.fail_verify_no_cert: 0 listener.0.0.0.0_15000.ssl.ssl.fail_verify_san: 0

如需 Envoy TLS 統計資料的相關資訊,請參閱使用者監聽程式統計資料。

憑證續約

AWS Private CA

當您使用 ACM 更新憑證時,續訂的憑證會在續訂完成後的 35 分鐘內自動發佈到連線的 Proxy。我們建議您使用受管理續約,以便在憑證有效期結束時自動續約憑證。有關更多信息,請參閱用戶指 AWS Certificate Manager 南中的 ACM 亞馬遜頒發的證書的管理續訂

您自己的憑證

使用本機檔案系統中的憑證時,Envoy 不會在憑證變更時自動重新載入憑證。您可以重新啟動或重新部署 Envoy 程序以載入新憑證。您也可以將較新的憑證置於不同的檔案路徑,並使用該檔案路徑更新虛擬節點或閘道組態。

將 Amazon ECS 工作負載設定為搭配使用 TLS 身份驗證 AWS App Mesh

您可以將網格設定為使用 TLS 驗證。請確定您新增至工作負載的 Envoy Proxy 側車可使用這些憑證。您可以將 EBS 或 EFS 磁碟區附加到您的特使附屬車上,也可以從 AWS Secrets Manager 儲存和擷取憑證。

  • 如果您使用以檔案為基礎的憑證散發,請將 EBS 或 EFS 磁碟區附加至 Envoy 附屬程式。請確定憑證和私密金鑰的路徑與中設定的路徑相符 AWS App Mesh。

  • 如果您使用的是基於 SDS 的分發,請添加一個實現 Envoy 的 SDS API 並可訪問證書的附屬軟件。

注意

Amazon ECS 不支援 SPIRT。

將 Kubernetes 工作負載設定為搭配使用 TLS 驗證 AWS App Mesh

您可以設定 Kubernetes 的 AWS App Mesh 控制器,以針對虛擬節點和虛擬閘道服務後端和接聽程式啟用 TLS 驗證。確保憑證可供您新增至工作負載的 Envoy Proxy 側車使用。您可以在相互 TLS 驗證的逐步解說一節中查看每種散佈類型的範例。

  • 如果您使用以檔案為基礎的憑證散發,請將 EBS 或 EFS 磁碟區附加至 Envoy 附屬程式。請確定憑證和私密金鑰的路徑與控制器中設定的路徑相符。或者,您也可以使用掛載在檔案系統上的 Kubernetes 密碼。

  • 如果您使用的是基於 SDS 的分發,則應設置實現 Envoy SDS API 的節點本地 SDS 提供程序。特使將通過 UDS 達到它。若要在 EKS AppMesh 控制器中啟用以 SDS 為基礎的 MTL 支援,請將旗標設定為,true並透過enable-sds旗標將本機 SDS 提供者的 UDS 路徑提供給控制器。sds-uds-path如果您使用 helm,請將這些設定為控制器安裝的一部分:

    --set sds.enabled=true
注意

如果您在 Fargate 模式下使用 Amazon 彈性 Kubernetes 服務(亞馬遜 EKS),您將無法使用 SPIRE 來分發證書。