解密已加密的静态保密数据

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)