关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
Anonymizer 是一个 YMatrix 扩展功能 ,用于屏蔽或替换 YMatrix 数据库中的个人身份信息(personally identifiable information,PII)或商业敏感数据。该能力采用声明式的匿名化方法,使用者可通过 YMatrix 数据定义语言(DDL)来声明匿名规则,并在表定义中指定匿名化策略。
注意!
当前功能仅 YMatrix 企业版支持,如需使用点击立即咨询进行演示预约。
在使用 Anonymizer 功能时,需确保当前数据库已经引入扩展。
--引入anon拓展
create extension anon;
ALTER DATABASE demo SET session_preload_libraries = 'anon';
静态脱敏是指在数据落盘或拷贝阶段,对敏感字段进行不可逆处理,或在严格受控前提下进行弱可逆脱敏,在最大程度降低数据泄露风险的同时,兼顾数据的可用性与业务分析需求。
demo=# create table customer(id serial primary key,firstname text,lastname text,phone t
ext,birth date, postcode text);
CREATE TABLE
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
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)
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)';
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)
动态脱敏是指数据在数据库中保持原始状态,仅在查询返回结果时,根据访问者身份、角色或策略规则,对敏感字段进行实时掩码或替换。
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');
mydb=# ALTER DATABASE mydb SET anon.transparent_dynamic_masking TO true;
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
mydb=# GRANT SELECT ON customers TO cfo, vip_mgr, bank_emp;
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';
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)