# CREATE MASKING POLICY
#### 功能描述
创建脱敏策略。
#### 注意事项
- 仅POLADMIN、SYSADMIN以及初始用户可以执行此操作。
- 需要开启安全策略开关（GUC参数enable_security_policy设置为on），脱敏策略才可以生效。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
在使用DATABASE LINK功能的场景下，客户端发起的DATABASE LINK请求，实际的发送方是服务端，发送端IP地址等相关的属性将是服务端的值。具体的使用方式请参见《开发指南》中"特性使用指导 \> DATABASE LINK"章节。
#### 语法格式
```
CREATE MASKING POLICY policy_name masking_clause[, ...] [ policy_filter_clause ] [ENABLE | DISABLE];
```
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788313.png "点击放大")
- masking_clause：
  ```
  masking_function ON LABEL(label_name[, ...])
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708113.png "点击放大")
  
- masking_function： maskall不是预置函数，不支持\\df展示。
  预置的脱敏方式如下：
  ```
  { maskall | randommasking | creditcardmasking | basicemailmasking | fullemailmasking | shufflemasking | alldigitsmasking | regexpmasking }
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469504.png)
  

- policy_filter_clause:
  ```
  FILTER ON { FILTER_TYPE ( filter_value [, ...] ) } [, ...]
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309576.png "点击放大")
  

- FILTER_TYPE:
  ```
  { APP | ROLES | IP }
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309574.png)
  
 
#### 参数说明
- **policy_name**
  脱敏策略名称，需要符合唯一约束。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)且最大长度不超过63个字符。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 脱敏策略名称若超过63个字符，数据库会截断并保留前63个字符当做脱敏策略名称。
  
  - 当脱敏策略名称中包含大写字母时，数据库会自动转换为小写字母，如果需要创建包含大写字母的脱敏策略名称，则需要使用双引号进行包裹。
  
  - 脱敏策略名称需要为小写字母（a\~z）、大写字母（A\~Z）、下划线（_）、数字（0\~9）或美元符号（$），且必须以字母或下划线开头。
    
- **label_name**
  资源标签名称。
  
- **masking_clause**
  对指定的数据库资源（label_name）进行脱敏操作的脱敏函数标识，支持通过schema.function的方式指定脱敏函数。
  
- **policy_filter**
  脱敏策略生效的用户标识，若为空表示对所有用户生效。
  

- **FILTER_TYPE**
  描述策略过滤的条件类型，包括IP、APP以及ROLES。
  
- **filter_value**
  具体过滤信息内容，例如具体的IP、具体的APP名称以及具体的用户名。
  

- **ENABLE \| DISABLE**
  是否开启脱敏策略。若不指定ENABLE或DISABLE，默认为ENABLE。
  
 
#### 示例
- 创建使用maskall的脱敏策略（将字符串类型的所有值脱敏为x，其他类型的值显示为默认值）。
  ```
  --创建一个表tb_for_masking。
  gaussdb=# CREATE TABLE tb_for_masking(idx int, col1 text, col2 text, col3 text, col4 text, col5 text, col6 text, col7 text,col8 text);
  --向表tb_for_masking中插入数据。
  gaussdb=# INSERT INTO tb_for_masking VALUES(1, '9876543210', 'usr321usr', 'abc@huawei.com', 'abc@huawei.com', '1234-4567-7890-0123', 'abcdef 123456 ui 323 jsfd321 j3k2l3', '4880-9898-4545-2525', 'this is a llt case'); 
  --查看数据。
  gaussdb=# SELECT * FROM tb_for_masking;
   idx |    col1    |   col2    |      col3      |      col4      |        col5         |                col6           
        |        col7         |        col8        
  -----+------------+-----------+----------------+----------------+---------------------+-------------------------------
  ------+---------------------+--------------------
     1 | 9876543210 | usr321usr | abc@huawei.com | abc@huawei.com | 1234-4567-7890-0123 | abcdef 123456 ui 323 jsfd321 j
  3k2l3 | 4880-9898-4545-2525 | this is a llt case
  (1 row)
  --创建资源标签标记敏感列col1。
  gaussdb=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1);
  --创建一个名为maskpol1的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1);
  --访问tb_for_masking表，col1列触发脱敏策略。
  gaussdb=# SELECT col1 FROM tb_for_masking;
      col1    
  ------------
   xxxxxxxxxx
  (1 row)
  ```
  

- 创建使用randommasking的脱敏策略（将字符串类型的值脱敏为随机数字，并且每次访问结果随机）。
  ```
  --创建资源标签标记敏感列col2。
  gaussdb=# CREATE RESOURCE LABEL mask_lb2 ADD COLUMN(tb_for_masking.col2);
  --创建一个名为maskpol2的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol2 randommasking ON LABEL(mask_lb2);
  --访问tb_for_masking表，col2列触发脱敏策略。
  gaussdb=# SELECT col2 FROM tb_for_masking;
     col2    
  -----------
   0e8612d9a
  (1 row)
  ```
  

- 创建使用basicemailmasking的脱敏策略（将字符串类型邮箱格式值@符号之前的所有数据内容设为x）。
  ```
  --创建资源标签标记敏感列col3。
  gaussdb=# CREATE RESOURCE LABEL mask_lb3 ADD COLUMN(tb_for_masking.col3);
  --创建一个名为maskpol3的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol3 basicemailmasking ON LABEL(mask_lb3);
  --访问tb_for_masking表，col3列触发脱敏策略。
  gaussdb=# SELECT col3 FROM tb_for_masking;
       col3      
  ----------------
   xxx@huawei.com
  (1 row)
  ```
  

