oracle 19c启用统一审计必须先执行二进制重链接(make -f ins_rdbms.mk uniaud_on ioracle)并重启数据库,否则审计策略静默失效;真实启用需同时满足v$option返回true、unified_audit_trail可访问且audit_trail参数为none。

Oracle 19c 中“启用统一审计用户权限”不是配个参数或跑条 SQL 就能生效的事——必须先完成二进制重链接(make -f ins_rdbms.mk uniaud_on ioracle)并重启数据库,否则所有策略都不记录,AUDIT POLICY语句执行成功也只是假象。
确认 Unified Auditing 是否真正启用
别只查 V$OPTION。它返回 TRUE 只说明编译时带了该特性,不代表运行时激活。真实状态必须三者同时满足:
-
SELECT value FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'返回TRUE -
SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1不报ORA-00942: table or view does not exist,哪怕返回空行也行 -
SHOW PARAMETER audit_trail输出值必须是NONE(不能是DB、XML或混合残留)
任一不满足,说明还在传统或混合模式,后续所有审计策略都静默失效。
启用前必须重链接 Oracle 二进制
这是硬性前提,不可跳过,也不可仅在主库操作(容灾环境需主备各自执行)。Linux 下操作路径固定:
- 停库:
SHUTDOWN IMMEDIATE;停监听:lsnrctl stop - 切换到
$ORACLE_HOME/rdbms/lib - 执行:
make -f ins_rdbms.mk uniaud_on ioracle - 重启:
STARTUP;再验证上述三项
注意:uniaud_on 操作不可逆(除非再用 uniaud_off),且要求操作系统用户对 $ORACLE_HOME 有写权限。没走这步,CREATE AUDIT POLICY 能成功,但后台根本没监听模块,日志一条都不会写。
创建并启用策略监控用户权限行为
统一审计不支持笼统的“审计所有权限”,必须拆解为具体动作。常见权限相关策略写法:
- 监控谁被授予了高危系统权限:
CREATE AUDIT POLICY grant_priv_policy ACTIONS GRANT ANY PRIVILEGE, GRANT ANY ROLE - 监控谁被授予了对象权限:
CREATE AUDIT POLICY grant_obj_policy ACTIONS GRANT ON hr.employees - 监控权限回收:
CREATE AUDIT POLICY revoke_policy ACTIONS REVOKE ANY PRIVILEGE, REVOKE ANY ROLE
关键点:创建后必须显式启用,且作用域要匹配目标用户。例如:
- 全库启用:
AUDIT POLICY grant_priv_policy - 仅审计 DBA 组:
AUDIT POLICY grant_priv_policy BY DBA - 指定用户:
AUDIT POLICY grant_obj_policy BY app_admin, sec_officer
若策略中写了 BY 子句,但执行 GRANT 的会话登录用户不在列表里,就不会记录——不是策略失效,是作用域过滤掉了。
查不到日志?优先盯住这三个点
策略启用后仍无记录,大概率卡在这三个环节:
- 执行
GRANT的用户是否真有GRANT ANY PRIVILEGE权限?查:SELECT * FROM dba_sys_privs WHERE privilege = 'GRANT ANY PRIVILEGE' AND grantee = 'USERNAME' - 授予权限的操作是否触发了该系统权限?例如
GRANT SELECT ON hr.employees TO scott是,但GRANT SELECT ON scott.emp TO hr(自己 schema)可能不触发GRANT ANY OBJECT PRIVILEGE - 执行语句的会话是否属于策略启用范围?比如策略写了
BY DBA,但你是用SCOTT登录执行的,就不会被记录
另外,查询 UNIFIED_AUDIT_TRAIL 需用具备 READ ANY AUDIT RECORD 权限的用户(SYS 默认没有,会报错),且不能用 SELECT * 直接扫全表——默认审计字段多、数据量大,建议加时间范围和 action_name 过滤。











