数据库角色管理(Role Management)
1.1、角色基础角色是权限的集合是 Oracle 权限管理的核心机制。12c 增强了角色的安全特性。创建角色CREATE ROLE app_developer;创建带密码的角色需激活时提供密码CREATE ROLE sensitive_role IDENTIFIED BY R0lePss!;创建带外部验证的角色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 R0lePss!;禁用所有角色SET ROLE NONE;1.3、12c 角色增强特性1.31、容器感知角色Container-Sensitive Roles12c 的多租户架构中角色可以是公共角色或本地角色。-- 公共角色在 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、角色权限分析-- 查看角色被授予的权限 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 降至精确匹配安全审计问题清零权限变更审批流程使每次变更可追溯。