官方定义三权分立
三权分立是对系统权限管理机制的补充,核心思想是将管理数据库对象的权限、管理用户的权限和管理审计日志的权限分离,从而避免一个管理员拥有过度集中的权利带来的高风险。通过将GUC参数enableSeparationOfDuty设置为on来打开三权分立开关。三权分立开关打开后, SYSADMIN的权限范围将缩小,不再包括允许创建用户/角色的权限,也不再包括允许查看、删除数据库审计日志的权限。SYSADMIN,CREATEROLE,AUDITADMIN三种系统权限的权限范围互相隔离,互不影响,而且一个用户仅能被赋予其中一个属性。
系统权限
系统权限又称用户属性,具有特定属性的用户会获得指定属性所对应的权限。系统权限无法通过角色(ROLE)被继承。在创建用户或角色时可以通过SQL语句CREATE ROLE/USER指定用户具有某些属性,或者通过ALTER ROLE/USER的方式给用户/角色添加用户属性或取消用户属性。
openGauss数据库支持如下系统权限的授予和回收:
系统权限 | 权限范围 |
|---|---|
SYSADMIN | 允许用户创建数据库,创建表空间 |
MONADMIN | 允许用户对系统模式dbe_perf及该模式下的监控视图或函数进行查看和权限管理 |
OPRADMIN | 允许用户使用Roach工具执行数据库备份和恢复 |
POLADMIN | 允许用户创建资源标签、创建动态数据脱敏策略和统一审计策略 |
AUDITADMIN | 允许用户查看、删除审计日志 |
CREATEDB | 允许用户创建数据库 |
USEFT | 允许用户创建外表 |
CREATEROLE | 允许用户创建用户/角色 |
INHERIT | 允许用户继承所在组的角色的权限 |
LOGIN | 允许用户登录数据库 |
REPLICATION | 允许用户执行流复制相关操作 |
对象权限
对象所有者缺省具有该对象上的所有操作权限,比如修改、删除对象的权限,查看对象的权限,将对象的操作权限授予其他用户,或撤销已经授予的操作权限等。其中对象的ALTER、 DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限,隐式拥有。但对象所有者可以撤消自己的普通权限,例如,使表对自己以及其他人都只可读。
对象权限可以通过角色(ROLE)被继承,这样方便用户将这些单个的权限打包成一个角色进行权限管理。openGauss数据库针对每一类数据库对象支持如下对象权限:
对象 | 权限 | 权限说明 |
|---|---|---|
TABLESPACE | CREATE | 允许用户在指定的表空间中创建表 |
ALTER | 允许用户对指定的表空间执行ALTER语句修改属性 | |
DROP | 允许用户删除指定的表空间 | |
COMMENT | 允许用户对指定的表空间定义或修改注释 | |
DATABASE | CONNECT | 允许用户连接到指定的数据库 |
TEMP | 允许用户在指定的数据库中创建临时表 | |
CREATE | 允许用户在指定的数据库里创建模式 | |
ALTER | 允许用户对指定的数据库执行ALTER语句修改属性 | |
DROP | 允许用户删除指定的数据库 | |
COMMENT | 允许用户对指定的数据库定义或修改注释 | |
SCHEMA | CREATE | 允许用户在指定的模式中创建新的对象 |
USAGE | 允许用户访问包含在指定模式内的对象 | |
ALTER | 允许用户对指定的模式执行ALTER语句修改属性 | |
DROP | 允许用户删除指定的模式 | |
COMMENT | 允许用户对指定的模式定义或修改注释 | |
FUNCTION | EXECUTE | 允许用户使用指定的函数 |
ALTER | 允许用户对指定的函数执行ALTER语句修改属性 | |
DROP | 允许用户删除指定的函数 | |
COMMENT | 允许用户对指定的函数定义或修改注释 | |
TABLE | INSERT | 允许用户对指定的表执行INSERT语句插入数据 |
DELETE | 允许用户对指定的表执行DELETE语句删除表中数据 | |
UPDATE | 允许用户对指定的表执行UPDATE语句 | |
SELECT | 允许用户对指定的表执行SELECT语句 | |
TRUNCATE | 允许用户执行TRUNCATE语句删除指定表中的所有记录 | |
REFERENCES | 允许用户对指定的表创建一个外键约束 | |
TRIGGER | 允许用户在指定的表上创建触发器 | |
ALTER | 允许用户对指定的表执行ALTER语句修改属性 | |
DROP | 允许用户删除指定的表 | |
COMMENT | 允许用户对指定的表定义或修改注释 | |
INDEX | 允许用户在指定表上创建索引,并管理指定表上的索引 | |
VACUUM | 允许用户对指定的表执行ANALYZE和VACUUM操作 |
白话讲解三权分立
上面是官方介绍,下面用通俗语言解释一下三权分立,
openGauss创建后会有一个omm用户,权限如下,注意他有多个角色权限,例如
openGauss=# \du omm | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, Us eFT | {} |
现在要把老大omm的权力分离出来,最主要是Sysadmin、Create role、Administer audit的分离出来。分离后如下,其中auditadmin1用户负责审计,createrole1负责用户角色创建,而sysadmin1则负责数据权限。
查看数据库三权分立
查看三权分立是否打开,off是关闭状态。 openGauss=# select name,setting,unit,context from pg_settings where name ~ 'enableSeparationOfDuty'; name | setting | unit | context ------------------------+---------+------+------------ enableSeparationOfDuty | off | | postmaster (1 row) |
通过gs_guc打开三权分立,并重启服务才能正常生效。 基于omm用户执行以下命令 gs_guc reload -Z datanode -D dn/ -c "enableSeparationOfDuty=on" [omm@server130 ~]$ gs_om -t restart |
三权分立后
具体的业务应用场景
下面举一个,三权分立后,再也不是由omm一个专利独权,omm的事情由三个部门管理,分别是人事部门、IT部门、数据部门。
人事部负责给新员工创建帐号,HR根据各种标签给新员工创建各种角色。
IT部门负责给新员工赋矛相关部门的权限,一般IT部门要与人事部紧密配合,偶然也要与数据部门交流工作。
数据部门可以监控员工的行为,发现异常行业可以检测员工有没有恶意的帐号,。
从公司运营的角度来看,应该业务、技术、管理独立分离,三权就是满足了这点要求,否则就会监守自盗。
创建数据部门的审计用户的老大auditadmin1,以及人事部用户角色组的老大createrole1,还有数据部门权限分配的老大sysadmin1 CREATE USER auditadmin1 PASSWORD 'Agmcc#1234'; alter user auditadmin1 AUDITADMIN; CREATE USER sysadmin1 PASSWORD 'Agmcc#1234'; alter user sysadmin1 SYSADMIN; CREATE USER createrole1 PASSWORD 'Agmcc#1234'; alter user createrole1 CREATEROLE; |
查看创建结果,分别创建auditadmin1,createrole1,sysadmin1
openGauss=# \du auditadmin1 | Administer audit| {} createrole1 | Create role| {} omm | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, UseFT | {} sysadmin1 | Sysadmin| {} |
测试能不能越权
我们尝试给用户更多的权利,例如审计老大有数据资源分配的权力,或者让管人的用户角色老大有审请的权力,赋权的时候会报错,提示三权分立正在使用中。
openGauss=# alter user sysadmin1 CREATEROLE; ERROR: Separation of privileges is used,user can't be altered because of too many privileges. openGauss=# alter user createrole1 SYSADMIN; ERROR: Separation of privileges is used,user can't be altered because of too many privileges. openGauss=# alter user auditadmin1 SYSADMIN; ERROR: Separation of privileges is used,user can't be altered because of too many privileges. |
三位老大根据自己的部门需求进行创建、授权、审计的活动。
测试独立交集的权限
审计用户的老大auditadmin1创建的用户能够对数据库日志进行审计,用户角色组的老大createrole1 能够创建各种用户角色和相应的资源,数据权限分配的老大sysadmin1负责数据资源权限的分配,sysadmin1看似三者之中权力,但是它也需要createrole1为它创建用户。所以三权分立的目标是三个不同的用户协同完成同一个工作。
例如审计老大auditadmin1新建一个用户newfish,newfish天生就有审计的权利,如果newfish想访问public.t1表的数据进行分析的话,那么必须sysadmin1老大运行以下命令
GRANT usage ON schema public to newfish; grant select on table public.t1 to newfish; |
总结三权分立
三权分立的改革创新,通过把鸡蛋放在一个篮子里面,现在变成放在三个篮子里面,三个篮子协同完成过去同样的工作。没有一权独大,从管理的角度来看比过去更加安全。




