应禁止直接授予第三方DBA/SYSDBA权限,而须遵循最小权限原则、审计能力分离与行为可追溯三要素;具体通过创建受限审计账号、仅授必要视图查询权、显式回收高危权限、启用统一审计及加强客户端/IP/密码管控来实现。

直接给第三方运维人员开一个带 DBA 或 SYSDBA 的账号,等于把数据库的物理钥匙交出去——哪怕加了密码策略,也拦不住误操作或越权访问。真正安全的做法是:用最小权限原则 + 审计能力分离 + 行为可追溯,三者缺一不可。
为什么不能直接 grant DBA 给第三方账号
第三方运维通常只需要查会话、看锁、查慢 SQL、读部分数据字典,但 DBA 角色默认包含 DROP ANY TABLE、ALTER SYSTEM、SELECT ANY DICTIONARY 等高危权限。一旦账号泄露或被社工,后果远超预期。
-
SELECT ANY DICTIONARY允许读取所有系统表(包括加密后仍可导出的USER$密码哈希) -
ALTER SYSTEM可禁用审计、关闭归档、修改参数,直接绕过合规基线 - 即使回收了部分权限,
DBA授予链中可能残留WITH ADMIN OPTION,导致权限二次扩散
创建受限审计账号的 4 步实操清单
目标账号只需执行日常巡检类操作,不写、不删、不改配置,且所有行为必须留痕。
- 用独立 profile 控制资源与密码策略:
CREATE PROFILE audit_user_prof LIMIT PASSWORD_LIFE_TIME 90 FAILED_LOGIN_ATTEMPTS 5 IDLE_TIME 15; - 建用户并绑定 profile:
CREATE USER audit_op IDENTIFIED BY "StrongPass123!" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp PROFILE audit_user_prof; - 只授必要视图查询权限(不走
SELECT ANY DICTIONARY):GRANT SELECT ON v_$session TO audit_op;、GRANT SELECT ON v_$lock TO audit_op;、GRANT SELECT ON v_$sqlarea TO audit_op;、GRANT SELECT ON dba_hist_sqlstat TO audit_op; - 显式禁止危险操作:
REVOKE CREATE SESSION FROM audit_op;是错的——应该先不授,再确认只给了CREATE SESSION;但要REVOKE ALTER SYSTEM, DROP ANY TABLE, SELECT ANY DICTIONARY FROM audit_op;
必须开启的审计配置(否则账号本身无意义)
账号权限再小,没有审计日志就等于“隐身”。Oracle 默认不记录登录和语句执行,需主动打开。
- 启用统一审计(推荐 Oracle 12c+):
AUDIT POLICY ORA_SECURECONFIG;,它已包含登录、权限使用、数据字典访问等关键事件 - 若用传统审计,至少补上:
AUDIT SESSION WHENEVER SUCCESSFUL;、AUDIT SELECT TABLE BY audit_op BY ACCESS; - 验证是否生效:
SELECT * FROM unified_audit_trail WHERE user_name = 'AUDIT_OP' AND event_timestamp > SYSDATE - 1/24; - 注意:审计日志默认写入
UNIFIED_AUDIT_TRAIL(内存+文件),确保audit_file_dest路径有足够空间,且不与业务表空间混用
容易被忽略的隔离细节
很多团队做完上面几步就认为安全了,但实际生产中常栽在三个地方:
- 未限制客户端程序:
audit_op从sqlplus登录没问题,但如果允许用PL/SQL Developer或Toad,这些工具可能自动执行SELECT * FROM DBA_USERS类语句,触发隐式权限请求——应在 Database Vault 中建 Realm 限制对敏感对象的访问 - 未约束 IP 范围:第三方可能从任意出口 IP 连接,应配合
LOGON TRIGGER或网络层 ACL 限制只允许运维跳板机 IP 访问 - 未定期轮换密码且未禁用密码重用:
ALTER PROFILE audit_user_prof LIMIT PASSWORD_REUSE_MAX 5 PASSWORD_REUSE_TIME 365;必须显式设置,否则 Oracle 默认允许立即重用旧密码


















