
# 开启透明数据加密功能
#### 操作场景
透明数据加密（Transparent Data Encryption，简称TDE），对数据文件执行实时I/O加密和解密，数据在写入磁盘之前进行加密，从磁盘读入内存时进行解密，能有效保护数据库及数据文件的安全。
TDE主要应对以下的场景：
- 硬盘被盗导致数据泄露。
- 黑客入侵系统进行文件复制导致数据泄露。在没有启用TDE的情况下，只要获得了数据库文件，即可直接浏览数据库中的所有内容，但如果在数据库上启用了TDE并对指定表进行加密，没有密钥就不能访问到数据。
 
#### 版本限制
云数据库 RDS for MySQL的TDE功能支持以下版本：
- 8.0，对应的小版本为8.0.32.250300及以上版本。
- 5.7，对应的小版本为5.7.38.221000及以上版本。
 
实例版本的查询方法请参见[如何查看云数据库RDS实例的版本号](https://support.huaweicloud.com/rds-mysql_faq/rds_faq_0211.html)。
#### 性能说明
加密表的数据触发I/O时，加解密算法额外的计算开销，会给CPU带来额外的负载。
在通用场景下，实例的CPU未达到瓶颈时，加密表读写的性能影响在5%以内。
CPU小于8核的实例在高并发、CPU负载高的场景下，加密表的I/O密集型业务会产生更高的劣化，劣化幅度与业务模型和加密算法有关，国密SM4算法加密的数据比AES劣化幅度更大。
#### 功能限制
表1约束限制 
| 阶段       | 限制说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|
| TDE开启前   | - 使用TDE功能需要创建委托RDSAccessProjectResource并添加IAM授权项，详见[权限管理](https://support.huaweicloud.com/productdesc-rds-mysql/rds_01_0017.html)。  - 开启TDE后不支持关闭TDE。  - 云数据库 RDS for MySQL实例已开通密钥管理服务（Key Management Service，KMS），加密使用的用户主密钥由KMS产生和管理，RDS不提供加密所需的密钥和证书。  - 以下场景的实例不支持开启TDE： - 开启跨区域备份后不支持开启TDE。  - CBR快照备份不支持开启TDE。  - 开启备份转储后不支持开启TDE。  - 集群版实例不支持TDE加密。    - TDE加密为数据库数据加密，包括全量备份，不包括增量备份。  - TDE加密功能一旦开启，将不允许关闭，请您谨慎操作。                                                                                                                                                                                                                           |
| TDE开启过程中 | - TDE开启过程中，不会重启实例，但会显著增加CPU使用率，因此建议在业务低峰期操作。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| TDE开启后   | - 开启TDE后，实例的功能限制： - 不支持异地容灾备份。  - 不支持备份转储到OBS。  - 不支持快照备份。  - 不支持关闭TDE以及修改默认主密钥。  - TDE加密的备份不支持恢复到已有其他已存在实例。  - 按指定时间点恢复(PITR)时，不允许恢复到其他已存在实例。  - 使用自定义密钥创建的手动备份，只能下载，不能恢复。  - 使用默认密钥创建的手动备份和自动备份，不能下载。  - 不支持大版本升级。    - 开启TDE后执行[加密或解密表]操作，需注意以下几点： - 确保常用数据库工具仍能正常使用。  - 由于查询表数据时会解密并读取到内存中，因此查询加密的数据时结果仍是明文数据。使用SQL加密后，新建的备份文件是加密后的密文数据，可以防止备份泄漏导致数据泄漏。     |
   
 #### 步骤1：开启TDE加密
1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
3. 在"实例管理"页面，单击目标实例名称，进入实例的"概览"页面。
4. 单击"TDE状态"后的"开启"。 
   图1开启实例级别的TDE加密功能   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212222252.png "点击放大")
   
   
5. 在弹出框中，单击"确定"，开启TDE加密功能。 
   图2TDE开启   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002736663235.png "点击放大")
   
   
 
 #### 步骤2：执行表数据加密或解密
TDE开启后，表数据不会自动加密，需要执行以下SQL加密。
1. [连接目标实例](https://support.huaweicloud.com/usermanual-rds-mysql/rds_mysql_connect_01.html)。
2. 执行如下命令对表进行加密或解密，*tablename* 为需要加密或解密的表名。
   
   - 加密
     ```
     alter table tablename encryption='Y';
     ```
     
   
   - 解密
     ```
     alter table tablename encryption='N';
     ```
     
   
   
   **alter table *tablename*encryption='Y';** 或 **alter table** ***tablename*encryption='N';** 都属于algorithm=COPY的DDL语句。与其他algorithm=COPY的DDL语句一样，由于实现方式是创建一张新表，拷贝所有数据后重命名，会导致以下现象：
   - 在DDL执行完毕后，对该表的查询会有短暂时间的性能抖动。
   
   - 在缓冲池（buffer pool）没打满的情况下，内存负载会增高。
   
   
   
   
 
#### 后续操作
TDE开通并对表数据进行SQL加密后，如果您需要恢复数据到本地，参考以下两种方式：
- 方式1：通过解密数据
  1. 通过RDS解密数据，请参考[解密表]。
  
  2. 创建该数据库的手动备份。
  
  3. 获取备份文件并通过备份文件恢复数据。
   
- 方式2：使用过渡密钥"--transition-key"
  1. 通过管理控制台创建手动备份时，按提示输入自定义的密钥字符串，对数据进行重新加密，详情请参考[创建手动备份](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0005.html)。
     图3自定义加密方式   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002698420751.png "点击放大") 
  
  2. 下载全量备份文件，使用第三方全量备份工具Percona XtraBackup进行本地恢复。
     1. prepare 阶段： --transition-key = {自定义密钥}
     
     2. copy-back阶段：--transition-key={自定义密钥} --generate-new-master-key
      
   
 
#### 常见问题
#### 磁盘加密、备份加密、TDE加密之间有哪些区别？
表2各类加密方式的区别 
| 加密方式                                                                          | 作用范围                        | 密钥          | 是否支持备份加密                                                                                                             |
|:---|:---|:---|:---|
| [磁盘加密](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0025.html) | 对磁盘上的数据进行加密。                | 需要提前创建密钥。   | 开启磁盘加密后，存放在对象存储服务上的备份数据不会被加密，如需开通备份数据加密，请[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)申请。 |
| [备份加密](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0050.html) | 对OBS上的备份数据进行加密。             | 需要提前创建密钥。   | 支持                                                                                                                   |
| [TDE加密]            | 对数据文件执行实时I/O加密和解密（内核层面加解密）。 | 由KMS自动生成密钥。 | 支持                                                                                                                   |
   
