
PostgreSQL Anonymizer 是一个扩展,用于掩盖或替换 PostgreSQL 数据库中的个人可识别信息或商业敏感数据。
静态掩码 (Static Masking)
静态掩码是一种将敏感数据在数据库中永久性替换或修改的过程。一旦应用了静态掩码,原始数据就会被覆盖,无法恢复。
优点:
数据安全性提高:由于敏感数据已被永久替换,即使数据泄露,也不会暴露原始信息。
符合合规性要求:对于需要永久删除或替换特定信息以满足法规要求的场景非常有用。
适合非生产环境:在测试或开发环境中使用静态掩码可以确保使用的是去敏感化的数据,减少泄露风险。
缺点:
不可逆:一旦应用,原始数据就无法恢复,这可能导致某些用例中的数据不再有用。
性能开销:根据数据库的大小,静态掩码可能需要显著的处理时间和资源。
数据价值降低:对于需要保持数据统计特性或分析价值的场合,静态掩码可能不是最佳选择。
动态掩码 (Dynamic Masking)
动态掩码是一种在数据被访问时实时应用掩码规则的过程,不修改存储在数据库中的原始数据,而是在查询结果返回给用户之前对数据进行掩码处理。
优点:
灵活性和透明性:可以根据用户的角色或权限动态地显示不同级别的数据细节,而不需要修改原始数据。
数据价值保留:原始数据保持不变,确保了数据的完整性和分析价值。
即时保护:适用于需要即时保护数据安全的环境,如生产环境中的实时数据访问。
缺点:
性能影响:动态掩码可能会增加数据库查询的处理时间,尤其是在数据量大或访问频繁的情况下。
安全性依赖于实现:如果动态掩码规则配置不当,可能会导致敏感信息的意外泄露。
管理复杂性:需要维护掩码规则和访问控制策略,对于有大量用户和复杂权限设置的环境来说,管理难度较高。
安装:
#下载地址
https://gitlab.com/dalibo/postgresql_anonymizer/-/releases
#将postgresql_anonymizer-master.tar.gz文件拷贝至/opt目录下并解压
tar zxvf postgresql_anonymizer-master.tar.gz
#切换目录
[postgres@wypg16 opt]$ cd postgresql_anonymizer-master
[postgres@wypg16 postgresql_anonymizer-master]$
#执行安装
make
make install
#登录psql执行
postgres=# ALTER DATABASE postgres SET session_preload_libraries = 'anon';
ALTER DATABASE
#重启配置生效
[postgres@wypg16 postgresql_anonymizer-master]$ pg_ctl reload
server signaled
#创建并检查插件
postgres=# CREATE EXTENSION anon
postgres-# ;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
anon | 1.3.1 | public | Data anonymization tools
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
#初始化插件
postgres=# SELECT anon.init();
init
------
t
(1 row)
案例:
#创建wytb01表,增加数据
postgres=# create table wytb01(name varchar(20),tel varchar(20));
CREATE TABLE
postgres=# insert into wytb01 values('wuyang','13840348888');
INSERT 0 1
postgres=# insert into wytb01 values('laoxu','1384034666');
INSERT 0 1
#查看数据
postgres=# select * from wytb01;
name | tel
--------+-------------
wuyang | 13840348888
laoxu | 1384034666
(2 rows)
#定义加密规则
postgres=# SECURITY LABEL FOR anon ON COLUMN wytb01.tel
postgres-# IS 'MASKED WITH FUNCTION anon.partial(tel,2,$$******$$,2)';
SECURITY LABEL
#定义加密用户wuyang,目的为使用wuyang用户登录后,查询表字段tel为动态加密后的效果
postgres=# CREATE ROLE wuyang LOGIN;
CREATE ROLE
postgres=# SECURITY LABEL FOR anon ON ROLE wuyang IS 'MASKED';
SECURITY LABEL
#开启动态加密
postgres=# SELECT anon.start_dynamic_masking()
postgres-# ;
start_dynamic_masking
-----------------------
t
(1 row)
#切换用户后查询wytb01表数据
postgres=# \c - wuyang
You are now connected to database "postgres" as user "wuyang".
postgres=> select * from wytb01;
name | tel
--------+------------
wuyang | 13******88
laoxu | 13******66
(2 rows)






