# 使用KMS对DWS集群进行加密
DWS支持为集群启用数据库加密，以保护静态数据。当您为集群启用加密时，该集群及其快照的数据都会得到加密处理。数据库加密是在数据落盘时进行加密，即在往DWS写入数据时DWS会对数据进行加密，而在用户查询数据时DWS会将数据自动进行解密后再将结果返回给用户。
如果希望加密，可以在集群创建时启用加密或创建后进行转加密操作。虽然加密是DWS集群中的一项可选设置，但建议您为集群启用该设置以保护数据。
#### 约束与限制
- 存算分离集群仅9.1.0及以上集群版本支持数据库转加密功能。
- 容灾集群不支持转加密。如果该集群存在容灾关系，即使集群在"可用"状态也无法转加密，用户需先解除容灾关系，转加密成功后再重新建立容灾关系。
- 数据库加密功能创建集群时选择是否开启，一旦开启就无法关闭。详情请参见[加密数据库](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html#ZH-CN_TOPIC_0000002587225472__table33801415822)。普通集群创建完后，可以通过转加密集群功能，将集群转成加密集群。
- 开启数据库加密功能后，用于加密DWS数据库的KMS密钥在使用过程中不能被禁用、删除或冻结，否则会导致DWS集群异常或数据库不可用。
- 开启数据库加密功能后创建的快照不支持使用openAPI做恢复。
- 选择加密级别特性仅支持9.1.1.200及以上集群版本和8.6.1及以上管控面版本。
 
#### 使用KMS服务加密DWS数据库原理流程
当选择KMS（密钥管理服务）对DWS进行密钥管理时，加密密钥层次结构有三层。按层次结构顺序排列，这些密钥为主密钥（CMK）、集群加密密钥 (CEK)、数据库加密密钥 (DEK)。
- 主密钥用于给CEK加密，保存在KMS中。
- CEK用于加密DEK，CEK明文保存在DWS集群内存中，密文保存在DWS服务中。
- DEK用于加密数据库中的数据，DEK明文保存在DWS集群内存中，密文保存在DWS服务中。
 
#### 9.1.1.200以下集群版本密钥使用流程
1. 用户选择主密钥。
2. DWS随机生成CEK和DEK明文。
3. KMS用户所选的主密钥加密CEK明文并将加密后的CEK密文导入到DWS服务中。
4. DWS使用CEK明文加密DEK明文并将加密后的DEK密文保存到DWS服务中。
5. DWS将DEK明文传递到集群中并加载到集群内存中。 当该集群重启时，集群会自动通过API向DWS请求DEK明文，DWS将CEK、DEK密文加载到集群内存中，再调用KMS使用主密钥CMK来解密CEK，并加载到集群内存中，最后用CEK明文解密DEK，并加载到集群内存中，返回给集群。
   
 
#### 9.1.1.200及以上集群版本密钥使用流程
1. 用户选择主密钥。
2. DWS将用户所选的主密钥创建授权给对应租户的资源租户。
3. 集群访问KMS生成DEK明文并加密该DEK明文，保存DEK密文到集群中，DEK明文加载到集群内存中。
 
#### 加密密钥轮转原理流程（9.1.1.200以下集群版本适用）
加密密钥轮转是指更新保存在DWS服务的密文。在DWS中，您可以轮转已加密集群的加密密钥CEK。
密钥轮转流程如下：
1. DWS集群启动密钥轮转。
2. DWS根据集群的主密钥来解密保存在DWS服务中的CEK密文，获取CEK明文。
3. 用获取到的CEK明文解密保存在DWS服务中的DEK密文，获取DEK明文。
4. DWS重新生成新的CEK明文。
5. DWS用新的CEK明文加密DEK并将DEK密文保存在DWS服务中。
6. 用主密钥加密新的CEK明文并将CEK密文保存在DWS服务中。
您可以根据业务需求和数据类型计划轮转加密密钥的时间。为了提高数据的安全性，建议用户定期执行轮转密钥以避免密钥被破解的风险。一旦您发现密钥可能已泄露，请及时轮转密钥。
- DWS轮转集群的CEK时，集群相关的快照不需要轮转CEK，因为CEK不会在集群快照中进行保存，CEK明文是保存在DWS集群内存中的，密文是保存在DWS服务中的。
- 由于密钥轮转不更新DEK，所以对于数据的加解密不会有影响。
 
#### 创建KMS委托（9.1.1.200以下集群版本适用）
如果用户没有提前创建具有KMS Administrator权限的委托，首次启用数据库加密时，系统会弹出一个**"创建委托"** 的对话框，单击**"确定"**创建委托以授权DWS访问KMS（默认情况下，只有华为云账号或拥有Security Administrator权限的用户才具备查询委托和创建委托的权限。账号中的IAM用户，默认没有查询委托和创建委托的权限，此时需联系有权限的用户提前创建好授权给DWS具有KMS Administrator权限的委托）。
1. 鼠标移动至页面右上角账号，单击**"统一身份认证"**，进入统一身份认证服务页面。
2. 在左侧导航栏单击**"委托"** ，在委托页面右上角单击**"创建委托"** 。
   
   ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617625377.png "点击放大")
   
   
