统一审计未启用,所有策略都白搭——不是配置细节出错,而是根子上没激活。必须先完成二进制重链接并重启数据库,否则audit policy、dbms_audit_mgmt.init_cleanup这些操作全都会静默失效,连个报错都不给你。
先泼盆冷水:别只盯着 V$OPTION 中显示 TRUE 就觉得万事大吉。那个返回值仅说明数据库“支持”统一审计,并不代表已生效。真正要确认启用状态,必须同时满足以下三个条件:
SELECT value FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'返回TRUE;SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1不报ORA-00942,且能查到任意一行(即使结果集为空也可以);SHOW PARAMETER audit_trail的返回值必须是NONE(不能是DB、XML或混合模式下的残留值)。
这三个条件只要有一个不满足,说明系统仍停留在传统审计或混合模式,后续配置再多策略也是瞎子点灯白费蜡。

确认 Unified Auditing 是否真正启用
好,确认启用后咱们来落地具体策略。统一审计下的“用户访问”需要拆解为具体动作——登录失败、查询敏感表、执行 DDL 等,不能指望一个通用策略包打天下。必须按场景选好 ACTIONS:
- 监控登录失败:
CREATE AUDIT POLICY login_fail_policy ACTIONS LOGON WHENEVER NOT SUCCESSFUL - 监控 SELECT 敏感表:
CREATE AUDIT POLICY select_hr_policy ACTIONS SELECT ON hr.employees, hr.departments - 监控所有 DDL:
CREATE AUDIT POLICY ddl_policy ACTIONS CREATE ANY TABLE, DROP ANY TABLE, ALTER ANY TABLE
这里有个容易踩的坑:策略创建后必须显式启用,否则根本不会触发。举个例子:AUDIT POLICY login_fail_policy BY ALL USERS(全库生效),或者 AUDIT POLICY select_hr_policy BY zabbix_mon, app_user(指定用户)。不执行 AUDIT POLICY 命令,策略就是一张废纸。
细粒度访问审计要用 DBMS_FGA,不是 AUDIT POLICY
如果目标更具体——比如想知道“谁在什么时候查了工资字段”,那 AUDIT POLICY 就无能为力了,它不捕获列级读取。这时候必须请出 DBMS_FGA。但注意:FGA 和统一审计是并行机制,不是子集关系。
DBMS_FGA.ADD_POLICY的audit_column参数必须与表中实际列名的大小写完全一致(例如表定义是SALARY,就不能写成'salary');- 策略是否触发,取决于执行计划是否物理读取该列——如果查询走索引覆盖或函数索引跳过了列访问,FGA 就不会记录;
- 还有一条关键前提:
SHOW PARAMETER audit_trail不能是NONE,否则DBMS_FGA加策略会静默失败。统一审计启用后,FGA 的日志默认进入UNIFIED_AUDIT_TRAIL,但策略本身的创建和管理仍由 FGA 独立控制。
查不到日志?优先验证这三处
策略配好了,操作也做了,回头一查日志空空如也?别急着怀疑数据库坏了,问题大概率卡在以下环节:
- 执行操作的用户是否真有对应权限?比如
DROP ANY TABLE策略只捕获拥有该系统权限的用户去删除别人的表;如果用户只是删自己 schema 下的表,需要单独配ACTIONS DROP ON schema.table。 - 操作是否落在策略定义的精确对象上?
ACTIONS SELECT ON hr.employees不会捕获SELECT * FROM hr.emp_backup,对象名必须一字不差。 - 策略的启用范围是否覆盖了当前会话用户?
AUDIT POLICY xxx BY SYSTEM对SCOTT登录的操作完全无效。
统一审计的日志默认存在 UNIFIED_AUDIT_TRAIL 视图里,但这个视图本身依赖底层模块的加载——没走重链接,连视图都不存在,更别说查数据了。所以回过头来,第一件事还是确认二进制重链接是否真的做完了。
