
# 使用KMS进行Secret落盘加密
Secret落盘加密是Kubernetes提供的一种静态数据加密机制，通过配置EncryptionConfiguration，在Secret资源写入持久化存储（如etcd）时自动对其进行信封加密，确保敏感信息（如密码、证书、API密钥）不以明文形式存储。CCE基于华为云密码安全中心（DEW）的[密钥管理服务（KMS）](https://support.huaweicloud.com/usermanual-dew/dew_01_7775.html)，为托管集群提供开箱即用的Secret落盘加密能力。
#### Secret落盘加密介绍
在Kubernetes集群中，Secret对象用于存储应用密码、TLS证书、Docker镜像凭据等敏感信息，这些数据默认以Base64编码形式保存在etcd中。Base64编码仅是数据格式转换，属于明文存储范畴，不提供任何安全性。
CCE集群支持使用KMS主密钥对Secret资源进行自动加密。该过程依托Kubernetes的[KMS Encryption Provider机制](https://kubernetes.io/docs/tasks/administer-cluster/kms-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官方社区介绍](https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kms-provider/)和[华为云服务如何使用KMS加密数据](https://support.huaweicloud.com/dew_faq/dew_01_0053.html)。
#### 前提条件
- 请确保您已经在华为云DEW服务创建了KMS密钥，且密钥CCE集群同处于一个region。关于DEW密钥管理的更多信息和相关操作，请参见[创建密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html)。关于DEW服务计费的详细说明，请参见[计费概述](https://support.huaweicloud.com/price-dew/dew_03_0001.html)。
- 请确保您的账号已经对CCE服务授予cce_trust_kms委托权限，CCE集群将使用该委托进行密钥查询和加解密等操作，您可以在第一次使用Secret落盘加密特性时，在依赖检查中对CCE授权。 **委托创建后请勿删除，否则将导致开启Secret落盘加密功能的集群不可用**。
  
 
#### 约束与限制
- v1.27及以上版本的Standard/Turbo集群支持在创建时开启Secret落盘加密功能，且仅支持使用[社区KMS v2接口](https://kubernetes.io/blog/2023/05/16/kms-v2-moves-to-beta/)实现Secret落盘加密。**Secret落盘加密功能开启后不支持关闭**。
- 该特性当前正处于上线阶段，**已发布区域请以控制台实际为准**。
- 开启Secret落盘加密功能时，**请勿使用DEW的控制台或OpenAPI禁用或删除创建集群时选择的密钥，否则会导致集群API Server不可用，影响业务应用的正常运行**。
 
#### 开启Secret落盘加密
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 在"集群管理"页面右上角单击"购买集群"，集群版本请选择v1.27及以上版本。
3. 在页面最下方，展开"高级配置"，找到"Secret落盘加密"，开启该特性。 
   开启后可以在"自定义密钥"中选择您创建的自定义KMS密钥或默认密钥。
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001994246421.png "点击放大")
   
   
4. 参考[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)填写其他配置，并完成后续集群创建步骤。
5. 集群创建成功后，单击集群名称进入集群，在"配置中心"页面的"集群配置"版块中可以看到Secret落盘加密特性已开启。
 
#### 使用KMS自动密钥轮转进行Secret落盘加密
长期使用同一个KMS主密钥对Secret进行落盘加密，会显著增加安全风险。对此，KMS提供了自动密钥轮换功能，该功能会根据设置的轮换周期（默认365天）自动轮换密钥，即系统自动生成一个新的密钥B，并替换当前使用的密钥A。
CCE支持使用KMS自动密钥轮换功能进行Secret落盘加密。当密钥发生自动轮转时，存量的Secret仍旧使用轮转前的密钥版本进行加密，新增的Secret将使用轮转后的新密钥版本进行加密。如此，既能确保新数据使用最新密钥加密，又能保持旧数据的可解密性，实现安全与可用性的平衡。
关于开启自动密钥轮转的具体步骤，请参见[密钥轮换概述](https://support.huaweicloud.com/usermanual-dew/dew_01_0139.html)。开启自动密钥轮换后会产生一定费用，具体请参见[开通密钥轮转如何收费](https://support.huaweicloud.com/price-dew/dew_01_0234.html)。
如需确保存量的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')"
```
#### 相关文档
- 关于Secret落盘加密的更多介绍，请参见[使用KMS驱动进行数据加密](https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kms-provider/)。
- 信封加密的具体解释，请参见[华为云服务如何使用KMS加密数据](https://support.huaweicloud.com/dew_faq/dew_01_0053.html)。
- 开启自动密钥轮转的具体步骤，请参见[密钥轮换概述](https://support.huaweicloud.com/usermanual-dew/dew_01_0139.html)。
 