3. 创建委托时委托类型选择**"云服务"** ，云服务选择**"数据仓库服务 DWS"**。
4. 单击**"完成"** 后，在弹窗中单击**"立即授权"** 对委托授予KMS服务的**"KMS Administrator"** 权限。
   
   ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617625375.png "点击放大")
   
   
5. 单击**"下一步"** ，选择授权资源范围为**"所有资源"**或需要访问的资源，然后确认无误后提交。
 
 #### 未加密集群转为加密集群
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航栏中，选择**"集群 \> 集群列表"**。
3. 集群列表中，在指定集群所在行操作列选择**"更多 \> 转加密集群"** （集群状态需为**"可用"** ）。
   
   为了保障数据的安全，由于转加密集群是**不可逆的** **高危操作**，会重启集群，可能会导致有业务短暂不可用，用户请谨慎操作。
   
   
4. 在弹出选择框中，选择密钥源、密钥名称和加密算法。9.1.1.200及以上集群版本支持选择加密级别**（集群级或者表级）** ，并且不再依赖租户的委托，修改为依赖KMS的授权。
   
   - 方式一：从密钥中选择密钥名称。用户可通过[创建共享](https://support.huaweicloud.com/usermanual-ram/ram_03_0003.html)操作，共享给其他成员KMS资源。被共享成员[接受共享邀请](https://support.huaweicloud.com/usermanual-ram/ram_03_0011.html)后即可在密钥源中选择共享的KMS资源。
     图1从密钥中选择   
     ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617505275.png "点击放大")
     
     
   
   - 方式二：输入密钥ID。输入在KMS侧给当前租户进行授权的KMS密钥ID，详情请参见[查看密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0179.html)。
     当跳转至KMS侧[创建授权](https://support.huaweicloud.com/usermanual-dew/dew_01_0096.html)时被授权对象**必须是账号，不能是用户** 。并且授权操作必须至少包含**"查询密钥信息"** **、"加密数据"** **、"解密数据"**3项权限。
     图2输入密钥   
     ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587225606.png "点击放大")
     
     
   
   
   表1参数说明 
   | 参数    | 参数说明                                                                                                                                                                                                                                                                                                              |
   |:---|:---|
   | 加密级别    | 加密级别包含以下选项，该选项仅支持9.1.1.200及以上集群版本： - 集群级加密  - 表级加密                    |
   | 密钥源  | 用户可选择从密钥中选择密钥名称或直接输入密钥。                                                                                                                                                                                                                                                                                          |
   | 加密算法 | 加密算法包含： - AES-CTR-128（通用加密算法，不支持SM系列商密算法）  - SM4（支持SM系列商密算法，兼容国际通用算法）   |
      
   
   
5. 确认无误后，单击**"确定"** 。转换后用户可单击集群名称，进入**"集群详情"** 页面查看，详情请参见[查看数据库加密信息]。
 
#### 为DWS集群轮转加密密钥
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航树，单击**"集群 \> 集群列表"**。
3. 在集群列表中找到所需要的集群，然后单击集群名称，进入**"集群详情"**页面。
4. 在**"集群详情"** 页面的**"数据加密信息"** 区域，单击**"轮转密钥"** 。
   
   每执行一次密钥轮转，就更新一次集群加密密钥（CEK）。执行密钥轮转时，集群仍处于**"可用"**状态。
   
   
5. 在弹出的对话框中，单击**"是"**为集群轮转一次加密密钥。
 
 #### 查看数据库加密信息
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 单击左侧导航栏的**"集群 \> 集群列表"**。
3. 在集群列表中，单击指定集群名称，进入**"集群详情"**页面。
4. 在**"集群详情"** 页面的**"数据加密信息"** 区域查看数据库加密信息，如[表2]所示。
   
   如果创建集群时默认没有开启数据库加密功能，则在集群详情页面不显示加密信息模块。
    表2数据加密信息 
   | 参数        | 参数说明                                                                                                                                                                                                                                                                                                                                                                                      |
   |:---|:---|
   | 加密级别       | 加密级别包含以下选项，该选项仅支持9.1.1.200及以上集群版本： - 集群级加密  - 表级加密                                                                                           |
   | 密钥名称      | 当"加密数据库"开启时，显示集群的数据库加密密钥。单击**"修改"** 可修改KMS主密钥名称，支持选择密钥名称和输入密钥ID两种方式。修改参数详情请参见[4]。                                                                                                                                                                                                                                                        |
   | 上次密钥轮转时间 | 当"加密数据库"开启时，显示上一次加密密钥轮转的时间。                                                                                                                                                                                                                                                                                                                                                            |
   | 加密算法       | 当"加密数据库"开启时，显示集群的加密算法。 加密算法包含： - AES-CTR-128（通用加密算法，不支持SM系列商密算法）。  - SM4（支持SM系列商密算法，兼容国际通用算法）。   |
      
   
   
 
