Anonymizer 数据脱敏

Anonymizer 是一个 YMatrix 扩展功能 ,用于屏蔽或替换 YMatrix 数据库中的个人身份信息(personally identifiable information,PII)或商业敏感数据。该能力采用声明式的匿名化方法,使用者可通过 YMatrix 数据定义语言(DDL)来声明匿名规则,并在表定义中指定匿名化策略。

注意!
当前功能仅 YMatrix 企业版支持,如需使用点击立即咨询进行演示预约。

前置条件

在使用 Anonymizer 功能时,需确保当前数据库已经引入扩展。

--引入anon拓展
create extension anon;
ALTER DATABASE demo SET session_preload_libraries = 'anon';

一、使用示例

1.静态脱敏

静态脱敏是指在数据落盘或拷贝阶段,对敏感字段进行不可逆处理,或在严格受控前提下进行弱可逆脱敏,在最大程度降低数据泄露风险的同时,兼顾数据的可用性与业务分析需求。

1.1 使用示例

  1. 建表
demo=# create table customer(id serial primary key,firstname text,lastname text,phone t
ext,birth date, postcode text);                                                       
CREATE TABLE
  1. 写入数据
demo=# insert into customer values (100,'jane','conor','18888888888','1965-10-10','1001
'),(101,'marco','skywalker',NULL,'1951-10-09','1004'),(103,'eralle','conor','17777777777','1965-07-10','10
03'),(108,'rika','Wang','19999999999','1981-10-09','1004');                               
INSERT 0 4 
  1. 查看静态脱敏前的数据
demo=# select * FROM customer;                                                         
 id  | firstname | lastname  |    phone    |   birth    | postcode                    
-----+-----------+-----------+-------------+------------+----------                   
 103 | eralle    | conor     | 17777777777 | 1965-07-10 | 1003                        
 101 | marco     | skywalker |             | 1951-10-09 | 1004                        
 100 | jane      | conor     | 18888888888 | 1965-10-10 | 1001                        
 108 | rika      | Wang      | 19999999999 | 1981-10-09 | 1004                        
(4 rows) 
  1. 定义脱敏规则
demo=# security label for anon on column customer.lastname is 'masked with function ano
n.dummy_last_name()';                                                                 
SECURITY LABEL                                                                        
demo=# security label for anon on column customer.phone is 'masked with function anon.p
artial(phone,2,$$******$$,2)';  
  1. 让脱敏规则永久生效
  • 仅对指定字段执行脱敏
demo=# SELECT anon.anonymize_column('customer','phone');                               
 anonymize_column                                                                     
------------------                                                                    
 t                                                                                    
(1 row)                                                                               

demo=# select * from customer;                                                         
 id  | firstname | lastname  |   phone    |   birth    | postcode                     
-----+-----------+-----------+------------+------------+----------                    
 103 | eralle    | conor     | 17******77 | 1965-07-10 | 1003                         
 101 | marco     | skywalker |            | 1951-10-09 | 1004                         
 100 | jane      | conor     | 18******88 | 1965-10-10 | 1001    +                    
     |           |           |            |            |                              
 108 | rika      | Wang      | 19******99 | 1981-10-09 | 1004                         
(4 rows)
  • 根据设定的脱敏规则对整个表进行脱敏
pan=# SELECT anon.anonymize_table('customer');                                        
 anonymize_table                                                                      
-----------------                                                                     
 t                                                                                    
(1 row)                                                                               

pan=# select * from customer;                                                         
 id  | firstname | lastname  |   phone    |   birth    | postcode                     
-----+-----------+-----------+------------+------------+----------                    
 103 | eralle    | Kertzmann | 17******77 | 1965-07-10 | 1003                         
 101 | marco     | McKenzie  |            | 1951-10-09 | 1004                         
 100 | jane      | Ward      | 18******88 | 1965-10-10 | 1001    +                    
     |           |           |            |            |                              
 108 | rika      | Schulist  | 19******99 | 1981-10-09 | 1004                         
(4 rows) 

2.动态脱敏

动态脱敏是指数据在数据库中保持原始状态,仅在查询返回结果时,根据访问者身份、角色或策略规则,对敏感字段进行实时掩码或替换。

2.1 数据访问权限说明

  • CFO 可查询所有用户信息;
  • VIP 客户经理(vip_mgr)只可查询除 super vip 之外的用户信息;
  • 普通员工(bank_emp)无法查询用户信息。

2.2 使用示例

  1. 创建表
mydb=# CREATE TABLE customers(       
  id     int PRIMARY KEY,              
  status text,          -- regular / vip / super vip   
  pii    text           -- 敏 感 字 段                   
) using mars3;    

mydb=# INSERT INTO customers VALUES (1,'regular','Wang Wei'), (2,'vip','Liu Han'), (3,'super vip','Ma teng'); 
  1. 激活动态屏蔽引擎
mydb=# ALTER DATABASE mydb SET anon.transparent_dynamic_masking TO true;
  1. 检查数据库中是否存在特定的用户角色(cfo、vip_mgr 和 bank_emp),如果不存在,则创建这些角色,并赋予它们登录权限。
mydb=# DO $$   
mydb$# BEGIN    
mydb$#   IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='cfo') THEN CREATE ROLE cfo LOGIN; END IF;  
mydb$#   IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='vip_mgr') THEN CREATE ROLE vip_mgr LOGIN; END IF; 
mydb$#   IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='bank_emp') THEN CREATE ROLE bank_emp LOGIN; END IF; 
mydb$# END$$;                                                                                                   
DO
  1. 授权用户查询权限
mydb=# GRANT SELECT ON customers TO cfo, vip_mgr, bank_emp;
  1. 声明屏蔽规则
mydb=# SECURITY LABEL FOR anon ON COLUMN customers.pii   
IS 'MASKED WITH FUNCTION anon.ternary(         
        (CURRENT_ROLE = ''bank_emp'')                          
        OR (CURRENT_ROLE = ''vip_mgr'' AND status = ''super vip''),  
        ''****''::text,      
        pii         
    )';   
mydb=# SECURITY LABEL FOR anon ON ROLE vip_mgr  IS 'MASKED';                                                             
mydb=# SECURITY LABEL FOR anon ON ROLE bank_emp IS 'MASKED'; 
  1. 使用不同角色用户进行查询。
mydb=# \c mydb bank_emp        
You are now connected to database "mydb" as user "bank_emp".  
mydb=> select * from customers ;   
 id |  status   | pii    
----+-----------+------    
  1 | regular   | ****     
  2 | vip       | ****   
  3 | super vip | ****   
(3 rows)        

mydb=> \c mydb cfo   
You are now connected to database "mydb" as user "cfo". 
mydb=> select * from customers ;          
 id |  status   |    pii         
----+-----------+------------   
  1 | regular   | Wang Wei     
  2 | vip       | Liu Han    
  3 | super vip | Ma teng   
(3 rows)          

mydb=> \c mydb vip_mgr                       
You are now connected to database "mydb" as user "vip_mgr".   
mydb=> select * from customers ;  
 id |  status   |   pii       
----+-----------+----------     
  1 | regular   | Wang Wei    
  2 | vip       | Liu Han    
  3 | super vip | ****                                                                       
(3 rows)