解密已加密的机密数据

Kubernetes 中所有允许您编写持久 API 资源数据的 API 都支持静止加密。例如,您可以为 Secrets 启用静止加密。这种静止加密是针对 etcd 集群或运行 kube-apiserver 的主机上的文件系统(s)的任何系统级加密的补充。

此页面显示如何从静止加密 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 年 4 月 18 日下午 7:57 PST:v1.30 的配置 API 参考 (6fa7b80ae3)