- 创建使用fullemailmasking的脱敏策略（将字符串类型邮箱格式值仅保留@符号和邮箱dot结尾，其余全部设为x）。
  ```
  --创建资源标签标记敏感列col4。
  gaussdb=# CREATE RESOURCE LABEL mask_lb4 ADD COLUMN(tb_for_masking.col4);
  --创建一个名为maskpol4的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol4 fullemailmasking ON LABEL(mask_lb4);
  --访问tb_for_masking表，col4列触发脱敏策略。
  gaussdb=# SELECT col4 FROM tb_for_masking; 
      col4      
  ----------------
   xxx@xxxxxx.com
  (1 row)
  ```
  

- 创建使用creditcardmasking的脱敏策略（将字符串类型的值保留连接符号-和末尾4位数字，其余全部设为x）。
  ```
  --创建资源标签标记敏感列col5。
  gaussdb=# CREATE RESOURCE LABEL mask_lb5 ADD COLUMN(tb_for_masking.col5);
  --创建一个名为maskpol5的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol5 creditcardmasking ON LABEL(mask_lb5);
  --访问tb_for_masking表，col5列触发脱敏策略。
  gaussdb=# SELECT col5 FROM tb_for_masking;
         col5         
  ---------------------
   xxxx-xxxx-xxxx-0123
  (1 row)
  ```
  

- 创建使用shufflemasking的脱敏策略（将字符串类型的值交换位置）。
  ```
  --创建资源标签标记敏感列col6。
  gaussdb=# CREATE RESOURCE LABEL mask_lb6 ADD COLUMN(tb_for_masking.col6);
  --创建一个名为maskpol6的脱敏策略。
  gaussdb=#  CREATE MASKING POLICY maskpol6 shufflemasking ON LABEL(mask_lb6);
  --访问tb_for_masking表，col6列触发脱敏策略。
  gaussdb=# SELECT col6 FROM tb_for_masking;
                 col6                 
  -------------------------------------
   2 b6jusfd54c3312 13d23lk3jf3  2eai 
  (1 row)
  ```
  

- 创建使用regexpmasking的脱敏策略（将字符串类型的值进行正则表达式脱敏）。
  ```
  --创建资源标签标记敏感列col7。
  gaussdb=# CREATE RESOURCE LABEL mask_lb7 ADD COLUMN(tb_for_masking.col7);
  --创建一个名为maskpol7的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol7 regexpmasking('[\d+]','*',2, 9) ON LABEL(mask_lb7);
  --访问tb_for_masking表，col7列触发脱敏策略。
  gaussdb=# SELECT col7 FROM tb_for_masking;    
          col7         
  ---------------------
   48**-****-*545-2525
  (1 row)
  ```
  

- 创建仅对用户dev_mask和bob_mask、客户端工具为gsql、IP地址为'172.31.17.160', '127.0.0.0/24'场景下生效的脱敏策略。
  ```
  --创建dev_mask和bob_mask用户。
  gaussdb=# CREATE USER dev_mask PASSWORD '********';
  gaussdb=# CREATE USER bob_mask PASSWORD '*********';
  --创建资源标签标记敏感列col8。
  gaussdb=# CREATE RESOURCE LABEL mask_lb8 ADD COLUMN(tb_for_masking.col8); 
  --创建一个名为maskpol8的脱敏策略。
  gaussdb=# CREATE MASKING POLICY maskpol8 randommasking ON LABEL(mask_lb8) FILTER ON ROLES(dev_mask, bob_mask), APP(gsql), IP('172.31.17.160', '127.0.0.0/24');
  --访问tb_for_masking表，col8列触发脱敏策略。
  gaussdb=# SELECT * FROM tb_for_masking;
  --使用gsql工具,IP地址为'172.31.17.160',用户dev_mask查看tb_for_masking。
  gaussdb=# GRANT ALL PRIVILEGES TO dev_mask;
  --使用maskpol8脱敏，结果随机，每次不同。
  gaussdb=# SELECT col8 FROM tb_for_masking;
          col8        
  --------------------
   cf32a9aa427f219ab0
  (1 row)
  gaussdb=# SELECT col8 FROM tb_for_masking;
          col8        
  --------------------
   13efa056dda1e1a474
  (1 row)
  ```
  
- 删除数据。
  ```
  --删除脱敏策略。
  gaussdb=# DROP MASKING POLICY maskpol1, maskpol2, maskpol3, maskpol4, maskpol5, maskpol6, maskpol7, maskpol8;
  --删除资源标签。
  gaussdb=# DROP RESOURCE LABEL mask_lb1, mask_lb2, mask_lb3, mask_lb4, mask_lb5, mask_lb6, mask_lb7, mask_lb8;
  --删除表tb_for_masking。
  gaussdb=# DROP TABLE tb_for_masking;
  --删除用户dev_mask和bob_mask。
  gaussdb=# DROP USER dev_mask, bob_mask;
  ```
  
 
#### 相关链接
[ALTER MASKING POLICY](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0195.html)，[DROP MASKING POLICY](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0305.html)
