
# 配置RDS for MySQL实例动态脱敏
#### 功能简介
动态脱敏是数据库在发送给客户端的时候，对数据进行脱敏的一种安全技术手段。RDS for MySQL的动态脱敏功能支持通过添加脱敏规则实现指定库、表、列对数据进行脱敏。
图1拓扑图   
![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002418584529.png "点击放大")
![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
开启动态脱敏功能，并且配置全字段脱敏规则(add_mask_rule('', '', '', ''))，使用Sysbench工具压测，导入128张表，每张表25000行数据，QPS值大约为40万时，数据库性能损耗在5%以内。
QPS：Query Per Second，数据库每秒执行的SQL数。
#### 版本限制
RDS for MySQL动态脱敏功能要求内核版本为8.0.32.250300及以上版本。
#### 功能限制
- 当前仅支持对SELECT语句数据脱敏。
- 脱敏规则对系统库不生效。系统库包括：mysql、information_schema、performance_schema、sys。
- 单个数据库名、表名、列名、用户名首尾的空格和特殊空白字符（如'\\t'、'\\r'、'\\n'）都会被忽略。
- 单个数据库名、表名、列名长度不超过64 bytes，单个用户名长度不超过32 bytes。
- 管理员用户列表（rds_dynamic_masking_super_users）长度不超过1024 bytes。
- 不同数据类型的脱敏处理不同，详见[表1]。
   表1脱敏处理说明 
  | 数据类型                                               | 脱敏处理说明                                                                                                                                                                                                                                                                                    |
  |:---|:---|
  | 整数型（TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、BOOLEAN） | 脱敏为正整数。                                                                                                                                                                                                                                                                                   |
  | 小数型（DECIMAL、FLOAT、DOUBLE）                          | 脱敏为正整数。                                                                                                                                                                                                                                                                                   |
  | 时间型（YEAR）                                          | 脱敏为正整数。                                                                                                                                                                                                                                                                                   |
  | 时间型（DATE、TIME、DATETIME、TIMESTAMP）                  | DATE脱敏之后的范围：\[1000:01:01,9999:12:31.499999\] TIME脱敏之后的范围：\[00:00:00,838:59:59.499999\] DATETIME、TIMESTAMP取值范围：\[1971:01:01 00:00:00, 2037:12:31 23:59:59.49999\] |
  | 字符串类型                                              | 脱敏为：\*\*\*\*\*\*                                                                                                                                                                                                                                                                          |
     
  
 
#### RDS for MySQL动态脱敏相关参数
表2参数说明 
| **参数名称**                        | **级别** | **描述**                                                                                                                                 |
|:---|:---|:---|
| rds_dynamic_masking_enabled     | Global | 动态脱敏特性开关。默认值为OFF。                                                                                                                      |
| rds_dynamic_masking_super_users | Global | 支持配置多个管理员用户。默认值为空字符串('')。 多个管理员用户之间使用英文逗号(,)分隔，脱敏规则对管理员用户不生效。示例：'user1,user2' |
| rds_masking_paramter_max_count  | Global | 数据库名、表名、列名、用户名最大可配置个数。默认值为100，取值范围\[1, 1000\]。                                                                                         |
   
#### 使用方法
#### 添加脱敏规则
- 语法
  ```
  CALL dbms_mask.add_mask_rule(
           db_name text,
           table_name text,
           column_name text,
           user_name text);
  ```
  表3参数说明 
  | 参数          | 类型   | 说明                                                                                                                                                                 |
  |:---|:---|:---|
  | db_name     | text | 脱敏规则的数据库名称。 支持配置多个数据库名称，多个数据库名称之间使用英文逗号(,)分隔。当db_name为空字符串('')时，表示当前脱敏规则对所有数据库生效。                       |
  | table_name  | text | 脱敏规则的表名称。 支持配置多个表名称，多个表名称之间使用英文逗号(,)分隔。当table_name为空字符串('')时，表示当前脱敏规则对db_name指定数据库下的所有表生效。              |
  | column_name | text | 脱敏规则的列名称。 支持配置多个列名称，多个列名称之间使用英文逗号(,)分隔。当column_name为空字符串('')时，表示当前脱敏规则对db_name指定数据库下table_name指定表的所有列生效。 |
  | user_name   | text | 脱敏规则的用户名称。 支持配置多个用户名称，多个用户名称之间使用英文逗号(,)分隔。当user_name为空字符串('')时，表示当前脱敏规则对所有用户生效（不包含管理员用户）。             |
     
  
- 权限限制 只有root用户可以执行添加脱敏规则操作。
  
- 操作示例
  - 添加一条脱敏规则，db_1、db_2数据库下tab_a表的col_a和col_b列对用户user1和user2脱敏生效。
    ```
    CALL dbms_mask.add_mask_rule('db_1,db_2', 'tab_a', 'col_a,col_b', 'user1,user2');
    ```
    
  
  - 添加一条脱敏规则，所有数据库下所有表的所有列对所有用户脱敏生效。
    ```
    CALL dbms_mask.add_mask_rule('', '', '', '');
    ```
    
   
 
#### 查询脱敏规则
- 语法
  ```
  CALL dbms_mask.show_mask_rule();
  ```
  
- 权限限制 所有用户均可执行查询脱敏规则操作。
  
- 操作示例
  ```
  CALL dbms_mask.show_mask_rule();
  ```
  
 
#### 删除脱敏规则
- 语法
  ```
  CALL dbms_mask.delete_mask_rule(mask_id bigint);
  ```
  表4参数说明 
  | 参数      | 类型     | 说明      |
  |:---|:---|:---|
  | mask_id | bigint | 脱敏规则ID。 |
     
  
- 权限限制 只有root用户可以执行删除脱敏规则操作。
  
- 操作示例 删除脱敏规则ID为2的脱敏规则。
  ```
  CALL dbms_mask.delete_mask_rule(2);
  ```
  
 
#### 更新脱敏规则
- 语法
  ```
  CALL dbms_mask.update_mask_rule(
           mask_id bigint,
           enabled enum('N','Y'),
           db_name text,
           table_name text,
           column_name text,
           user_name text);
  ```
  表5参数说明 
  | 参数          | 类型     | 说明                                                                                                      |
  |:---|:---|:---|
  | mask_id     | bigint | 脱敏规则ID。                                                                                                 |
  | enabled     | enum   | 脱敏规则启用状态。支持启用('Y')和禁用('N')两种状态。                                                                         |
  | db_name     | text   | 脱敏规则的数据库名称。支持配置多个数据库名称，多个数据库名称之间使用英文逗号(,)分隔。当db_name为空字符串('')时，表示当前脱敏规则对所有数据库生效。                        |
  | table_name  | text   | 脱敏规则的表名称。支持配置多个表名称，多个表名称之间使用英文逗号(,)分隔。当table_name为空字符串('')时，表示当前脱敏规则对db_name指定数据库下的所有表生效。               |
  | column_name | text   | 脱敏规则的列名称。支持配置多个列名称，多个列名称之间使用英文逗号(,)分隔。当column_name为空字符串('')时，表示当前脱敏规则对db_name指定数据库下table_name指定表的所有列生效。 |
  | user_name   | text   | 脱敏规则的用户名称。支持配置多个用户名称，多个用户名称之间使用英文逗号(,)分隔。当user_name为空字符串('')时，表示当前脱敏规则对所有用户生效（不包含管理员用户）。                |
     
  
- 权限限制 只有root用户可以执行更新脱敏规则操作。
  
- 操作示例 更新脱敏规则ID为1的脱敏规则。更新该条规则的为禁用状态，db_test数据库下tab_1表所有列对用户user1数据脱敏。
  ```
  CALL dbms_mask.update_mask_rule(1,'N','db_test', 'tab_1', '', 'user1');
  ```
  
 
#### 启用脱敏规则
- 语法
  ```
  CALL dbms_mask.enable_mask_rule(mask_id bigint);
  ```
  表6参数说明 
  | 参数      | 类型     | 说明      |
  |:---|:---|:---|
  | mask_id | bigint | 脱敏规则ID。 |
     
  
- 权限限制 只有root用户可以执行启用脱敏规则操作。
  
- 操作示例 启用脱敏规则ID为2的脱敏规则。
  ```
  CALL dbms_mask.enable_mask_rule(2);
  ```
  
 
#### 禁用脱敏规则
- 语法
  ```
  CALL dbms_mask.disable_mask_rule(mask_id bigint);
  ```
  表7参数说明 
  | 参数      | 类型     | 说明      |
  |:---|:---|:---|
  | mask_id | bigint | 脱敏规则ID。 |
     
  
- 权限限制 只有root用户可以执行禁用脱敏规则操作。
  
- 操作示例 禁用脱敏规则ID为2的脱敏规则。
  ```
  CALL dbms_mask.disable_mask_rule(2);
  ```
  
 
