引言
磐维数据库中常见存储的数据库对象有:
- 表空间(tablespace)
- 数据库(database)
- 模式(schema)
- 表(table|relation)
- 视图(view)
- 索引(index)
- 序列(sequence)
- 约束(constraint)
- PL/SQL对象等
无论哪个对象,用户对其做出的任何操作都需要相关权限,否则会返回“ERROR——权限拒绝”。数据库user/role被设计作为权限的载体,实现对象的访问控制。除了初始的超级管理员用户自带数据库所有的权限,其他用户在创建时几乎不会附带任何显式权限,后期可以根据需求对普通角色进行授权,实现对象权限的细粒度控制,保障数据安全。
用户和角色
用户(user)和角色(role)在本质上是不同的概念,但是在实际场景中我们几乎不会刻意划分两者(本文中也不刻意区分)。它们比较大的区别就是用户在创建时会被隐式赋予login系统权限并创建同名schema,所以user默认有权限登录到任意database里,但是role在未授权前无法登录任意database。
create user u1 with password 'Panwei@123';
#等同于
create role u1 with login password 'Panwei@123';
create schema authorization u1;
权限分类
几乎所有数据库对于数据库权限都分为两类:
- 系统权限:系统权限又称为用户属性,包括SYSADMIN、MONADMIN、OPRADMIN、POLADMIN、AUDITADMIN、CREATEDB、USEFT、CREATEROLE、LOGIN、REPLICATION、INDEPENDENT、VCADMIN等,这些系统权限的作用不在这里赘述。
- 对象权限:对数据库常见对象的create、alter、drop、usage以及对表数据的增删改查权限等。
授权场景
- 对于系统权限,通常是在创建用户时指定或者后期通过修改用户属性的方式进行授权(或撤权):
create user u1 with CREATEDB REPLICATION password 'Panwei@123';
alter user u1 NOREPLICATION;
- 对于对象权限,高权用户通过关键字grant赋予给所需用户:
grant create on database postgres to u1;
revoke create on database postgres from u1;
常见的对象权限汇总如下:
对象的owner缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限(with grant option)属于所有者固有的隐式权限,需要注意的是,grant仅仅能对已存在的数据库对象进行授权,无法对后续创建的对象同时自动赋予相关权限,这一点可以使用ALTER DEFAULT PRIVILEGES命令实现:
#u1用户在u1模式下新建的表会自动赋予u2查询权
alter default privileges for user u1 in schema u1 grant select on tables to u2;
- 用户之间的授权
因为用户/角色作为权限集合的载体(系统权限和对象权限),对于普通用户而言,直接继承其他用户的权限往往更加便捷
#将u2添加为u1的组成员,享受u1已有的对象权限,但是不包括u1已有的系统权限
grant u1 to u2
revoke可以撤销已经赋予的权限:
revoke 权限/角色 from user ;
- 级联授权
当高权角色给到某一用户相关权限之后,如果该用户希望拥有该权限的再分配能力,可以通过“with grant option”实现
# 超级用户omm给u1授权
grant create on database postgres to u1 with grant option;
# u1给其他用户授权
\c postgres u1
grant create on database postgres to u2
注意,当超级用户omm回收u1的权限时,需要使用cascade级联回收u2的相关权限。
revoke create on database postgres from u1 cascade;
权限查询
查询用户具有的系统权限可以通过gsql元命令:\du、\dg或直接通过pg_authid查看
查询用户已有数据库对象(表)的权限可以通过information_schema下的权限视图table_privileges
SELECT grantee, table_catalog, table_schema, table_name, string_agg(privilege_type,',') FROM information_schema.table_privileges where grantee='username' group by 1,2,3,4;
或者通过gsql元命令\dp、\z
总结
在磐维数据库中,用户和角色是作为一系列系统权限和对象权限的载体,常见的系统权限如SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN,常见的对象权限如create、alter、drop、usage、comment,合理的授权是对象细粒度控制的安全准则之一,对不需要的权限需要进行及时的回收处理。