協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
針對所有 Kubernetes API 資料的預設封套加密
Amazon Elastic Kubernetes Service (Amazon EKS) 會針對執行 Kubernetes 版本 1.28 或更新版本的 EKS 叢集中的所有 Kubernetes API 資料,提供預設封套加密。
封套加密可保護您使用 Kubernetes API 伺服器存放的資料。例如,封套加密適用於 Kubernetes 叢集的組態,例如 ConfigMaps。封套加密不適用於節點或 EBS 磁碟區上的資料。EKS 先前支援加密 Kubernetes 秘密,而現在此封套加密會延伸至所有 Kubernetes API 資料。
這項作法可提供受管的預設體驗,為您的 Kubernetes 應用程式實作深度防禦功能,且您不需要採取任何行動。
Amazon EKS 使用 AWS Key Management Service (KMS) 搭配 Kubernetes KMS 提供者 v2
了解封套加密
封套加密在將純文字資料傳送到資料儲存 (etcd) 之前,使用資料加密金鑰 (DEK) 對其進行加密,然後使用存放在遠端、集中管理的 KMS 系統 (AWS KMS) 中的根 KMS 金鑰加密 DEK 的程序。這是一種深度防禦策略,因為它會使用加密金鑰 (DEK) 保護資料,然後使用單獨、安全儲存的加密金鑰 (稱為金鑰加密金鑰 (KEK)) 保護 DEK,以增添另一層安全性。
Amazon EKS 如何使用 KMS v2 和 AWS KMS 啟用預設封套加密
Amazon EKS 使用 KMS v2
根據預設,此 KEK 由 AWS 所擁有,但您可以選擇從 AWS KMS 取使用自帶的 KEK。
以下圖表說明 API 伺服器啟動時 DEK 的產生和加密過程。
以下高階圖表說明 Kubernetes 資源在儲存到 etcd 之前對其進行加密的過程。
常見問答集
預設封套加密如何提升 EKS 叢集的安全狀態?
此功能可減少未加密的中繼資料和客戶內容的表面積和時間期間。使用預設封套加密時,中繼資料和客戶內容在儲存到 etcd 之前,在 kube-apiserver 的記憶體中僅會處於暫時未加密狀態。kube-apiserver 的記憶體可透過 Nitro 系統進行保護。Amazon EKS 僅會針對受管 Kubernetes 控制平面使用 Nitro 型 EC2 執行個體。這些執行個體具有安全控制設計,可防止任何系統或人員存取其記憶體。
要獲得此功能,我需要執行哪個 Kubernetes 版本?
若要啟用預設封套加密,Amazon EKS 叢集必須執行 Kubernetes 版本 1.28 或更新版本。
如果我執行的 Kubernetes 叢集版本不支援此功能,我的資料是否仍然安全?
是。在 AWS,安全第一
無論執行的 Kubernetes 版本為何,對於每個 EKS 叢集,都會以磁碟層級加密儲存在 etcd 中的所有資料。EKS 使用根金鑰來產生磁碟區加密金鑰,且這些金鑰由 EKS 服務管理。此外,每個 Amazon EKS 叢集都會使用叢集特定的虛擬機器在隔離的 VPC 中執行。因為此架構以及我們的操作安全性實務,Amazon EKS 已達到多項合規評分和標準,包括 SOC 1、SOC 2、SOC 3、PCI-DSS、ISO 和 HIPAA 資格。這些合規評分和標準適用於所有 EKS 叢集,而無論是否使用預設封套加密。
封套加密如何在 Amazon EKS 中運作?
啟動時,叢集 API 伺服器會從與隨機產生的資料結合的秘密種子,產生資料加密金鑰 (DEK)。此外,啟動時,API 伺服器會呼叫 KMS 外掛程式,以使用來自 AWS KMS 的遠端金鑰加密金鑰 (KEK) 來加密 DEK。這是一種一次性呼叫,會在 API 伺服器啟動和 KEK 輪換時執行。然後,API 伺服器會快取加密的 DEK 種子。在此之後,API 伺服器會使用快取的 DEK 種子,根據金鑰衍生函數 (KDF) 產生其他單次使用 DEK。然後,每個產生的 DEK 在儲存到 etcd 之前,僅可使用一次來加密單一 Kubernetes 資源。
請務必注意,API 伺服器會發出額外呼叫,可驗證 AWS KMS 整合的運作狀態和正常功能。這些額外的運作狀態檢查會在 AWS CloudTrail 中顯示。
我是否需要執行任何操作或變更此功能的任何許可,以確保在 EKS 叢集中正常運作?
否,您無需執行任何動作。在 Amazon EKS 中,封套加密現在已成為預設組態,並且所有執行 Kubernetes 版本 1.28 或更新版本的所有叢集均已啟用該組態。AWS KMS 整合是由 AWS 管理的 Kubernetes API 伺服器所建立的。這表示您不需要設定任何許可,即可開始為叢集使用 KMS 加密。
如何知道我的叢集是否已啟用預設封套加密?
如果您進行移轉以使用自己的 CMK,則會看到與叢集相關聯的 KMS 金鑰 ARN。此外,您還可以檢視與叢集 CMK 使用相關聯的 AWS CloudTrail 事件日誌。
如果您的叢集使用 AWS 擁有的金鑰,則 EKS 主控台會對此進行詳細說明 (不包括金鑰的 ARN)。
AWS 是否可以存取 Amazon EKS 中用於預設封套加密的 AWS 擁有的金鑰?
否。AWS 在 Amazon EKS 中擁有嚴格的安全控制,可防止任何人存取任何用於保護 etcd 資料庫中的資料的純文字加密金鑰。這些安全措施也會套用至 AWS 擁有的 KMS 金鑰。
我現有的 EKS 叢集是否已啟用預設封套加密?
如果您使用 Kubernetes 版本 1.28 版或更新版本執行 Amazon EKS 叢集,則會啟用所有 Kubernetes API 資料的封套加密。對於現有的叢集,Amazon EKS 會使用 eks:kms-storage-migrator RBAC ClusterRole 將先前未在 etcd 中進行封套加密的資料移轉至這一新的加密狀態。
如果我已在 EKS 叢集中為秘密啟用封套加密,這表示什麼?
如果您在 KMS 中已有用於對 Kubernetes 秘密進行封套加密的客戶自管金鑰 (CMK),則該相同的金鑰將用作叢集中所有 Kubernetes API 資料類型的封套加密的 KEK。
使用預設封套加密執行 EKS 叢集是否需要任何額外費用?
如果您使用 Amazon Web Services 擁有的金鑰進行預設封套加密,則受管 Kubernetes 控制平面不會產生任何額外費用。根據預設,每個執行 Kubernetes 版本 1.28 或更新版本的 EKS 叢集都會使用 Amazon Web Service 擁有的金鑰。不過,如果您使用自己的 AWS KMS 金鑰,則將套用一般 KMS 定價
使用我自己的 AWS KMS 金鑰來加密我叢集中的 Kubernetes API 資料需要多少費用?
為儲存您建立或匯入 KMS 的任何自訂金鑰,您每月需支付 1 美元。加密和解密請求的 KMS 費用。每個帳戶每月都有一個免費方案,其中已涵蓋 20,000 個請求,而對於超出每月免費方案的部分,每 10,000 個請求須支付 0.03 美元。這適用於帳戶的所有 KMS 用量,因此在叢集上使用您自己的 AWS KMS 金鑰的費用將受到您帳戶中其他叢集或 AWS 資源使用此金鑰的影響。
既然我的客戶自管金鑰 (CMK) 已被用於對所有 Kubernetes API 資料 (而不僅僅是秘密) 進行封套加密,我的 KMS 費用是否會提高?
否。我們使用 KMS v2 實作可大幅減少對 AWS KMS 發出的呼叫數量。無論 EKS 叢集中要加密或解密的其他 Kubernetes 資料為何,這都會降低與您的 CMK 相關聯的費用。
如上所述,使用遠端 KEK 加密 Kubernetes API 伺服器後,用於加密 Kubernetes 資源的產生 DEK 種子會以本機方式儲存在該伺服器的快取中。如果加密的 DEK 種子不在 API 伺服器的快取中,則 API 伺服器將會呼叫 AWS KMS 以加密 DEK 種子。然後,API 伺服器會快取加密的 DEK 種子,以供未來在叢集中使用,而無需呼叫 KMS。同樣地,對於解密請求,API 伺服器將會呼叫 AWS KMS 以進行第一個解密請求,之後則會快取解密的 DEK 種子並將其用於未來的解密操作。
如需詳細資訊,請參閱 GitHub 上 Kubernetes 增強功能中的 KEP-3299: KMS v2 改進
我是否可以將相同的 CMK 金鑰用於多個 Amazon EKS 叢集?
是。若要再次使用金鑰,您可以在建立過程中建立 ARN 與叢集的關聯,進而將其連結至相同區域中的叢集中。不過,如果您針對多個 EKS 叢集使用相同的 CMK,則應採取必要的措施,以防止任意停用 CMK。否則,與多個 EKS 叢集相關聯的已停用 CMK 會對叢集產生更廣泛的影響,具體取決於該金鑰。
如果在啟用預設封套加密之後,我的 CMK 無法使用,那麼我的 EKS 叢集會發生什麼狀況?
如果您停用 KMS 金鑰,則其無法在任何密碼編譯操作中使用。如果無法存取現有的 CMK,API 伺服器將無法加密和保留任何新建立的 Kubernetes 物件,並且也無法解密儲存在 etcd 中的任何先前加密的 Kubernetes 物件。如果停用 CMK,叢集將立即處於運作狀態不佳/降級狀態,而此時我們將無法履行我們的服務承諾
停用 CMK 時,您將會收到相關通知,其中包括 EKS 叢集運作狀態降級,以及在停用 CMK 後 30 天內需要重新啟用 CMK 以確保成功還原 Kubernetes 控制平面資源。
我該如何保護 EKS 叢集免受已停用/已刪除 CMK 的影響?
為了保護您的 EKS 叢集免於發生此類狀況,您的金鑰管理員應使用具有最低權限原則的 IAM 政策來管理對 KMS 金鑰操作的存取,進而任何降低與任意停用或刪除 EKS 叢集相關聯的金鑰的風險。此外,您可以將 CloudWatch 警示設定為接收有關 CMK 狀態的通知。
如果我重新啟用 CMK,我的 EKS 叢集是否會還原?
為確保成功還原 EKS 叢集,強烈建議在停用 CMK 後的前 30 天內重新啟用 CMK。不過,成功還原 EKS 叢集還將取決於它是否會因叢集處於運作狀態不佳/降級狀態期間可能進行的自動 Kubernetes 升級而導致其出現任何 API 重大變更。
停用 CMK 後,為什麼我的 EKS 叢集會處於運作狀態不佳/降級狀態?
EKS 控制平面的 API 伺服器會使用 DEK 金鑰 (該金鑰已在 API 伺服器的記憶體中經過加密和快取),以便在建立/更新操作期間加密所有物件,然後再將其儲存在 etcd。當從 etcd 擷取現有物件時,API 伺服器會使用相同的快取 DEK 金鑰並解密 Kubernetes 資源物件。如果您停用 CMK,API 伺服器將不會立即受到任何影響,因為 API 伺服器的記憶體中有快取的 DEK 金鑰。不過,當 API 伺服器執行個體重新啟動時,它將不會有快取的 DEK,而且需要呼叫 AWS KMS,才能進行加密和解密操作。如果沒有 CMK,此程序將會失敗並顯示 KMS_KEY_DISABLED 錯誤代碼,從而導致 API 伺服器無法成功開機。
如果我刪除我的 CMK,那麼我的 EKS 叢集會發生什麼狀況?
刪除與 EKS 叢集相關聯的 CMK 金鑰,將會導致其運作狀態降級且無法復原。如果沒有叢集的 CMK,API 伺服器將無法再加密和保留任何新的 Kubernetes 物件,並且也無法解密儲存在 etcd 資料庫中的任何先前加密的 Kubernetes 物件。只有在您確定不再需要使用 EKS 叢集時,才應繼續刪除 EKS 叢集的 CMK 金鑰。
請注意,如果未找到 CMK (KMS_KEY_NOT_FOUND) 或對與您的叢集相關聯的 CMK 的授與已被撤銷 (KMS_GRANT_REVOKED),則您的叢集將無法復原。如需有關叢集運作狀態和錯誤代碼的詳細資訊,請參閱叢集運作狀態常見問答集與包含解決方案路徑的錯誤代碼。
如果因為我停用或刪除我的 CMK 而導致 EKS 叢集降級/運作狀態不佳,我是否仍要為此付費?
是。雖然在停用 CMK 的情況下,EKS 控制平面將無法使用,但 AWS 仍將會執行配置給 EKS 叢集的專用基礎結構資源,直到客戶將其刪除為止。此外,在這種情況下,我們的服務承諾
當我的 EKS 叢集因停用的 CMK 而處於運作狀態不佳/降級狀態時,其是否可以自動升級?
是。不過,如果您的叢集有已停用的 CMK,則您將有 30 天的時間重新啟用。在此 30 天期間內,您的 Kubernetes 叢集不會自動升級。不過,如果此時間期限已過且您尚未重新啟用 CMK,則叢集將依照 EKS 中的 Kubernetes 版本生命週期,自動升級至標準支援的下一個版本 (n+1)。
當您發現受影響的叢集時,我們強烈建議快速重新啟用已停用的 CMK。請務必注意,雖然 EKS 會自動升級這些受影響的叢集,但無法保證它們會成功復原,特別是在叢集經歷過多次自動升級的情況下,因為這可能包括 Kubernetes API 的變更,以及 API 伺服器引導程序中的非預期行為。
我是否可以使用 KMS 金鑰別名?
是。Amazon EKS 支援使用 KMS 金鑰別名。別名是指 Amazon Web Service KMS 金鑰的易記名稱。例如,別名可讓您將 KMS 金鑰稱為 my-key 而不是 1234abcd-12ab-34cd-56ef-1234567890ab 。
我是否仍然可以使用我自己的 Kubernetes 備份解決方案來備份和還原我的叢集資源?
是。您可以使用 Kubernetes 備份解決方案 (例如 Velero