解密已加密的靜態保密資料
Kubernetes 中所有允許你寫入持久 API 資源資料的 API 都支援靜態加密。例如,你可以為 Secret 啟用靜態加密。此靜態加密是 etcd 叢集或執行 kube-apiserver 的主機上檔案系統的任何系統級加密的額外補充。
本頁展示瞭如何從靜態加密 API 資料切換為未加密儲存 API 資料。你可能希望這樣做以提高效能;然而,通常情況下,如果加密某些資料是一個好主意,那麼讓它們保持加密狀態也是一個好主意。
注意
此任務涵蓋使用 Kubernetes API 儲存的資源資料的加密。例如,你可以加密 Secret 物件,包括它們包含的鍵值資料。
如果你想管理掛載到容器中的檔案系統中的資料加密,你需要
- 使用提供加密卷的儲存整合
- 在自己的應用程式中加密資料
準備工作
你需要一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機節點上執行本教程。如果你還沒有叢集,可以透過 minikube 建立一個,或者使用這些 Kubernetes 操場之一
此任務假設你在每個控制平面節點上將 Kubernetes API 伺服器作為 靜態 Pod 執行。
你的叢集的控制平面**必須**使用 etcd v3.x(主要版本 3,任何次要版本)。
要加密自定義資源,你的叢集必須執行 Kubernetes v1.26 或更高版本。
你應該有一些已經加密的 API 資料。
要檢查版本,請輸入 kubectl version
。
確定是否已啟用靜態加密
預設情況下,API 伺服器使用 identity
供應方,該供應方儲存資源的純文字表示。**預設的 identity
供應方不提供任何機密保護。**
kube-apiserver
程序接受一個引數 --encryption-provider-config
,該引數指定配置檔案路徑。該檔案的內容(如果指定)控制 Kubernetes API 資料在 etcd 中的加密方式。如果未指定,則表示你未啟用靜態加密。
該配置檔案的格式為 YAML,表示名為 EncryptionConfiguration
的配置 API 型別。你可以在 靜態加密配置 中檢視示例配置。
如果設定了 --encryption-provider-config
,請檢查哪些資源(例如 secrets
)配置了加密,以及使用了哪個供應方。請確保該資源型別首選的供應方**不是** identity
;只有當你希望停用靜態加密時,才將 identity
(_不加密_)設定為預設值。驗證資源的首個供應方**不是** identity
,這意味著寫入該型別資源的任何新資訊都將按配置加密。如果看到 identity
是任何資源的首個供應方,則表示這些資源正在不加密的情況下寫入 etcd。
解密所有資料
此示例展示瞭如何停止靜態加密 Secret API。如果你正在加密其他 API 型別,請調整步驟以匹配。
找到加密配置檔案
首先,找到 API 伺服器配置檔案。在每個控制平面節點上,kube-apiserver 的靜態 Pod 清單都指定了一個命令列引數 --encryption-provider-config
。你可能會發現此檔案透過 hostPath
卷掛載的方式掛載到靜態 Pod 中。找到卷後,你可以在節點檔案系統上找到該檔案並檢查它。
配置 API 伺服器以解密物件
要停用靜態加密,請將 identity
供應方作為加密配置檔案中的第一個條目。
例如,如果現有 EncryptionConfiguration 檔案內容為
---
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
# Do not use this (invalid) example key for encryption
- name: example
secret: 2KfZgdiq2K0g2YrYpyDYs9mF2LPZhQ==
則將其更改為
---
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- identity: {} # add this line
- aescbc:
keys:
- name: example
secret: 2KfZgdiq2K0g2YrYpyDYs9mF2LPZhQ==
並重啟此節點上的 kube-apiserver Pod。
重新配置其他控制平面主機
如果你的叢集中有多個 API 伺服器,你應該依次將更改部署到每個 API 伺服器。
確保在每個控制平面主機上使用相同的加密配置。
強制解密
然後執行以下命令強制解密所有 Secrets
# If you are decrypting a different kind of object, change "secrets" to match.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
一旦你將**所有**現有加密資源替換為不使用加密的後端資料,你就可以從 kube-apiserver
中移除加密設定。
要移除的命令列選項是
--encryption-provider-config
--encryption-provider-config-automatic-reload
再次重啟 kube-apiserver Pod 以應用新配置。
重新配置其他控制平面主機
如果你的叢集中有多個 API 伺服器,你應該再次依次將更改部署到每個 API 伺服器。
確保在每個控制平面主機上使用相同的加密配置。
下一步
- 瞭解更多關於 EncryptionConfiguration 配置 API (v1) 的資訊。