#三权分立
三权分立是对数据库管理权限的划分,使不同的管理职位行使不同角色(权限集)各司其职、互相限制和监督,避免管理权限过于集中,提升数据库系统的安全性和合规性。
# 基本原理
三权分立的核心目的是通过责任分离,避免滥用权限或出现错误操作。
若开启三权分立,内置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,即关闭三权分立功能,该参数需重启数据库生效。
以具备ALTER SYSTEM权限的用户登录数据库。
执行ALTER SYSTEM SET PARAMETER语句修改ENABLE_SEPARATE_DUTY参数值。
ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=TRUE SCOPE=SPFILE;重启数据库使配置生效。
# 使用三权分立
开启三权分立后,管理用户的系统特权将发生相应变化,但普通用户以及用户下的对象特权不会受到影响。
假设,已创建用户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

