
# 使用KMS进行Secret落盘加密
Secret落盘加密是Kubernetes提供的一种静态数据加密机制，通过配置EncryptionConfiguration，在Secret资源写入持久化存储（如etcd）时自动对其进行信封加密，确保敏感信息（如密码、证书、API密钥）不以明文形式存储。KMS为CCE（云容器引擎）托管集群提供开箱即用的Secret落盘加密能力。
#### 应用场景
在Kubernetes集群中，Secret对象通常用于存储敏感信息，例如数据库密码、API密钥、证书等。通过KMS对Secret进行落盘加密，可以确保这些敏感数据在存储时处于加密状态，从而提升数据安全性。许多行业和组织面临严格的数据保护和合规性要求，例如金融、医疗等领域。采用KMS进行Secret落盘加密能够帮助企业满足这些合规要求，保障数据在存储和传输过程中的安全性。在多租户环境中，不同租户需要隔离和保护各自的敏感数据。KMS可以为每个租户提供独立的密钥管理，确保不同租户的数据不会相互泄露。KMS支持密钥的自动化管理与轮换，可有效降低手动管理密钥的复杂性和风险。通过自动化管理，能够确保密钥的生命周期管理更加安全高效。KMS通常提供详细的审计日志和监控功能，有助于企业追踪密钥使用情况，及时发现并应对潜在的安全威胁。综上所述，KMS能够有效提升Kubernetes集群中Secret的存储安全性，防止敏感数据被未授权访问。
#### 加密机制
在Kubernetes集群中，Secret对象用于存储应用密码、TLS证书、Docker镜像凭据等敏感信息，这些数据默认以Base64编码形式保存在etcd中。Base64编码仅是数据格式转换，属于明文存储范畴，不提供任何安全性。
KMS主密钥支持对CCE集群中的Secret资源进行自动加密。该过程依托Kubernetes的KMS Encryption Provider机制实现，采用信封加密技术，确保Secret数据在写入etcd时均以密文形式存储，并在访问时自动完成解密，从而有效降低未加密元数据和敏感内容的暴露面，并显著缩短潜在暴露窗口。其加密和解密过程如下：
- 加密过程：kube-apiserver启动时会生成一个DEK Seed，并使用远端的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并返回给用户。
#### 前提条件
- 请确保您已经创建了KMS密钥，且密钥CCE集群同处于一个region。
- 请确保您的账号已经对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不可用，影响业务应用的正常运行。
 
#### 操作步骤
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 在"集群管理"页面右上角单击"购买集群"，集群版本请选择v1.27及以上版本。
3. 在页面最下方，展开"高级配置"，找到"Secret落盘加密"，开启该特性。 
   开启后可以在"自定义密钥"中选择您创建的自定义KMS密钥或默认密钥。
   图1Secret落盘加密   
   ![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002571686932.png "点击放大")
   
   
4. 参考[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)填写其他配置，并完成后续集群创建步骤。
5. 集群创建成功后，单击集群名称进入集群，在"配置中心"页面的"集群配置"版块中可以看到Secret落盘加密特性已开启。
 
#### 使用KMS自动密钥轮转进行Secret落盘加密
长期使用同一个KMS主密钥对Secret进行落盘加密，会显著增加安全风险。对此，KMS提供了自动密钥轮换功能，该功能会根据设置的轮换周期（默认365天）自动轮换密钥，即系统自动生成一个新的密钥B，并替换当前使用的密钥A。
KMS的自动密钥轮换功能支持CCE进行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')"
```
