PostgreSQL 安全管理 公共权限管理

1 背景知识

假设一个用户需要读取一个模式下的所有表数据,但是这个模式下的表经常变动。导致新建的表无法读取,需要每次授权,导致DBA 工作量较多。

怎么解决这种场景问题,这就是隐式权限能够做到的功能,也是本章所要介绍的内容。

2 环境准备

\c - postgres 
DROP SCHEMA schema01 CASCADE;
DROP USER user01;
DROP USER user02;
CREATE USER user01;
CREATE USER user02;
CREATE SCHEMA schema01;
GRANT ALL ON SCHEMA schema01 TO user01;
GRANT USAGE  ON SCHEMA schema01 TO user02;
\c - user01
CREATE TABLE schema01.t01(id int);
INSERT INTO schema01.t01 VALUES(1);

3 在模式下新建的表自动授权

\c - postgres
ALTER DEFAULT PRIVILEGES FOR USER user01 
IN SCHEMA schema01
GRANT SELECT ON TABLES TO user02;

4 使用user01 创建新表

\c - user01 
CREATE TABLE schema01.t02(id int);
INSERT INTO schema01.t02 VALUES(2);

5 验证 user02 是否能够读取数据

\c - user02
SELECT * FROM  schema01.t01;

SELECT * FROM  schema01.t02; 
Note

这里可以看到t02 已经能够成功查询,但是t01 失败。

6 将存量表赋权

\c - postgres
GRANT SELECT ON ALL TABLES IN SCHEMA schema01 TO user02;

7 其他授权方式

ALTER DEFAULT PRIVILEGES FOR USER user01,user02 
IN SCHEMA S9 GRANT SELECT ON TABLES TO user03;

将 S9 的 user01 和user02 用户创建的表的查询权限赋权给user03。

8 如何查询隐式权限

SELECT relname,relacl FROM pg_class WHERE relacl::text like '%user01%';