数据库角色管理(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 降至精确匹配,安全审计问题清零,权限变更审批流程使每次变更可追溯。

相关推荐
hsg7714 分钟前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
yuezhilangniao15 分钟前
MySQL 8.0.32 二进制安装脚本 和初始化 操作系统版本rocky86
数据库·mysql·adb
Trouvaille ~31 分钟前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜1 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel
唔661 小时前
(二)补充完整的数据库、中间件、MQTT、JAR后台和Web前端的部署脚本,全部一键自动化。
数据库·中间件·jar
jnrjian1 小时前
TDE HSM SET ENCRYPTION KEY
oracle
六月雨滴1 小时前
Oracle 内存优化
数据库·oracle
学代码的真由酱1 小时前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计
遇事不決洛必達2 小时前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务
海鸥-w2 小时前
用python (fastapi)做项目第一天创建项目结构,数据建表,ORM配置安装,写第一个接口
数据库·python·fastapi