解密已加密的靜態保密資料

Kubernetes 中所有允許你寫入持久 API 資源資料的 API 都支援靜態加密。例如,你可以為 Secret 啟用靜態加密。此靜態加密是 etcd 叢集或執行 kube-apiserver 的主機上檔案系統的任何系統級加密的額外補充。

本頁展示瞭如何從靜態加密 API 資料切換為未加密儲存 API 資料。你可能希望這樣做以提高效能;然而,通常情況下,如果加密某些資料是一個好主意,那麼讓它們保持加密狀態也是一個好主意。

準備工作

  • 你需要一個 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 伺服器。

確保在每個控制平面主機上使用相同的加密配置。

下一步

最後修改於 2024 年 9 月 13 日太平洋標準時間上午 9:33:修復 markdown 檔案中的一些超連結 (e6855623c7)