数据库角色管理(Role Management)

1.1、角色基础

角色是权限的集合,是 Oracle 权限管理的核心机制。12c+ 增强了角色的安全特性。

创建角色:

CREATE ROLE app_developer;

创建带密码的角色(需激活时提供密码):

CREATE ROLE sensitive_role IDENTIFIED BY "R0leP@ss!";

创建带外部验证的角色:

CREATE ROLE external_role IDENTIFIED EXTERNALLY;

创建全局角色(CDB 级别):

CREATE ROLE c##global_dba CONTAINER = ALL;

创建目录服务角色:

CREATE ROLE ldap_role IDENTIFIED GLOBALLY;

1.2、角色授权与管理

授予系统权限给角色:

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW,CREATE PROCEDURE, CREATE SEQUENCE TO app_developer;

授予对象权限给角色:

GRANT SELECT, INSERT, UPDATE ON hr.employees TO app_developer;

GRANT EXECUTE ON hr.raise_salary_proc TO app_developer;

角色嵌套:

GRANT app_developer TO senior_developer;

GRANT senior_developer TO tech_lead;

授予角色给用户:

GRANT app_developer TO hr_user;

授予带 ADMIN 选项(可以管理该角色):

GRANT app_developer TO admin_user WITH ADMIN OPTION;

设置默认角色:

ALTER USER hr_user DEFAULT ROLE app_developer;

ALTER USER hr_user DEFAULT ROLE ALL EXCEPT sensitive_role;

激活非默认角色(需要密码):

SET ROLE sensitive_role IDENTIFIED BY "R0leP@ss!";

禁用所有角色:

SET ROLE NONE;

1.3、12c+ 角色增强特性

1.31、容器感知角色(Container-Sensitive Roles)

12c 的多租户架构中,角色可以是公共角色或本地角色。

sql 复制代码
-- 公共角色(在 CDB$ROOT 中创建,所有 PDB 可见)
CREATE ROLE c##monitor CONTAINER = ALL;
GRANT SELECT ANY DICTIONARY TO c##monitor;

-- 本地角色(在 PDB 中创建,仅该 PDB 可见)
ALTER SESSION SET CONTAINER = orclpdb1;
CREATE ROLE pdb_app_role CONTAINER = CURRENT;
GRANT CREATE SESSION, CREATE TABLE TO pdb_app_role;

1.3.2、角色权限分析

sql 复制代码
-- 查看角色被授予的权限
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'APP_DEVELOPER';
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'APP_DEVELOPER';

-- 查看角色层次
SELECT * FROM ROLE_ROLE_PRIVS WHERE ROLE = 'TECH_LEAD';

-- 12c+ 增强:查看权限路径(通过哪些角色获得权限)
-- 使用递归查询
WITH role_hierarchy AS (
  SELECT grantee, granted_role, 1 AS level
    FROM role_role_privs
   WHERE grantee = 'HR_USER'
  UNION ALL
  SELECT r.grantee, r.granted_role, rh.level + 1
    FROM role_role_privs r
    JOIN role_hierarchy rh ON r.grantee = rh.granted_role
)
SELECT DISTINCT granted_role FROM role_hierarchy
CONNECT BY grantee = PRIOR granted_role
START WITH grantee = 'HR_USER';

-- 使用 DBMS_PRIVILEGE_CAPTURE 分析权限使用(12c+)
-- 创建权限捕获策略
BEGIN
  DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
    name        => 'ALL_PRIVS_CAPTURE',
    description => 'Capture all privilege usage',
    type        => DBMS_PRIVILEGE_CAPTURE.G_DATABASE
  );
END;

-- 启动捕获
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE('ALL_PRIVS_CAPTURE');

-- 等待一段时间后,生成报告
EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE('ALL_PRIVS_CAPTURE');
EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT('ALL_PRIVS_CAPTURE');

-- 查看未使用的权限
SELECT username, sys_priv
  FROM dba_unused_privs
 WHERE grantee = 'HR_USER';

-- 查看已使用的权限
SELECT username, sys_priv, used
  FROM dba_used_privs
 WHERE grantee = 'HR_USER';

实例:公司权限瘦身项目

S --- Situation(场景):某公司的 Oracle 数据库有 50+ 个应用用户,权限管理混乱------很多用户拥有 DBA 角色,实际使用的权限不到 10%。安全审计发现大量过度授权问题。

T --- Task(任务):实施最小权限原则,重新设计角色体系,消除过度授权。

A --- Action(行动):

1、使用 DBMS_PRIVILEGE_CAPTURE 捕获所有用户 30 天的实际权限使用情况。

2、根据业务职能设计 6 个标准角色:只读用户、读写用户、开发者、运维、报表、管理员。

3、基于捕获结果,为每个用户分配最精确的角色组合。

4、撤销所有用户的 DBA 角色。

5、建立权限申请审批流程。

6、配置定期权限审查(季度)。

R --- Result(结果):过度授权用户从 45 个降至 3 个,权限覆盖率从 100% DBA 降至精确匹配,安全审计问题清零,权限变更审批流程使每次变更可追溯。

相关推荐
ywl47081208731 分钟前
mysql 锁定读和非锁定读
数据库·mysql
流浪00134 分钟前
MySQL数据库基础篇(三):MySQL 数据库库级操作全解:创建、字符集、管理与备份恢复实战
数据库·mysql
吴声子夜歌1 小时前
Redis 3.x——集群运维
运维·数据库·redis
钝挫力PROGRAMER1 小时前
MySQL 数据截断错误 #22001:原因分析与解决方案
数据库·mysql
Database_Cool_1 小时前
记忆张量MemOS + 阿里云PolarDB一站式记忆管理方案发布:给AI装上不断片的记忆
数据库·人工智能·阿里云
码农阿豪2 小时前
上线前能跑,上线后挂了,三个隐性的SQL陷阱
数据库·sql
春卷同学2 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
foolishlee2 小时前
openGauss慢SQL记录相关线程
数据库
乖巧的妹子2 小时前
SQL知识点
数据库·sql·oracle
数行拙笔2 小时前
Redis---list类型
数据库·redis·缓存