解密已处于静态加密状态的敏感数据
Kubernetes 中所有允许写入持久化 API 资源数据的 API 都支持静态加密。例如,你可以为Secrets启用静态加密。这种静态加密是除了针对 etcd 集群或运行 kube-apiserver 的主机文件系统进行的任何系统级加密之外的额外加密。
此页面显示如何从 API 数据静态加密切换为存储未加密的 API 数据。你可能希望这样做来提升性能;然而,通常情况下,如果加密某些数据是个好主意,那么让它们保持加密状态也是个好主意。
注意
此任务涵盖使用Kubernetes API存储的资源数据的加密。例如,你可以对 Secret 对象进行加密,包括它们包含的键值数据。
如果你想管理挂载到容器中的文件系统中的数据加密,则需要以下方法之一:
- 使用提供加密卷的存储集成
- 在你的应用程序内加密数据
准备工作
你需要一个 Kubernetes 集群,并且 kubectl 命令行工具已被配置为与你的集群通信。建议你在至少有两个不是控制平面主机节点的集群上运行本教程。如果你还没有集群,可以使用minikube创建一个,或者使用以下 Kubernetes 演练场之一:
本任务假定你正在每个控制平面节点上以静态 Pod的形式运行 Kubernetes API 服务器。
你的集群控制平面**必须**使用 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 服务器。
确保你在每个控制平面主机上使用相同的加密配置。
接下来是什么
- 了解更多关于EncryptionConfiguration 配置 API (v1)的信息。