MogDB/openGauss 数据库中关于用户角色这部分有一个大家熟知的特性:三权分立,即从安全性考虑将系统管理的权限分离出安全管理员和审计管理员,这里暂时先不考虑三权分立这个特性,仅从user/role 开发运维层面进行整理。
MogDB数据库版本:3.0.0
定义
角色是拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。
从创建用户和角色的语义(create user/role)上看也没有区别,唯一的区别就是用户默认带有login权限。官方文档里也明确的指出
查询用户相关信息可以查看视图pg_user,查看角色相关信息可以查看pg_roles,但如果你查看pg_user和pg_roles的视图定义,会发现这两个视图都来源于基表pg_authid。
我们可以认为在MogDB/openGauss里,用户就是带有login属性的角色。
角色管理
私有用户
角色的属性有很多,可以通过\h create user/role来查看,也可以直接在pg_authid系统表中查看。
这里主要介绍一个比较重要的属性:INDEPENDENT,即在非三权分立模式下,创建具有INDEPENDENT属性的私有用户,
针对该私有用户的对象,系统管理员和拥有CREATEROLE属性的安全管理员在未经其授权前,只能进行控制操作(DROP、ALTER、TRUNCATE),无权进行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。
--创建私有用户,不会立即创建同名schema,在创建对象的时候会创建
MogDB=# create user inu independent password 'inu@1234';
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
WARNING: Please carefully use independent user as it need more self-management.
HINT: Self-management include logical backup, password manage and so on.
CREATE ROLE
MogDB=# select * from information_schema.schemata where schema_name='inu';
catalog_name | schema_name | schema_owner | default_character_set_catalog | default_character_set_schema | default_character_set_name | sql_path
--------------+-------------+--------------+-------------------------------+------------------------------+----------------------------+----------
(0 rows)
MogDB=# \c postgres inu
Password for user inu:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "inu".
MogDB=> create table it(id int);
CREATE TABLE
MogDB=> select * from information_schema.schemata where schema_name='inu';
catalog_name | schema_name | schema_owner | default_character_set_catalog | default_character_set_schema | default_character_set_name | sql_path
--------------+-------------+--------------+-------------------------------+------------------------------+----------------------------+----------
postgres | inu | inu | | | |
(1 row)
--超级管理员用户无法取消independent属性,只有私有用户自己有权限
MogDB=# alter user inu noindependent;
ERROR: Only user himself can remove his own independent attribute.
MogDB=# \c postgres inu
Password for user inu:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "inu".
MogDB=> alter user inu noindependent;
ALTER ROLE
--超级管理员无法访问私有用户对象数据
MogDB=> insert into it values(1);
INSERT 0 1
MogDB=> select * from it;
id
----
1
(1 row)
MogDB=> \c postgres omm
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "omm".
MogDB=# select * from inu.it;
ERROR: permission denied for relation it
DETAIL: N/A
角色权限继承
在角色级别授予或撤消权限时,这些更改将作用到角色下的所有成员。删除角色时只删除角色本身,不会删除角色中的成员用户。
MogDB提供了一个隐式定义的拥有所有角色的组PUBLIC,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。要撤销或重新授予用户和角色对PUBLIC的权限, 可通过在GRANT和REVOKE指定关键字PUBLIC实现。
添加/移除角色成员
--添加角色
grant role to user;
--删除角色
revoke role from user;
账号安全策略
失败登录次数:failed_login_attempts=10
密码锁定时间:password_lock_time=1(d)
手工锁定:ALTER USER name ACCOUNT LOCK;
手工解锁:ALTER USER name ACCOUNT unlock;
密码安全策略
密码加密方式:password_encryption_type=1
是否开启密码策略:password_policy=1
密码重用时间:password_reuse_time
密码重用次数:password_reuse_max
密码有效期:password_effect_time
密码到期提醒:password_notify_time