openGauss数据库权限管理模型(下)
发表于 2021/08/02
0
openGauss数据库采用基于角色的权限访问控制模型,除了在openGauss数据库权限管理模型(上)中介绍的基本系统权限和对象权限的划分外,还有一些高阶的权限管理机制用来满足客户的业务诉求。
三权分立
三权分立是对系统权限管理机制的补充,核心思想是将管理数据库对象的权限、管理用户的权限和管理审计日志的权限分离,从而避免一个管理员拥有过度集中的权利带来的高风险。通过将GUC参数enableSeparationOfDuty设置为on来打开三权分立开关。
三权分立开关打开后, SYSADMIN的权限范围将缩小,不再包括允许创建用户/角色的权限,也不再包括允许查看、删除数据库审计日志的权限。SYSADMIN,CREATEROLE,AUDITADMIN三种系统权限的权限范围互相隔离,互不影响,而且一个用户仅能被赋予其中一个属性。
三权分立打开后的权限范围如下:
系统权限 | 权限范围 |
---|---|
SYSADMIN |
允许用户创建数据库,创建表空间 |
CREATEROLE |
允许用户创建用户/角色 |
AUDITADMIN |
允许用户查看、删除审计日志 |
列级访问控制
在一些业务场景中,数据表中的某些列存储了重要的信息,需要对用户不可见,但其他列的数据又需要用户能够查看或操作,此时就需要针对数据表的特定列做访问控制,实现针对用户的列级别的访问控制。
openGauss提供SQL语句GRANT/REVOKE实现针对列对象的权限授予和回收:
例1:将对表tbl的第一列(fir)进行select的权限和对表tbl的第二列(sec)进行update的权限授予用户user1
openGauss=# GRANT select(fir),update(sec) ON TABLE tbl TO user1;
GRANT
赋权后用户user1有权对tbl的第一列执行select操作和对第二列执行update操作
例2:撤销用户user1对表tbl的第一列fir进行select的权限
openGauss=# REVOKE select(fir) ON tbl FROM user1;
REVOKE
撤销后用户user1不再具有查看表tbl的第一列fir数据的权限
行级访问控制
在实际业务中还存在另外一种场景,同一张数据表,只允许用户查看满足特定条件的行数据,此时就需要将访问控制精确到数据表的行级别,使得不同用户执行相同的SQL查询、更新或删除操作,读取到的结果是不同的。
用户可以在数据表上创建行级访问控制(row level security)策略,该策略是针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户访问数据表时,满足策略条件的行对用户可见,不满足条件的行对用户不可见,从而实现针对用户的行级别的访问控制。
openGauss提供SQL语句CREATE/ALTER/DROP ROW LEVEL SECURITY进行行级访问权限策略的创建/修改/删除操作:
步骤1:创建信息表pat_info记录医院病人的个人信息:
openGauss=# select * from pat_info;
patience | doctor | age
-----------+--------+-----
peter | mary | 25
bob | mary | 56
julie | tom | 38
(3 rows)
步骤2:创建行级访问控制策略,使得医生只能查看属于自己的病人信息:
openGauss=# CREATE ROW LEVEL SECURITY POLICY rls_select ON pat_info FOR select USING(doctor=current_user);
CREATE ROW LEVEL SECURITY POLICY
步骤3:打开信息表pat_info上的行级访问控制开关:
openGauss=# ALTER TABLE pat_info ENABLE ROW LEVEL SECURITY;
ALTER TABLE
步骤4:将信息表pat_info的查看权限赋予所有人:
openGauss=# grant select on table pat_info to public;
GRANT
步骤5:Mary医生的查看结果:
openGauss=> select * from pat_info; patience | doctor | age
----------+--------+-----
peter | mary | 25
bob | mary | 56
(2 rows)
步骤6:Tom医生的查看结果:
openGauss=> select * from pat_info; patience | doctor | age
----------+--------+-----
julie | tom | 38
(1 row)
本页内容