秘密加密
秘密加密配置
RKE2 支持 静态密文加密,并将自动执行以下操作:
-
生成 AES-CBC 密钥。
-
使用生成的密钥生成加密配置文件。
-
将配置传递给 Kubernetes APIServer 作为 encryption-provider-config。
选择加密提供程序
|
版本门控
自 2025 年 4 月发布以来可用:v1.30.12+rke2r1,v1.31.8+rke2r1,v1.32.4+rke2r1,v1.33.0+rke2r1。 |
|
FIPS 合规性
FIPS 140-3 合规性仅适用于 |
使用 --secrets-encryption-provider 标志,您可以选择使用哪个加密提供程序。默认值为 aescbc。
RKE2 支持以下 加密提供程序:
-
aescbc:带有 PKCS#7 填充的 AES-CBC -
secretbox:XSalsa20 和 Poly1305
迁移提供程序
您可以通过以下步骤从 aescbc 提供程序迁移到 secretbox 提供程序:
-
确保
secretbox提供程序受到您的 RKE2 版本的支持。 -
在您的 RKE2 配置文件中更新/添加
secrets-encryption-provider标志为secretbox。 -
按照下面的 [Encryption Key Rotation] 部分轮换密文加密密钥。
生成的加密配置文件
以下是 RKE2 使用默认 aescbc 提供程序生成的加密配置文件示例:
#/var/lib/rancher/rke2/server/cred/encryption-config.json
{
"kind": "EncryptionConfiguration",
"apiVersion": "apiserver.config.k8s.io/v1",
"resources": [
{
"resources": [
"secrets"
],
"providers": [
{
"aescbc": {
"keys": [
{
"name": "aescbckey",
"secret": "xxxxxxxxxxxxxxxxxxx"
}
]
}
},
{
"identity": {}
}
]
}
]
}
密文加密工具
RKE2 包含一个子命令 secrets-encrypt,允许管理员执行以下任务:
-
添加新的加密密钥
-
轮换和删除加密密钥
-
重新加密密文
|
在轮换密文加密密钥时未遵循正确程序可能导致永久数据丢失。在轮换之前建议 创建快照。请谨慎操作。 |
加密密钥轮换
-
单服务器
-
高可用性
要在单服务器集群上轮换密文加密密钥:
-
轮换密文加密密钥。
rke2 secrets-encrypt rotate-keys -
等待重新加密完成。查看服务器日志,或等待:
$ rke2 secrets-encrypt status Encryption Status: Enabled Current Rotation Stage: reencrypt_finished
在HA设置中轮换密文加密密钥:
|
在此示例中,使用了3台服务器作为HA集群,称为S1、S2、S3。建议您选择一个服务器节点来运行`secrets-encrypt`命令。 |
-
在S1上轮换密文加密密钥。
rke2 secrets-encrypt rotate-keys -
等待重新加密完成。查看服务器日志,或等待:
$ rke2 secrets-encrypt status Encryption Status: Enabled Current Rotation Stage: reencrypt_finished -
依次重启S1、S2、S3上的RKE2。
systemctl restart rke2-server.service在重启下一个服务器之前,请等待systemctl命令返回。
经典加密密钥轮换
|
新程序
如果使用RKE2版本高于v1.30.1+rke2r1,建议使用[Encryption Key Rotation]。 |
-
单服务器
-
高可用性
要在单节点集群上轮换密文加密密钥:
-
准备:
rke2 secrets-encrypt prepare -
重启`kube-apiserver` pod:
# Get the kube-apiserver container ID export CONTAINER_RUNTIME_ENDPOINT="unix:///var/run/k3s/containerd/containerd.sock" crictl ps --name kube-apiserver # Stop the pod crictl stop <CONTAINER_ID> -
轮换:
rke2 secrets-encrypt rotate -
再次重启`kube-apiserver` pod。
-
重新加密:
rke2 secrets-encrypt reencrypt
在HA设置中轮换密文加密密钥:
|
在此示例中,使用了3台服务器作为HA集群,称为S1、S2、S3。虽然不是必需的,但建议您选择一个服务器节点来运行`secrets-encrypt`命令。 |
-
在S1上准备。
rke2 secrets-encrypt prepare -
依次重启S1、S2、S3。
systemctl restart rke2-server.service在重启下一个服务器之前,请等待systemctl命令返回。
-
在S1上轮换。
rke2 secrets-encrypt rotate
-
依次重启S1、S2、S3。
-
在S1上重新加密。
rke2 secrets-encrypt reencrypt请等待重新加密完成,可以通过服务器日志
journalctl -u rke2-server或rke2 secrets-encrypt status查看。完成后状态将返回reencrypt_finished。 -
依次重启S1、S2、S3。
密文加密状态
secrets-encrypt status 子命令显示节点上密文加密的当前状态。
单服务器节点上的命令示例:
$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match
Active Key Type Name
------ -------- ----
* AES-CBC aescbckey
高可用性集群中的另一个示例,在旋转密钥后,但在重启服务器之前:
$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2
Active Key Type Name
------ -------- ----
* AES-CBC aescbckey-2021-12-10T22:54:38Z
AES-CBC aescbckey
每个部分的详细信息如下:
-
加密状态:显示节点上是否禁用或启用 Secrets 加密
-
当前旋转阶段:指示节点上的当前旋转阶段。阶段为:
start、prepare、rotate、reencrypt_request、reencrypt_active、reencrypt_finished -
服务器加密哈希:对于高可用性集群,这指示所有服务器的本地文件是否处于相同阶段。这可以用来确定在进入下一个阶段之前是否需要重启服务器。在上面的高可用性示例中,节点 1 和节点 2 的哈希不同,表明它们当前没有相同的加密配置。重启服务器将同步它们的配置。
| 密钥表 | 说明 |
|---|---|
活动 |
|
密钥类型 |
RKE2 仅支持 |
名称 |
加密密钥的名称。默认值为 |