鲲鹏社区首页
中文
注册
openGauss数据库权限管理模型(下)

openGauss数据库权限管理模型(下)

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)

本页内容