更新时间:2025-06-27 GMT+08:00
动态数据脱敏
数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。当管理员指定待脱敏对象和定制数据脱敏策略后,用户所查询的数据库资源如果关联到对应的脱敏策略时,则会根据用户身份和脱敏策略进行数据脱敏,从而限制非授权用户对隐私数据的访问。
特性约束
- 动态数据脱敏策略需要由具备POLADMIN或SYSADMIN属性的用户或初始用户创建,普通用户没有访问安全策略系统表和系统视图的权限。
- 动态数据脱敏只在配置了脱敏策略的数据表上生效,而审计日志不在脱敏策略的生效范围内。
- 在一个脱敏策略中,对于同一个资源标签仅可指定一种脱敏方式,不可重复指定。
- 不允许多个脱敏策略对同一个资源标签进行脱敏,除以下脱敏场景外:使用FILTER指定策略生效的用户场景,包含相同资源标签的脱敏策略间FILTER生效场景无交集,此时可以根据用户场景明确辨别资源标签被哪种策略脱敏。
- Filter中的APP项建议仅在同一信任域内使用,由于客户端不可避免的可能出现伪造名称的情况,该选项使用时需要与客户端联合形成一套安全机制,减少误用风险。一般情况下不建议使用,使用时需要注意客户端仿冒的风险。
- 对于带有query子句的INSERT或MERGE INTO操作,如果源表中包含脱敏列,则上述两种操作中插入或更新的结果为脱敏后的值,且不可还原。
- 在内置安全策略开关开启的情况下,执行ALTER TABLE EXCHANGE PARTITION操作的源表若在脱敏列则执行失败。
- 对于设置了动态数据脱敏策略的表,需要谨慎授予其他用户对该表的trigger权限,以免其他用户利用触发器绕过脱敏策略。
- 最多支持创建98个动态数据脱敏策略。
- 仅支持对只包含COLUMN属性的资源标签做脱敏。
- 仅支持对普通表且为永久表的列进行数据脱敏。
- 仅支持对SELECT直接查询到的数据进行脱敏,对已脱敏结果进行二次处理会导致脱敏策略失效或不符合预期。
- 应用于动态数据脱敏的UDF只支持标准数据库SQL、PL/SQL function。
- 应用于动态数据脱敏的UDF中,如果包含访问数据库资源的语句如(select, insert),使用该UDF的动态数据脱敏结果可能会不符合预期或导致安全风险。
- 应用于动态数据脱敏的UDF创建脱敏策略成功后,如果对该脱敏列进行alter或者drop,会导致脱敏策略失效或不符合预期。
- 动态数据脱敏的UDF函数不支持使用SECURITY INVOKER函数。应用于动态数据脱敏的UDF创建脱敏策略成功后,不允许对该function进行create、alter或drop。
- 应用于动态数据脱敏的UDF只能由具有poladmin权限用户创建。由具有poladmin权限的用户将访问schema的usage权限赋予public,如果因为grant/revoke操作,导致用户不能访问UDF,则使用maskall脱敏。
- 应用于动态数据脱敏的UDF应为幂等,即多次执行结果一样。如果设置UDF为非幂等,在分布式场景下使用UDF的动态数据脱敏结果可能会不符合预期。
- 不支持在系统表上应用动态数据脱敏的UDF创建脱敏策略。
- FILTER中的IP地址以IPv4为例支持如下格式:
IP地址格式
示例
单IP
127.0.0.1
掩码表示IP
127.0.0.1|255.255.255.0
cidr表示IP
127.0.0.1/24
IP区间
127.0.0.1-127.0.0.5
- 不支持通过gs_dump导出动态数据脱敏策略。系统管理员或安全策略管理员可以访问GS_MASKING_POLICY、GS_MASKING_POLICY_ACTIONS、GS_MASKING_POLICY_FILTERS系统表查询已创建的动态数据脱敏策略。
查看动态数据脱敏基本配置
- 设置并查看动态数据脱敏功能是否已开启。
gs_guc reload -Z datanode -N all -I all -c "enable_security_policy=on"
enable_security_policy取值为on时表示开启,取值为off是表示关闭。gaussdb=# SHOW enable_security_policy; enable_security_policy ----------------------- on (1 row)
创建脱敏策略
- 创建数据表。
--创建一个表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)
- 创建资源标签。
--创建资源标签标记敏感列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
- 创建脱敏策略。
该语法详细格式参考:《开发指南》中“SQL参考 > SQL语法 > 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
- 查新tb_for_masking表的脱敏列数据。
--访问tb_for_masking表,col1列触发脱敏策略。 gaussdb=# SELECT col1 FROM tb_for_masking; col5 ------------ xxxxxxxxxx (1 row) --访问tb_for_masking表,col5列触发脱敏策略。 gaussdb=# SELECT col5 FROM tb_for_masking; col5 --------------------- 1234-xxxx-xxxx-0123 (1 row)
- 清理数据。
--删除脱敏策略。 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