
# 动态脱敏
#### 操作场景
动态脱敏指的是当应用程序发起查询请求访问数据库时，数据库在将结果返回给客户端的过程中，对敏感数据进行脱敏处理的一种安全手段。TaurusDB动态脱敏功能通过添加脱敏规则实现指定库、表、列的数据进行脱敏。
#### 工作原理
使用root账户配置脱敏规则后，数据库会将脱敏规则持久化保存。当应用程序执行查询时，数据库会首先判断查询条件是否符合规则。如果符合，则会对返回的数据结果进行脱敏处理，最终将脱敏后的数据发送给客户端。
如图所示，配置的脱敏规则为：
- 仅当使用user1账号连接数据库做查询操作时生效。
- 仅对查询结果中db1并且t1表中的name和age字段进行脱敏。
除了脱敏规则表中配置的列外，返回原始数据。
图1原理图   
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002497918197.png "点击放大")
如上图所示，字符串类型name脱敏成\*\*\*\*\*\*，整数类型INT脱敏成随机正整数。不同数据类型的脱敏策略不同，详见[表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\] |
| 除上述类型之外的类型                                         | 脱敏为：\*\*\*\*\*\*                                                                                                                                                                                                                                                                                                          |
   
#### 性能影响
开启动态脱敏功能，并且配置全字段脱敏规则(add_mask_rule('', '', '', ''))，在[性能白皮书只读性能测试场景](https://support.huaweicloud.com/pwp-taurusdb/taurusdb_pwp_0002.html)下，配置128条脱敏规则，数据库性能损耗在10%左右。
#### 版本限制
TaurusDB动态脱敏功能要求内核版本为2.0.69.250900及以上版本。内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
#### 脱敏规则约束限制
- 当前仅支持对SELECT语句数据脱敏。
- 脱敏规则对系统库不生效。系统库包括：mysql、information_schema、performance_schema、sys。
- 单个数据库名、表名、列名、用户名首尾的空格和特殊空白字符（如'\\t'、'\\r'、'\\n'）在脱敏后会被忽略。
- 单个数据库名、表名、列名长度不超过64 bytes，单个用户名长度不超过32 bytes。超过此限制添加脱敏规则时将会失败。
- 脱敏规则中的管理员用户列表（rds_dynamic_masking_super_users）长度不超过4000 bytes。
- 只有root用户可以执行添加、删除、启用、禁用、更新脱敏规则操作。
- 所有用户均可执行查询脱敏规则操作。
 
#### 动态脱敏参数
在管理控制台的参数修改页面，通过设置[表2]中的参数，可以开启动态脱敏特性和管理脱敏规则。
 表2参数说明 
| 参数名称                            | 级别     | 描述                                                                                                                                                                                                                                              |
|:---|:---|:---|
| rds_dynamic_masking_enabled     | Global | 动态脱敏特性开关。 默认值为OFF。                                                                                                                                                 |
| rds_dynamic_masking_super_users | Global | 支持配置多个管理员用户，多个管理员用户之间使用英文逗号分隔。脱敏规则对管理员用户不生效。 默认值为空字符串。 示例：'user1,user2'                  |
| rds_masking_parameter_max_count | Global | 数据库名、表名、列名、用户名最大可配置个数。 默认值为100，即一条规则中最多可配置100个数据库名，100个表名，100个列名和100个用户名。 取值范围\[1, 1000\]。 |
| rds_masking_map_size            | Global | 脱敏规则的内存占用上限，单位是MB。 默认为8MB。 设置过高可能引发内存溢出（OOM），请您谨慎操作。                                    |
   
#### 使用方法
#### 添加脱敏规则
- 语法
  ```
  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')两种状态。 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);
  ```
  
 
#### 常见问题
#### 启用和禁用脱敏规则，与通过更新启用和禁用的区别是什么？
更新是根据脱敏规则ID更新脱敏规则内容（数据库名称，表名称，列名称，用户名称）等内容。启用和禁用只是根据脱敏规则ID更新对应规则是否生效和失效，无法更新具体内容。
