PostgreSQL 安全管理 数据脱敏 视图

1 创建用户

这里创建两个用户:一个是 blog 用户,用于博客的应用程序,另外一个 anon_analyse 用户,用于展示和统计博客网站用户注册和获奖的信息。

CREATE USER    blog;
CREATE USER   anon_analyse;
GRANT ALL ON SCHEMA public to blog;
//屏幕输出:
CREATE ROLE
CREATE ROLE
GRANT

2 创建表和视图

2.1 切换为 blog 用户

SET ROLE blog;
//屏幕输出:
SET

2.2 创建用户信息表

CREATE TABLE   user_list(id int, user_name name, phone_number name);
INSERT INTO   user_list values(1, '张三', '15623897820');
INSERT INTO   user_list values(1, '李四', '15623788290');
//屏幕输出:
CREATE TABLE
INSERT 0 1
INSERT 0 1
\dt+
                                      List of relations
 Schema |   Name    | Type  | Owner | Persistence | Access method |    Size    | Description 
--------+-----------+-------+-------+-------------+---------------+------------+-------------
 public | user_list | table | blog  | permanent   | heap          | 8192 bytes | 
(1 row)

2.3 创建视图

这里使用 SELECT 语句中函数和拼接字符串功能,将敏感信息屏蔽达到脱敏的效果。使用 substring 函数提取电话号码的前三位和后四位。中间四位将会被 * 替换。

CREATE OR   REPLACE VIEW user_list_view AS
    SELECT 
            S.id,
            S.user_name,
            substring(S.phone_number, 1,3) ||   '******' ||substring(S.phone_number, 8,11) as phone_number
    FROM user_list AS S;
    
//屏幕输出:
CREATE VIEW

3 授予合适的权限

GRANT ALL ON   user_list_view TO anon_analyse ;

4 测试和验证

RESET ROLE;
SET ROLE   anon_analyse;
//屏幕输出:
RESET
SET
SELECT * FROM   user_list;

//屏幕输出:
ERROR:  permission denied for table user_list
SELECT * FROM   user_list_view;
//屏幕输出:
 id | user_name | phone_number  
----+-----------+---------------
  1 | 张三      | 156******7820
  1 | 李四      | 156******8290
(2 rows)