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