解密已加密存储的机密数据
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
,这意味着写入该类型资源的任何新信息都将按配置进行加密。如果您确实看到 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 服务器。
确保在每个控制平面主机上使用相同的加密配置。