#三权分立

三权分立是对数据库管理权限的划分,使不同的管理职位行使不同角色(权限集)各司其职、互相限制和监督,避免管理权限过于集中,提升数据库系统的安全性和合规性。

# 基本原理

三权分立的核心目的是通过责任分离,避免滥用权限或出现错误操作。

若开启三权分立,内置SYS用户和DBA角色的权限会受到相应约束,并与内置的SECURITOR用户和AUDITOR用户形成“三权分立”体系,同时在授权操作、密码策略方面加强了相关约束。

约束项 未开启 开启
内置用户SYS 具备所有权限 仅具备系统管理员权限,不再具有审计、安全管理相关权限,详情请查看下表
内置角色DBA 具备除SHUTDOWN、备份恢复的其他所有权限 仅具备系统管理员权限,详情请查看下表
授权操作 - 无法再对普通用户授予DBA、SECURITY_ADMIN以及AUDIT_ADMIN角色
密码策略 - 密码生命周期不能超过7天。
最大连续错误登录次数不能超过5次。
密码过期宽限期固定为0。

若开启三权分立,内置三权用户及权限如下:

管理员角色 用户 权限说明
系统管理员 内置:SYS
自定义:在开启三权分立前被授予DBA角色的用户
ALTER DATABASE
ALTER SYSTEM
CREATE/ALTER SESSION
CREATE/ALTER/DROP USER
CREATE/ALTER/DROP (ANY) ROLE
CREATE/ALTER/DROP/UNLIMITED TABLESPACE
CREATE TABLE
CREATE TYPE
CREATE/ALTER/DROP DATABASE LINK
CREATE/ALTER/DROP PUBLIC DATABASE LINK
CREATE LIBRARY
CREATE SEQUENCE
CREATE SYNONYM
CREATE VIEW
CREATE PROCEDURE
CREATE TRIGGER
CREATE/ALTER/DROP ANY OUTLINE
CREATE/ALTER/DROP PROFILE
CREATE/ALTER/DROP ANY MATERIALIZED VIEW
CREATE/DROP ANY DIRECTORY
CREATE/DROP ANY CONTEXT
ANALYZE ANY
YSTREAM_CAPTURE
FILE
SELECT FROM SYS.OBJECT
安全管理员 内置:SECURITOR
自定义:在开启三权分立前被授予SECURITY_ADMIN角色的用户
CREATE SESSION
GRANT ANY PRIVILEGE/OBJECT PRIVILEGE/ROLE
SELECT ON SYS.USERAUTH$(查看权限系统表)
ALL PRIVILEGES ON SYS.ANON_POLICY$(数据动态脱敏策略)
ADMINISTER KEY MANAGEMENT
LBAC_DBA角色(行访问控制相关权限)
SELECT_CATALOG_ROLE角色
审计管理员 内置:AUDITOR
自定义:在开启三权分立前被授予AUDIT_ADMIN角色的用户
CREATE SESSION
AUDIT SYSTEM
SELECT_CATALOG_ROLE角色

建议在建库前先规划确认是否使用三权分立模式,如需使用,则可在建库操作时一并开启,不建议反复切换权限模式。若建库时未开启但后续确有需要开启时,应该先对当前已有用户的权限集合进行清理归整再开启三权分立。

# 配置三权分立

该功能开关由ENABLE_SEPARATE_DUTY参数的取值控制。YashanDB安装后,默认ENABLE_SEPARATE_DUTY = FALSE,即关闭三权分立功能,该参数需重启数据库生效。

  1. 以具备ALTER SYSTEM权限的用户登录数据库。

  2. 执行ALTER SYSTEM SET PARAMETER语句修改ENABLE_SEPARATE_DUTY参数值。

    ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=TRUE SCOPE=SPFILE;
    
  3. 重启数据库使配置生效。

# 使用三权分立

开启三权分立后,管理用户的系统特权将发生相应变化,但普通用户以及用户下的对象特权不会受到影响。

假设,已创建用户sales1并授予其DBA角色、创建用户sales2并授予其CONNECT、RESOURCE角色,sales2创建表area1和area2并对sales1授予查询area1的对象特权。

在默认情况下三权分立未开启,作为DBA角色的sales1可以访问sales2下的任意表。

-- 创建用户并授权
CREATE USER sales1 IDENTIFIED BY "sales1";
CREATE USER sales2 IDENTIFIED BY "sales2";
GRANT DBA TO sales1;
GRANT CONNECT,RESOURCE TO sales2;

-- 普通用户sales2
conn sales2/sales2
CREATE TABLE area1(C1 INT);
INSERT INTO area1 VALUES(1);
CREATE TABLE area2(C2 INT);
INSERT INTO area2 VALUES(2);
GRANT SELECT ON area1 TO sales1;

-- DBA用户sales1可以访问sales2下的任意表,包括未经授权的area2
conn sales1/sales1
SELECT C1 FROM sales2.area1;
          C1 
------------ 
           1
SELECT C2 FROM sales2.area2;
          C2 
------------ 
           2

开启三权分立,重启数据库使之生效。

ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=true SCOPE=SPFILE;

此时,作为DBA角色的sales1的系统特权发生变化:

  • 不能再访问未被授权的对象area2。

  • 无法执行系统特权的授权操作。

而对于普通用户sales2的权限并不受影响,仍然可以管理自有资源(对象)的访问权限,例如将area2的查询权限授予sales1用户。

-- DBA用户sales1可以访问已被授权的area1,但不能访问area2
conn sales1/sales1
SELECT C1 FROM sales2.area1;
          C1 
------------ 
           1
SELECT C2 FROM sales2.area2;
[1:15]YAS-02012 table or view does not exist

GRANT CREATE TABLE TO sales2;
YAS-02213 insufficient privileges

-- 普通用户sales2仍然可以自主控制自有表area2的访问权限
conn sales2/sales2
GRANT SELECT ON area2 TO sales1;

-- DBA用户sales1被授权后,可以访问area2
conn sales1/sales1
SELECT C2 FROM sales2.area2;
          C2 
------------ 
           2
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流