
# 动态数据脱敏
数据脱敏是行之有效的数据库隐私保护方案之一，可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术，可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。当管理员指定待脱敏对象和定制数据脱敏策略后，用户所查询的数据库资源如果关联到对应的脱敏策略时，则会根据用户身份和脱敏策略进行数据脱敏，从而限制非授权用户对隐私数据的访问。
#### 查看动态数据脱敏基本配置
请输入如下命令查看动态数据脱敏功能是否已开启。
```
gaussdb=# SHOW enable_security_policy;
 enable_security_policy
-----------------------
 on
(1 row)
```
enable_security_policy取值为on时表示开启，取值为off时表示关闭。如果显示为off时请参考《参考》中"数据库运行参数说明 \> GUC参数说明 \> 安全配置"章节进行设置。
#### 创建脱敏策略
1. 创建数据表。 
   ```
   --创建一个表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@example.com', 'abc@example.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@example.com | abc@example.com | 1234-4567-7890-0123 | abcdef 123456 ui 323 jsfd321 j
   3k2l3 | 4880-9898-4545-2525 | this is a llt case
   (1 row)
   ```
   
   
2. 创建资源标签。 
   ```
   --创建资源标签标记敏感列col1。
   gaussdb=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1);
   CREATE RESOURCE LABEL
   gaussdb=# CREATE RESOURCE LABEL mask_lb5 ADD COLUMN(tb_for_masking.col5);
   CREATE RESOURCE LABEL
   ```
   
   
3. 创建脱敏策略。 
   该语法详细格式参考：《参考》中"SQL参考 \> SQL语法 \> C \> CREATE MASKING POLICY"章节。
   ```
   --创建一个名为maskpol1的脱敏策略。
   gaussdb=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1);
   CREATE MASKING POLICY
   ```
   动态数据脱敏配置脱敏策略时，支持适配用户创建的自定义函数。
   ```
   gaussdb=# create or replace function msk_creditcard(col text) returns TEXT as $$
   declare
       result TEXT;
   begin
       result := overlay(col placing 'xxxx-xxxx' from 6);
       return result;
   end;
   $$ language plpgsql security DEFINER;
   CREATE FUNCTION
   --创建一个名为maskpol5的脱敏策略。
   gaussdb=# CREATE MASKING POLICY maskpol5 msk_creditcard ON LABEL(mask_lb5);
   CREATE MASKING POLICY
   ```
   
   
4. 查询tb_for_masking表的脱敏列数据。 
   ```
   --访问tb_for_masking表，col1列触发脱敏策略。
   gaussdb=# SELECT col1 FROM tb_for_masking;
       col1    
   ------------
    xxxxxxxxxx
   (1 row)
   --访问tb_for_masking表，col5列触发脱敏策略。
   gaussdb=# SELECT col5 FROM tb_for_masking;
           col5
   ---------------------
    1234-xxxx-xxxx-0123
   (1 row)
   ```
   
   
5. 清理数据。 
   ```
   --删除脱敏策略。
   gaussdb=# DROP MASKING POLICY maskpol1, maskpol5;
   DROP MASKING POLICY
   --删除资源标签。
   gaussdb=# DROP RESOURCE LABEL mask_lb1, mask_lb5;
   DROP RESOURCE LABEL
   --删除表tb_for_masking。
   gaussdb=# DROP TABLE tb_for_masking;
   DROP TABLE
   ```
   
   
 
