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

相关推荐
CLX05051 小时前
如何通过 curl 调用 Go 标准库 RPC 服务(JSON-RPC 协议)
jvm·数据库·python
weixin_459753941 小时前
golang如何设计HTTP中间件链_golang HTTP中间件链设计方法
jvm·数据库·python
woxihuan1234561 小时前
如何处理MongoDB副本集中节点IP变更_rs.reconfig强制更新配置矩阵
jvm·数据库·python
m0_470857641 小时前
如何制作并发布自己的phpMyAdmin主题_主题结构解析与打包分享的开发者指南
jvm·数据库·python
2303_821287381 小时前
怎么在MongoDB中追踪一个Document的具体流转路径_从Chunk分布到迁移历史日志分析
jvm·数据库·python
重生之小比特1 小时前
【MySQL 数据库】视图
数据库·mysql
weixin_459753941 小时前
mysql如何批量重置数据库用户密码_MySQL批量修改密码Shell脚本
jvm·数据库·python
AC赳赳老秦1 小时前
OpenClaw与飞书多维表格联动:自动同步工作数据、生成统计图表,实现高效管理
java·数据库·python·信息可视化·飞书·deepseek·openclaw
黑贝是条狗1 小时前
注册表破解chrome,edge阻止浏览器连接本地websocket
前端·javascript·数据库