為什麼要加密K8s Secrets?
Kubernetes在強大的運維編排管理能力之下,依賴了大量的跨産品、跨服務、跨子產品調用所必須使用的關鍵、高危機密資訊,例如密碼、證書、憑據、通路密鑰等。K8s使用Secrets模型存儲和管理叢集系統和叢集中業務應用的敏感資訊,并且通過内部的Etcd叢集進行儲存,同時在Etcd叢集的副本中進行分布式複制存儲。
為了友善您了解K8s叢集管理了什麼量級的Secrets,筆者部署了一個沒有任何業務負載的Kubernetes叢集,預設情況下,有約50個Secret項。

這其中任何一個Secret的洩露,都可能帶來對Kubernetes叢集,對業務系統,甚至是對企業的運作産生不可估量的損失。
是以您在享受K8s為您帶來的便利時,也需要承擔一定的管理責任,對K8s叢集中托管的大量憑據進行必要的保護,防止來自各方面的安全威脅。
怎麼做?
幸運的是,阿裡雲容器服務Kubernetes版(簡稱ACK)為您實作了大部分的加密解密的內建工作,您隻需要一鍵配置,進而獲得雲原生的Secrets保護能力
在建立的ACK Pro叢集中開啟Secret落盤加密
- 登入容器服務管理控制台。
- 在控制台左側導航欄中,單擊叢集。
- 單擊頁面右上角的建立叢集,在彈出的選擇叢集模闆頁面,選擇Pro版叢集,并單擊建立。
- 在ACK托管版頁簽找到Secret落盤加密,選中選擇KMS密鑰,在下拉框中選擇KMS密鑰ID。建立ACK Pro叢集的其他配置請參見 建立Kubernetes Pro版叢集 。
雲上資料安全實踐:一鍵加密K8s叢集Secrets,防止高危機密資訊洩露為什麼要加密K8s Secrets?怎麼做?背後的機制參考資料
在已建立的ACK Pro叢集中開啟Secret落盤加密
- 在叢集清單頁面單擊目标Pro叢集名稱。
- 在叢集詳情頁面單擊基本資訊頁簽,在基本資訊區域中打開Secret落盤加密開關。
當叢集狀态由更新中變為運作中時,說明該叢集Secret落盤加密的特性已變更完成。
背後的機制
Kubernetes的加密過程基于Kubernetes提供的
KMS Encryption Provider機制,使用信封加密的方式對存儲在etcd中的Kubernetes Secret密鑰進行自動加密和解密,信封加密的詳細介紹請參見
什麼是信封加密?以下介紹Kubernetes Secret密鑰進行加密和解密的過程:
- 當一個業務密鑰需要通過Kubernetes Secret API存儲時,資料會首先被API Server生成的一個随機的資料加密密鑰加密,然後該資料密鑰會被指定的阿裡雲KMS密鑰加密為一個密文密鑰存儲在etcd中。
- 解密Kubernetes Secret密鑰時,系統會首先調用阿裡雲KMS服務的解密OpenAPI進行密文密鑰的解密,然後使用解密後的明文密鑰對Secret資料解密并最終傳回給使用者。
您通過授權容器服務賬号使用AliyunCSManagedSecurityRole系統角色的權限,來允許容器叢集調用您的KMS服務内指定的CMK(使用者主密鑰)完成Secret的加密保護,是以您具備對K8s Secret資料的完全控制權和加解密動作的審計能力。
如果您登入操作審計控制台,在左側導航欄單擊曆史事件查詢,在曆史事件查詢頁面有使用aliyuncsmanagedsecurityrole系統角色的加密和解密事件日志,則說明該叢集背景已成功開啟Secret落盤加密特性。您可以在操作審計服務中檢視到對KMS的所有調用記錄。