解密已靜態加密的機密資料
Kubernetes 中讓您寫入持久性 API 資源資料的所有 API 都支援靜態加密。例如,您可以為 密鑰啟用靜態加密。此靜態加密是對 etcd 叢集或您執行 kube-apiserver 的主機上的檔案系統的任何系統層級加密的補充。
本頁說明如何從靜態加密 API 資料切換,讓 API 資料以未加密的方式儲存。您可能想要這樣做以提高效能;但是,通常如果加密某些資料是個好主意,那麼讓它們保持加密也是個好主意。
注意
此任務涵蓋使用 Kubernetes API 儲存的資源資料的加密。例如,您可以加密密鑰物件,包括它們包含的鍵值資料。
如果您想管理掛載到容器中的檔案系統中資料的加密,您需要執行以下操作之一
- 使用提供加密磁碟區的儲存整合
- 在您自己的應用程式中加密資料
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且不充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用以下 Kubernetes 練習場之一
此任務假設您正在每個控制平面節點上以 靜態 Pod 執行 Kubernetes API 伺服器。
您的叢集控制平面必須使用 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。
解密所有資料
此範例說明如何停止靜態加密密鑰 API。如果您正在加密其他 API 種類,請調整步驟以符合。
找到加密組態檔
首先,找到 API 伺服器組態檔。在每個控制平面節點上,kube-apiserver 的靜態 Pod manifest 指定了一個命令列引數 --encryption-provider-config
。您可能會發現此檔案是使用 hostPath
卷宗掛載(volume mount)掛載到靜態 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 伺服器。
請確保您在每個控制平面主機上使用相同的加密組態。