Oracle:完整笔记 — 授予/检查 `DBA` 与权限管理(含检查项、查询、最佳实践)
目录标题
Oracle:完整笔记 — 授予/检查 `DBA` 与权限管理(含检查项、查询、最佳实践)1. 语法与概念回顾2. 常用查询(检查权限 / 授予链 / 授权来源)3. 典型操作示例(授予 / 回收 / 查看)4. 检查与风险评估清单(Grant 前后必做)5. 常见陷阱与注意事项6. 多租户 (CDB / PDB) 特别说明7. 审计与合规(基础建议)8. 最小权限示例(按职责给出建议,而非完整清单)9. 示例运维脚本(检查谁有 DBA 并输出)10. 发生误授或安全事件时的快速应对(建议流程)11. 推荐的管理/流程建议(最佳实践)12. 常用参考查询(汇总)
Oracle:完整笔记 — 授予/检查 DBA 与权限管理(含检查项、查询、最佳实践)
下面是一份尽量全面、可直接复制执行的笔记,适合在运维/DBA 工作时参考。内容覆盖语法、如何检查谁有 DBA / 谁能再授予 DBA、相关数据字典查询、风险与缓解、审计与回滚步骤、以及多租户(CDB/PDB)注意事项与安全建议。
1. 语法与概念回顾
授予角色(role)语法:
GRANTTO[WITH ADMIN OPTION];
授予系统/对象权限语法(示例):
GRANT CREATE SESSION TO username;
GRANT SELECT ON hr.employees TO username;
区别:
WITH ADMIN OPTION:角色级别的链式传递权限(被授予者可以把该角色再授予其他用户/角色)。适用于 GRANT...。WITH GRANT OPTION:权限级别(系统/对象权限)允许被授予者将该权限再授予别人。适用于 GRANT SELECT ON table ... 或系统权限(例如 GRANT SOME_SYS_PRIV TO user WITH ADMIN OPTION 视 Oracle 版本而定)。 DBA 是一个超级角色,包含大量系统/对象权限(近乎完全管理能力)。谨慎使用。
2. 常用查询(检查权限 / 授予链 / 授权来源)
注:需以有权限的帐号(如 SYS、SYSTEM 或有查询 DBA_* 视图权限的帐号)执行。
查看某用户是否被授予 DBA:
SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE
FROM DBA_ROLE_PRIVS
WHERE GRANTED_ROLE = 'DBA';
查看某个用户拥有的角色(所有):
SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE, COMMON
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'USERNAME';
查看某用户的系统权限(如 ALTER SYSTEM、CREATE USER 等):
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'USERNAME';
查看某用户的对象权限(表、视图等):
SELECT OWNER, TABLE_NAME, GRANTEE, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE GRANTEE = 'USERNAME';
查找谁能授予任何角色(拥有 GRANT ANY ROLE 权限):
SELECT GRANTEE
FROM DBA_SYS_PRIVS
WHERE PRIVILEGE = 'GRANT ANY ROLE';
查找哪些用户拥有 DBA 且带 ADMIN OPTION(能再分发 DBA):
SELECT GRANTEE
FROM DBA_ROLE_PRIVS
WHERE GRANTED_ROLE='DBA' AND ADMIN_OPTION='YES';
查看是谁把某个角色授予给谁(查看授予者):
SELECT GRANTEE, GRANTED_ROLE, GRANTOR, ADMIN_OPTION, COMMON, TIMESTAMP
FROM DBA_ROLE_PRIVS
WHERE GRANTED_ROLE = 'DBA';
GRANTOR / GRANTED_BY 字段在不同 Oracle 版本/视图名略有不同,常见的是 GRANTOR 或 GRANTED_BY。若无法找到,请查看数据字典列名或 DESC DBA_ROLE_PRIVS;。
查看当前会话的角色/权限(调试时用):
-- 当前会话角色
SELECT * FROM SESSION_ROLES;
-- 当前会话系统权限
SELECT * FROM SESSION_PRIVS;
查看角色中包含哪些系统权限 / 角色(展开角色定义):
-- 角色包含哪些系统权限
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'DBA';
-- 角色包含哪些对象权限
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'DBA';
-- 角色包含哪些角色(角色嵌套)
SELECT * FROM ROLE_ROLE_PRIVS WHERE ROLE = 'DBA';
3. 典型操作示例(授予 / 回收 / 查看)
授予 DBA:
-- 以有权限的管理员执行
GRANT DBA TO scott;
授予 DBA 并允许连锁授予:
GRANT DBA TO scott WITH ADMIN OPTION;
撤销 DBA:
REVOKE DBA FROM scott;
强制撤销并清理链(示例思路,实际需按链条逐个撤销):
列出 scott 所转授出去的角色:SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTOR='SCOTT';对这些被转授的用户逐一 REVOKE。最后 REVOKE DBA FROM SCOTT;
4. 检查与风险评估清单(Grant 前后必做)
在授予 DBA 或其它高权限前后,执行以下检查与记录:
授予前(审批 & 检查)
审批依据(业务需求、工单编号)写入变更单/工单。确认请求人身份与最小权限需求(能否仅授予若干系统权限而非整个 DBA)。在测试环境复现所需权限并验证。记录当前数据库版本与容器(CDB/PDB)信息:SHOW PARAMETER / SELECT NAME, CDB FROM V$DATABASE;
授予时(执行)
在数据库里以管理员登录,记录执行者与时间。执行 GRANT,并将 SQL、执行者、时间写入变更日志(或 CMDB)。如环境为 PDB,请先 ALTER SESSION SET CONTAINER = pdb_name;(见第 8 节)。
授予后(验证 & 审计)
运行查询确认:SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='USERNAME';列出该用户通过新角色能做的关键操作(例如能否创建其他用户、修改系统参数等):SELECT * FROM SESSION_PRIVS;(在用户会话下)若启用审计,检查审计条目:SELECT * FROM DBA_AUDIT_TRAIL WHERE ...(或 unified audit views)。记录撤销流程与联系人,以便发生问题时能快速回滚。
5. 常见陷阱与注意事项
不要轻易给 WITH ADMIN OPTION:这会允许被授予者将 DBA 再授给他人,链式扩散风险高。不要在生产环境使用共享通用 account(如大量人共享一个 DBA 账号):无法追踪责任。注意角色 vs 系统权限的差异:一些操作需要特定系统权限(如 ALTER SYSTEM),而 DBA 包含这些权限但更粗暴。对象权限的 GRANTABLE 与角色的 ADMIN_OPTION:对象权限使用 GRANT ... WITH GRANT OPTION,数据字典列名为 GRANTABLE。某些特殊操作需要 SYSDBA/SYSOPER:这些是启动/关闭实例、恢复等需要的高权限,不能被普通 GRANT DBA 替代。慎重授予 SYSDBA。版本/补丁差异:Oracle 不同版本(12c 引入多租户、一些新的 SYSBACKUP 权限等)在权限模型上有变化,操作前请核对你的 Oracle 版本文件。
6. 多租户 (CDB / PDB) 特别说明
公共用户(common users)与本地用户不同。common 用户通常以 C## 前缀创建并在根容器(CDB$ROOT)管理。在 PDB 中授予 PDB-local 权限时,先切换容器:
ALTER SESSION SET CONTAINER = pdb_name;
-- 然后授予
GRANT DBA TO someuser;
若在 CDB$ROOT 授予 DBA,可能是给 common user 或影响多个 PDB。务必在正确容器执行。查看容器信息:
SELECT NAME, CON_ID FROM V$CONTAINERS;
7. 审计与合规(基础建议)
如果公司有合规要求(SOX、ISO 等),请启用审计并记录:谁在何时授予了什么权限。 Oracle 提供传统审计和 Unified Auditing(新版推荐)。常见的审计点:
角色授予/撤销事件CREATE/ALTER/DROP 用户关键系统操作(ALTER SYSTEM、STARTUP/SHUTDOWN) 简单查询审计结果(示例):
-- 传统审计表(视具体配置而异)
SELECT * FROM DBA_AUDIT_TRAIL WHERE ACTION_NAME IN ('GRANT', 'REVOKE');
-- Unified audit 视图(如有启用)
SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ACTION_NAME IN ('GRANT_ROLE', 'REVOKE_ROLE');
(具体列名/行为与 Oracle 版本/配置有关,请据环境调整查询。)
8. 最小权限示例(按职责给出建议,而非完整清单)
下列为示例性常见任务所需权限。优先原则:最小权限 — 只给用户完成任务所需的最少权限。
日常登录、运行查询(readonly developer):
CREATE SESSIONSELECT 对特定 schema 或表 应用维护 / 部署:
CREATE SESSIONCREATE TABLE, CREATE PROCEDURE, ALTER 针对应用 schema或者为应用创建专用角色并只授予需要的对象权限 备份/恢复(RMAN):
推荐使用 Oracle 特殊角色/账户(例如 SYSBACKUP、SYSDG、SYSKM 等,取决版本),或使用 SYS 但通过审计与最小化访问控制。不要把全部 DBA 当成备份专用权限。 用户与实例管理(真正需要 DBA 能力的人):
CREATE USER, ALTER USER, DROP USERCREATE ROLE, GRANT ANY ROLE(谨慎)ALTER SYSTEM(非常敏感,应仅给少数人)
9. 示例运维脚本(检查谁有 DBA 并输出)
-- 列出所有被授予 DBA 的账号,以及是否带 ADMIN OPTION 与授予者
SELECT GRANTEE, ADMIN_OPTION, GRANTOR, TO_CHAR(TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS GRANT_TIME
FROM DBA_ROLE_PRIVS
WHERE GRANTED_ROLE = 'DBA'
ORDER BY GRANTEE;
-- 列出拥有 GRANT ANY ROLE 的账号(能授予任意角色)
SELECT GRANTEE
FROM DBA_SYS_PRIVS
WHERE PRIVILEGE = 'GRANT ANY ROLE';
-- 检查拥有 DBA 的账号在各 PDB 的情况(需在每个 PDB 切换执行)
ALTER SESSION SET CONTAINER = pdb_name;
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE='DBA';
10. 发生误授或安全事件时的快速应对(建议流程)
立刻记录:谁、何时、哪些权限被误授。暂停受影响账号(如果合规允许):ALTER USER username ACCOUNT LOCK; 或强制更改密码。撤销权限:优先撤销误授出的链上的授予,然后撤销主授予。审查审计日志:检查是否发生任意异常行为(DDL、用户创建等)。恢复并复查:根据审计结果回滚受影响改动,重新评估权限策略。变更管理:在变更单中记录事件、原因、补救与后续改进措施。
11. 推荐的管理/流程建议(最佳实践)
使用角色分层管理(把一组常用权限封装成自定义角色,按职责分配)。对高权限操作采用审批流程、工单与变更窗口。开启并定期审查审计(至少对角色授予/撤销、用户创建/删除进行审计)。定期(如月/季)运行权限健康检查脚本,列出拥有 DBA / GRANT ANY ROLE / ALTER SYSTEM 等高权限的账号并核对业务必要性。对关键账号(如有 SYSDBA 能力的账号)使用更严格的访问方法(例如强认证、多因素、仅在跳板机上可用)。
12. 常用参考查询(汇总)
-- 谁有 DBA
SELECT GRANTEE, ADMIN_OPTION FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE='DBA';
-- 谁可以授予角色(拥有 GRANT ANY ROLE)
SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE PRIVILEGE='GRANT ANY ROLE';
-- 用户有哪些系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='USERNAME';
-- 用户有哪些对象权限
SELECT OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE FROM DBA_TAB_PRIVS WHERE GRANTEE='USERNAME';
-- 角色里有哪些系统权限与对象权限(展开角色)
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE='DBA';
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE='DBA';
-- 查看 role 授权链
SELECT GRANTOR, GRANTEE, GRANTED_ROLE, ADMIN_OPTION, COMMON, TIMESTAMP FROM DBA_ROLE_PRIVS ORDER BY TIMESTAMP DESC;
平面设计主要做什么|荷花败后,池塘里还剩下什么?