使用KMS密钥进行Secret落盘加密
更新时间:2025-12-09
在Kubernetes集群中,通常使用Secret密钥模型存储和管理业务应用涉及的敏感信息,例如应用密码、TLS证书、Docker镜像下载凭据等敏感信息。Kubernetes会将所有的Secret密钥对象数据存储在集群对应的etcd中。
容器引擎CCE托管集群支持通过百度智能云密钥管理服务KMS中主密钥对Secret资源进行加密。KMS加密过程基于Kubernetes提供的KMS Encryption Provider机制,使用信封加密的方式对存储在etcd中的Kubernetes Secrets数据进行自动加密和解密。Kubernetes Secrets密钥加密和解密的过程如下:
- 加密过程:当一个业务密钥需要通过Kubernetes Secrets API存储时,数据会首先被API Server生成的一个随机的数据加密密钥加密。然后,该数据密钥会被指定的KMS密钥加密为一个密文密钥,并存储在etcd中。
- 解密过程:解密Kubernetes Secrets密钥时,系统会首先调用KMS的解密OpenAPI进行密文密钥的解密。然后,使用解密后的明文密钥对Secrets数据进行解密,并最终返回给用户。
前提条件
- 仅支持托管集群,独立集群不支持,并且集群K8s版本为1.30及以上。
- 已在密钥管理KMS控制台创建KMS密钥,且密钥地域与目标集群地域相同。
- 开启落盘加密功能时,因为控制面的KMS组件需要访问百度智能云KMS OpenAPI完成Secrets实例的加解密。需要确保集群控制面使用的安全组或VPC网络ACL的出方向规则中放行了CCE托管集群控制面网段(100.64.230.0/24),否则会导致集群控制面不可用。更多信息请参见CCE安全组说明。
注意事项
- 使用百度智能云KMS加密Kubernetes Secret会产生计费。关于KMS服务计费的详细说明,请参见KMS计费概述。
- 开启数据加密功能后,请勿通过KMS的OpenAPI或控制台禁用、删除或计划删除集群数据加解密时选择的密钥,否则会使集群API Server不可用,导致Secret和ServiceAccount等对象无法正常获取,影响业务应用的正常运行。
操作步骤
创建集群时开启Secret落盘加密
- 登录容器引擎控制台,选择产品服务 > 云原生 > 容器引擎 CCE,在左侧导航栏选择集群管理 > 集群列表,进入集群列表页面。
- 在集群列表页面,点击列表上侧的创建集群进入集群创建页面。
- 在创建集群的集群配置页面单击高级设置,在Secret落盘配置项上勾选开启加密。
- 勾选后选择合适的KMS密钥,并完成后续集群创建步骤,集群其他配置请见创建集群,。
- 集群创建成功后,单击集群名称进入集群,在“集群详情”页面的“高级配置”中可以看到Secret落盘加密特性已开启。
在已创建集群中开启Secret落盘加密
- 登录容器引擎控制台,选择产品服务 > 云原生 > 容器引擎 CCE,在左侧导航栏选择集群管理 > 集群列表,进入集群列表页面。
- 在集群列表页面单击目标集群ID进入集群详情页面。
- 在“高级配置”中单击Secret落盘加密配置项上的开启操作。
- 在开启Secret落盘加密弹框中选择合适的KMS密钥,单击确定完成开启加密。
关闭Secret落盘加密
如果您不再需要使用数据加密功能,可关闭该功能。
- 登录容器引擎控制台,选择产品服务 > 云原生 > 容器引擎 CCE,在左侧导航栏选择集群管理 > 集群列表,进入集群列表页面。
- 在集群列表页面单击目标集群ID进入集群详情页面。
- 在“高级配置”中单击Secret落盘加密配置项上的关闭操作。
- 在关闭Secret落盘加密弹框中单击确定完成关闭加密。
使用KMS自动密钥轮转进行Secret落盘加密
长期使用同一个KMS主密钥对Secret进行落盘加密,会显著增加安全风险。对此,KMS提供了自动密钥轮换功能,该功能会根据设置的轮换周期自动轮换密钥,即系统自动生成一个新的密钥B,并替换当前使用的密钥A。更多信息请见密钥轮转。
CCE支持使用KMS自动密钥轮换功能进行Secret落盘加密。当密钥发生自动轮转时,存量的Secret仍旧使用轮转前的密钥版本进行加密,新增的Secret将使用轮转后的新密钥版本进行加密。如需确保存量的Secret也使用新的密钥版本进行加密,请在密钥发生自动轮转后,执行以下命令强制使用新的密钥版本重新加密所有的存量Secret。
Plain Text
1kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="$(date -u +'%Y-%m-%dT%H:%M:%S%z')"
