文档首页/ 云容器引擎 CCE/ 用户指南/ 集群/ 购买集群/ 使用KMS进行Secret落盘加密
更新时间:2025-08-11 GMT+08:00
分享

使用KMS进行Secret落盘加密

Secret落盘加密是Kubernetes提供的一种静态数据加密机制,通过配置EncryptionConfiguration,在Secret资源写入持久化存储(如etcd)时自动对其进行信封加密,确保敏感信息(如密码、证书、API密钥)不以明文形式存储。CCE基于华为云数据加密服务(DEW)的密钥管理服务(KMS),为托管集群提供开箱即用的Secret落盘加密能力。

Secret落盘加密介绍

在Kubernetes集群中,Secret对象用于存储应用密码、TLS证书、Docker镜像凭据等敏感信息,这些数据默认以Base64编码形式保存在etcd中。Base64编码仅是数据格式转换,属于明文存储范畴,不提供任何安全性。

CCE集群支持使用KMS主密钥对Secret资源进行自动加密。该过程依托Kubernetes的KMS Encryption Provider机制实现,采用信封加密技术,确保Secret数据在写入etcd时均以密文形式存储,并在访问时自动完成解密,从而有效降低未加密元数据和敏感内容的暴露面,并显著缩短潜在暴露窗口。其加密和解密过程如下:

  • 加密过程:kube-apiserver启动时会生成一个DEK Seed,并使用远端DEW服务的KMS主密钥对该Seed加密后缓存存储。随后,每当创建Secret资源时,kube-apiserver会基于该DEK Seed派生出一个密钥,用于加密Secret数据,加密后的Secret数据和派生的DEK存储在etcd中。
  • 解密过程:在读取Kubernetes Secret时,系统首先从etcd中获取加密的Secret数据和DEK。随后,通过调用KMS的“decrypt-datakey”接口,使用主密钥解密对DEK Seed进行解密,并通过解密后的DEK Seed获取明文DEK。最后,使用明文DEK对加密的Secret数据进行解密,还原出原始Secret并返回给用户。

详情请参考Kubernetes官方社区介绍华为云服务如何使用KMS加密数据

前提条件

  • 请确保您已经在华为云DEW服务创建了KMS密钥,且密钥CCE集群同处于一个region。关于DEW密钥管理的更多信息和相关操作,请参见创建密钥。关于DEW服务计费的详细说明,请参见计费概述
  • 请确保您的账号已经对CCE服务授予cce_trust_kms委托权限,CCE集群将使用该委托进行密钥查询和加解密等操作,您可以在第一次使用Secret落盘加密特性时,在依赖检查中对CCE授权。

    委托创建后请勿删除,否则将导致开启Secret落盘加密功能的集群不可用

约束与限制

  • v1.27及以上版本的Standard/Turbo集群支持在创建时开启Secret落盘加密功能,且仅支持使用社区KMS v2接口实现Secret落盘加密。Secret落盘加密功能开启后不支持关闭
  • 该特性当前正处于上线阶段,已发布区域请以控制台实际为准
  • 开启Secret落盘加密功能时,请勿使用DEW的控制台或OpenAPI禁用或删除创建集群时选择的密钥,否则会导致集群API Server不可用,影响业务应用的正常运行

开启Secret落盘加密

  1. 登录CCE控制台
  2. “集群管理”页面右上角单击“购买集群”,集群版本请选择v1.27及以上版本。
  3. 在页面最下方,展开“高级配置”,找到“Secret落盘加密”,开启该特性。

    开启后可以在“自定义密钥”中选择您创建的自定义KMS密钥或默认密钥。

  4. 参考购买Standard/Turbo集群填写其他配置,并完成后续集群创建步骤。
  5. 集群创建成功后,单击集群名称进入集群,在“配置中心”页面的“集群配置”版块中可以看到Secret落盘加密特性已开启。

使用KMS自动密钥轮转进行Secret落盘加密

长期使用同一个KMS主密钥对Secret进行落盘加密,会显著增加安全风险。对此,KMS提供了自动密钥轮换功能,该功能会根据设置的轮换周期(默认365天)自动轮换密钥,即系统自动生成一个新的密钥B,并替换当前使用的密钥A。

CCE支持使用KMS自动密钥轮换功能进行Secret落盘加密。当密钥发生自动轮转时,存量的Secret仍旧使用轮转前的密钥版本进行加密,新增的Secret将使用轮转后的新密钥版本进行加密。如此,既能确保新数据使用最新密钥加密,又能保持旧数据的可解密性,实现安全与可用性的平衡。

关于开启自动密钥轮转的具体步骤,请参见密钥轮换概述。开启自动密钥轮换后会产生一定费用,具体请参见开通密钥轮转如何收费

如需确保存量的Secret也使用新的密钥版本进行加密,请在密钥发生自动轮转后,执行以下命令强制使用新的密钥版本重新加密所有的存量Secret:

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="$(date -u +'%Y-%m-%dT%H:%M:%S%z')"

相关文档

相关文档