解密已静态加密的敏感数据
Kubernetes 中所有允许你编写持久 API 资源数据的 API 都支持静态加密。例如,你可以为 Secrets 启用静态加密。这种静态加密是 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 是任何资源的第一个列出的提供程序,这意味着这些资源正在以未加密的形式写入 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) 的信息。