作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL(本章节)
Redis
Etcd
上个小节我们对PostgreSQL做了基本介绍,最后配置出来的账号大约等同于MySQL的xx账号具有连接xxx的能力,本小节继续介绍其他权限。
组权限
我们这里构建一个场景,2个(甚至更多个)应用都会使用同一个库,各自都有自己的密码,权限有组进行统一管控。
-- 创建组角色(无需登录权限,仅用于权限聚合)
CREATE ROLE app_group NOLOGIN;
-- 授予组角色对目标数据库的连接权限
GRANT CONNECT ON DATABASE 目标库名 TO app_group;
-- 切换到目标数据库(必须先连接才能授予库内权限)
\c 目标库名;
-- 授予组角色对 public 模式的访问权限
GRANT USAGE ON SCHEMA public TO app_group;
-- 授予组角色对现有表的操作权限(根据需求调整,如 CRUD)
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_group;2.为应用创建用户角色并加入组
-- 创建应用1的用户(带登录权限和密码)
CREATE USER app1_user WITH LOGIN PASSWORD 'app1_pwd';
-- 创建应用2的用户
CREATE USER app2_user WITH LOGIN PASSWORD 'app2_pwd';
-- 将用户加入组角色,继承组的所有权限
GRANT app_group TO app1_user;
GRANT app_group TO app2_user;权限继承
通过我们上个小节或者前面的配置,如果我们配置的时候库里面已经有10个表,但是我们后面业务增加还会出现新的库表。上面的配置账号是没有权限操作新表的。
这是 PostgreSQL 权限管理的一个重要特性 ——权限不会自动应用于未来新建的对象,必须通过额外配置才能让新表继承权限。
如果希望 myuser 对未来在 public 模式中新建的表也自动拥有 ALL 权限,需要使用 ALTER DEFAULT PRIVILEGES 命令:
-- 对未来在 public 模式中新建的表,自动授予 myuser 所有权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO myuser;-- 也可以指定新创建指定的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT ON TABLES TO myuser;权限回收(REVOKE)
讲解回收权限之前需要明白一个概念就是GRANT 是 “叠加” 而非 “覆盖”,所以多次执行权限,只能增加权限,而不会减少权限。要减少就必须使用权限回收。
假设用户原本拥有 SELECT, INSERT, UPDATE, DELETE 权限:
REVOKE DELETE ON TABLE users FROM myuser; 用户剩余权限为 SELECT, INSERT, UPDATE。GRANT SELECT, INSERT, UPDATE ON TABLE users TO myuser; 它的实际权限是不变的。对于通过角色继承获得的权限,必须从被继承的角色(父角色)中回收权限,才能彻底移除用户的该权限。直接对用户执行 REVOKE 无效,因为用户的权限来源于角色,而非直接授予。
app_group 被授予了 users 表的 DELETE 权限。myuser 是 app_group 的成员(即 myuser 继承了 app_group 的权限)。-- 从 app_group 中回收 DELETE 权限
REVOKE DELETE ON TABLE users FROM app_group;-- 直接对 myuser 执行 REVOKE 无法移除继承的权限
REVOKE DELETE ON TABLE users FROM myuser; -- 无效!查看权限
postgres=# \x
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname = 'myuser';
-[ RECORD 1 ]--+---------
rolname | myuser
rolsuper | f #是否未超级角色
rolinherit | t #是否允许继承权限
rolcreaterole | f #是否允许创建角色
rolcreatedb | f #是否允许创建数据库
rolcanlogin | t #是否允许登录
rolreplication | f #是否允许复制(主从配置 )
rolconnlimit | -1 #是否有连接数限制
rolpassword | ********
rolvaliduntil |
rolbypassrls | f
rolconfig |
oid | 16386