GaussDB 数据库架构师修炼(十三)安全管理(2)-数据库权限管理
1 用户和角色
基于角色的访问控制( Role-Based Access Control,简称RBAC ),是通过将权限赋予给对应的角色,再将角色授予给用户,可实现用户访问控制权限管理。
对于GaussDB来说,用户和角色是几乎等同的两个概念,唯一的区别是在创建用户的时候会默认授予用户LOGIN权限,而且会自动创建与用户同名的模式。
用户( USER)主要用来连接数据库,创建、访问数据库对象和执行SQL语句。
角色( ROLE)通常用来组织和管理权限。
通过将多种权限打包成角色授予用户,使得用户获得该角色的所 有权限;若改变角色的权限,则继承该角色的用户权限会被自动 修改。一个用户也可以继承多个不同角色的权限。
使用角色控制哪些用户拥有哪些对象的哪些权限,可以大大简化权限的管理。
2 角色管理
1)创建用户/角色:
CREATE USER/ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [EXPIRED] | DISABLE };
注: UNENCRYPTED已禁止使用
2)修改用户/角色:
ALTER USER/ROLE role_name [ [ WITH ] option [ ... ] ];
3)删除用户/角色:
DROP USER/ROLE [ IF EXISTS ] role_name [, ...];
4)授予/回收用户/角色:
GRANT role_name TO role_name [ WITH ADMIN OPTION ]; REVOKE [ ADMIN OPTION FOR ] role_name FROM role_name [ CASCADE | RESTRICT ];
子句option语法为:
{SYSADMIN | NOSYSADMIN} 系统管理员
| {MONADMIN | NOMONADMIN} 监控管理员 |
{OPRADMIN | NOOPRADMIN} 运维管理员
| {POLADMIN | NOPOLADMIN} 策略管理员
| {AUDITADMIN | NOAUDITADMIN} 审计管理员
| {CREATEROLE | NOCREATEROLE} 安全管理员
| {PERSISTENCE | NOPERSISTENCE} 永久用户
| {CREATEDB | NOCREATEDB} 创建数据库权限
| {LOGIN | NOLOGIN} 数据库登录权限
3 角色管理 - 举例
举例1:创建角色role1和role2,密码均为Gauss@123
gaussdb=>
gaussdb=> CREATE ROLE role1 WITH password 'Gauss@123';
CREATE ROLE
gaussdb=> CREATE ROLE role2 WITH password 'Gauss@123';
CREATE ROLE
举例2:修改角色role1具有LOGIN属性。
gaussdb=> ALTER ROLE role1 WITH LOGIN;
ALTER ROLE
gaussdb=>
举例3:查看系统视图pg_roles获取角色的相关信息。
gaussdb=>
gaussdb=> SELECT oid, rolname, rolcanlogin,rolpassword FROM pg_roles WHERE rolname='role1' or rolname='role2';
举例4:将角色role1授予role2,则角色role2属于组role1, 继承role1的相应权限,查看系统表pg_auth_members获 取角色成员关系。
gaussdb=> GRANT role1 TO role2;
GRANT ROLE
gaussdb=>
gaussdb=>
SELECT * FROM pg_auth_members;
举例5:删除角色role1和role2
gaussdb=> DROP ROLE role1,role2;
DROP ROLE
gaussdb=>
4 系统权限介绍
系统权限:又称用户属性,指系统规定用户使用数据库的权限,比如连接数据库( LOGIN ),创建数 据库(CREATEDB),创建用户(CREATEROLE)等。
通过CREATE USER/ROLE和ALTER USER/ROLE来指定系统权限;系统权限不能通过角色被继承。
例1:创建角色role1,同时授予role1创建用户的权限和创建数据库的权限。
create role role1 with createrole createdb password '*******';
例2:授予用户role1监控管理员的权限,同时取消创建数据库的权限
gaussdb=> alter role role1 with monadmin nocreatedb;
ALTER ROLE
例3:查看系统视图pg_roles获取角色的相关信息。
SELECT rolname,rolcreaterole,rolcreatedb,rolmonitoradmin FROM pg_roles WHERE rolname='role1';
5 系统权限 - 三权分立
- 初始安装用户:集群安装过程中自动生成的帐户 ,拥有系统的最高权限 ,能够执行所有的操作。
- SYSADMIN:系统管理员权限 ,权限仅次于初始安装用户 ,默认具有与对象所有者相同的权限 ,但不包括监控管理员权限和运维管理员权限。
- MONADMIN:监控管理员权限,具有监控模式dbe_perf及模式下视图和函数的访问权限和授予权限。
- OPRADMIN:运维管理员权限 ,具有使用Roach工具执行备份恢复的权限。
- CREATEROLE:安全管理员权限 ,具有创建 、修改 、删除用户/角色的权限。
- AUDITADMIN: 审计管理员权限 ,具有查看和维护数据库审计日志的权限。
6 对象权限
1) 对象权限管理层级
2) 对象权限支持的类型及对应关系
- 对象权限:指在数据库、模式、表等数据库对象上执行特定动作的权限,比如: SELECT 、INSERT 、 UPDATE 、DELETE 、CONNECT等。
- 针对不同的数据库对象有不同的对象权限,相应地可以被授予用户/角色。
- 通过GRANT/REVOKE来传递对象权限,对象权限可以通过角色被继承。
7 对象权限 - 授权与回收
例1:将对表tbl进行select的权限以及将select再赋权的权限授予用户user1
csdn=> GRANT select ON TABLE tbl TO user1 WITH GRANT OPTION;
GRANT
csdn=>
csdn=>
赋权后用户user1可以对tbl进行查询(SELECT)操作且user1有权限将select权限再赋予其他用户
例2:将对表tbl进行alter和drop的权限赋给用户user1 。
csdn=> GRANT alter, drop ON TABLE tbl TO user1;
GRANT
csdn=>
csdn=>
赋权后用户user1可以对tbl进行修改( ALTER )和删除( DROP)操作。
举3:撤销用户user1对表tbl进行select的权限。
csdn=> REVOKE select ON tbl FROM user1;
REVOKE
csdn=>
csdn=>
撤销后用户user1对tbl进行select操作会报错: ERROR: permission denied for relation tbl
8 对象权限 ACL字段说明
例:查看系统表pg_class的relacl字段获取表相关的授权信息。
csdn=> select relacl from pg_class where relname='tbl';relacl
------------------------------------{csdn=ar*wdDxt/csdn,user1=AP/csdn}
(1 row)
说明:
1)表tbl为用户omm所拥有的表,默认具有表tbl的所有权限。
2)用户user1具有表tbl的select的权限以及将select再赋权的权限。
3)用户user2具有表tbl的select权限。