解密已加密的机密数据
Kubernetes 中所有允许您编写持久 API 资源数据的 API 都支持静止加密。例如,您可以为 Secrets 启用静止加密。这种静止加密是针对 etcd 集群或运行 kube-apiserver 的主机上的文件系统(s)的任何系统级加密的补充。
此页面显示如何从静止加密 API 数据切换,以便 API 数据以未加密的方式存储。您可能希望这样做以提高性能;通常,如果加密某些数据是一个好主意,那么保持加密也是一个好主意。
注意
此任务涵盖使用 Kubernetes API 存储的资源数据的加密。例如,您可以加密 Secret 对象,包括它们包含的键值数据。
如果您想管理挂载到容器中的文件系统中数据的加密,您需要:
- 使用提供加密 volumes 的存储集成
- 在您自己的应用程序中加密数据
开始之前
您需要有一个 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 服务器。
确保您在每个控制平面主机上使用相同的加密配置。