摘要:有些状况下,有些表的特定列含有敏感数据,如何让特定的人看到特定的数据呢?

1 需要

有些状况下,有些表的特定列含有敏感数据(如用户信息表中,用户手机号),天然,咱们只想让“管理员”用户看到这些敏感数据,其余用户咱们心愿其看到“解决后的”—— 脱敏的数据。

2 实现计划介绍

计划1: 应用pg匿名化插件postgresql_anonymizer;

计划2: 应用视图进行脱敏;

2.1 计划1: 应用pg匿名化插件postgresql_anonymizer

(示例来自插件官网文档)

-- 批改配置文件:   shared_preload_libraries = 'pg_stat_statements, anon'-- 1. 创立并激活插件CREATE   EXTENSION IF NOT EXISTS anon CASCADE;SELECT   anon.mask_init();-- 2.申明屏蔽的用户CREATE ROLE   skynet;COMMENT ON   ROLE skynet IS 'MASKED';-- 3.申明屏蔽规定COMMENT ON   COLUMN people.name IS 'MASKED WITH FUNCTION anon.random_last_name()';COMMENT ON   COLUMN people.phone IS 'MASKED WITH FUNCTION   anon.partial(phone,2,$$******$$,2)';-- 4. 查问屏蔽敏感信息的用户\! psql test   -U skynet -c 'SELECT * FROM people;' id    |   name   |     phone-----+----------+------------T800 |   n3xtchen | 13******11

2.2 计划2:应用视图进行脱敏

(示例来自本地开发环境)

-- 1. 创立测试用户create user   root;create user   normal_user;-- 2. 切换到root建表 & 视图set role root;create table   user_phone_number(id int, user_name name, phone_number name);insert into   user_phone_number values(1, '张三', '12345678');insert into   user_phone_number values(1, '李四', '56781234');create or   replace view member_phone_number as    SELECT            S.id,            S.user_name,            substring(S.phone_number, 1,1) ||   '******' ||substring(S.phone_number, 8,8) as phone_number    FROM user_phone_number AS S;-- 3. 回收表的权限,授予普通用户view权限revoke all on   user_phone_number from public;grant all on   member_phone_number to normal_user;-- 4. 应用普通用户测试reset role;set role   normal_user;select * from   user_phone_number;select * from   member_phone_number;

后果如下:

3 优缺点比拟

总的来看,喜爱“偷懒”、喜爱尝鲜的话,能够应用 postgresql_anonymizer 插件;但如果谋求稳固,倡议应用视图来实现。

4 参考

  1. PostgreSQL: 匿名化(Anonymizer)工具 官网:https://labs.dalibo.com/postg..._anonymizer
  2. PostgreSQL: 匿名化(Anonymizer)工具 官网文档: https://postgresql-anonymizer...

点击关注,第一工夫理解华为云陈腐技术~