Oracle Database 从 12c 版本开始把标准审计、细粒度审计和操作系统审计整合到统一审计框架中,配置方式也从传统零散的 AUDIT 语句转变为策略化管理。统一审计不再把记录分散写入 SYS.AUD$ 或 FGA_LOG$,而是由 AUDSYS 架构统一管理,并通过只读视图 UNIFIED_AUDIT_TRAIL 对外展示。对数据库管理员来说,理解统一审计的启用状态、策略创建和线索查询,是把审计要求落到实处的关键。

一、统一审计的启用状态检查与底层变化
统一审计并不是简单调整初始化参数就能开启的。Oracle Database 12c 及后续版本新建数据库时通常默认启用统一审计,但从早期版本升级上来的数据库可能仍然运行在传统审计模式或混合模式下。判断当前数据库是否真正启用了统一审计,最直接的方法是查询数据字典视图 V$OPTION。
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
如果上述查询返回 TRUE,说明统一审计组件已经启用,后续创建的审计策略可以直接生效。如果返回 FALSE,则说明数据库尚未启用统一审计,此时即便执行 CREATE AUDIT POLICY,也可能无法达到预期效果。需要注意的是,初始化参数 AUDIT_TRAIL 只负责控制传统审计行为,它取值 DB、OS 或 NONE 对统一审计没有决定作用,许多管理员误以为设置 AUDIT_TRAIL=DB 就是启用了统一审计,这是常见误解。
对于确实需要从传统审计切换到统一审计的环境,可以在关闭数据库后,在操作系统命令行执行 Oracle 二进制重新链接。Linux 或 Unix 平台的操作示例如下。
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
执行完成后重新启动数据库实例,再查询 V$OPTION 确认状态已经变为 TRUE。统一审计启用后,审计记录的底层存储和上报渠道都会切换到 AUDSYS,原来通过 DBA_AUDIT_TRAIL 查询传统审计记录的思路也需要同步调整到 UNIFIED_AUDIT_TRAIL。
二、创建和启用统一审计策略
统一审计的核心对象是审计策略。通过 CREATE AUDIT POLICY 可以把权限、对象动作、角色和条件判断组合在一个策略内,从而替代传统模式中逐条执行的 AUDIT 语句。以审计 HR.EMPLOYEES 表上的 SELECT 和 UPDATE 操作为例,可以创建如下策略。
CREATE AUDIT POLICY aud_hr_emp_access
ACTIONS SELECT ON hr.employees, UPDATE ON hr.employees
WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') NOT IN (''HR'')'
EVALUATE PER SESSION;
这个策略的含义是:当会话用户不是 HR 用户时,对 HR.EMPLOYEES 表执行 SELECT 或 UPDATE 操作将会被审计。WHERE 条件中使用 SYS_CONTEXT 获取当前会话用户,能够把审计范围限制在真正的外部访问上,减少内部维护操作产生的噪声。策略中的 EVALUATE PER SESSION 表示每个会话只判断一次条件,如果条件结果为假,则该会话后续操作不再重复判断,这样可以降低审计对系统性能的影响。
策略创建之后不会自动生效,必须显式执行 AUDIT POLICY 命令启用。最简单的启用方式是对所有用户生效。
AUDIT POLICY aud_hr_emp_access;
如果只需要审计某些指定用户,可以在启用时加上 BY 子句。还可以通过 WHENEVER SUCCESSFUL 或 WHENEVER NOT SUCCESSFUL 进一步过滤成功或失败的审计记录。
AUDIT POLICY aud_hr_emp_access BY scott, app_user WHENEVER SUCCESSFUL;
后续业务发生变化时,可以动态修改策略,而不需要先删除再重建。例如增加对 DELETE 操作的审计,直接使用 ALTER AUDIT POLICY 即可。
ALTER AUDIT POLICY aud_hr_emp_access ADD ACTIONS DELETE ON hr.employees;
不再需要某个策略时,先停止审计再删除策略,避免出现已经失效却仍然占用空间或影响判断的情况。
NOAUDIT POLICY aud_hr_emp_access; DROP AUDIT POLICY aud_hr_emp_access;
三、查询统一审计线索与清理归档
统一审计记录集中存放在 UNIFIED_AUDIT_TRAIL 只读视图中。该视图的字段比传统审计视图更丰富,既包含会话号、数据库用户名、操作名称,也包含对象属主、对象名、SQL 文本以及返回码等关键信息。实际排查问题时,通常先按策略名称或时间范围缩小结果集。
SELECT event_timestamp,
dbusername,
action_name,
object_schema,
object_name,
sql_text,
return_code
FROM unified_audit_trail
WHERE unified_audit_policies = 'AUD_HR_EMP_ACCESS'
ORDER BY event_timestamp DESC;
通过 RETURN_CODE 可以快速判断操作是否成功,例如返回 0 表示成功,非 0 表示失败。对于登录失败审计,ACTION_NAME 会显示 LOGON,结合 DBUSERNAME 和 CLIENT_PROGRAM_NAME 可以定位异常访问来源。统一审计视图支持常规 SQL 过滤和分组统计,管理员可以根据实际需求灵活组合查询条件。
审计记录会持续增长,如果不做清理,AUDSYS 表空间可能不断扩大。Oracle 提供 DBMS_AUDIT_MGMT 包来管理审计线索的归档和清理。通常先设置最后归档时间,再执行清理,只删除已经归档过的记录。
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
last_archive_time => SYSTIMESTAMP - INTERVAL '7' DAY
);
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
use_last_arch_timestamp => TRUE
);
END;
/
上述逻辑表示只清理七天以前且已经归档的统一审计记录。生产环境应当把清理动作封装到数据库调度任务中定时执行,同时监控 AUDSYS 表空间使用率,避免因审计数据增长造成空间不足。
四、配置要点与常见误区
执行统一审计策略相关操作需要足够的权限。通常建议使用 AUDIT_ADMIN 角色,而不是直接依赖 DBA 权限完成所有审计配置。这样既满足职责分离要求,又能避免误操作对审计策略产生影响。创建策略时,最小权限原则同样适用,只审计业务明确要求的表和操作类型,不要因为省事而审计整库或所有动作。
另一个常见误区是策略创建后没有执行 AUDIT POLICY,导致很长一段时间内完全没有审计记录。还有一部分管理员在测试环境中看到策略生效,但生产环境是从旧版本升级而来,忘记检查 V$OPTION,最终造成审计漏配。要判断策略是否已经启用,可以查询 AUDIT_UNIFIED_ENABLED_POLICIES 视图。
SELECT policy_name,
user_name,
success,
failure
FROM audit_unified_enabled_policies;
该视图会显示当前已经启用策略对应的用户范围以及成功和失败审计开关。通过比对策略清单和业务要求,可以及时发现策略遗漏或错误启用。对于临时审计需求,可以在需求结束后立即执行 NOAUDIT POLICY,避免产生大量无用记录。
统一审计的优势在于集中管理、策略化和条件化审计,但并不意味着它可以无限制使用。条件判断、SQL 文本捕获以及过宽的对象范围都会增加数据库开销。配置时应结合审计目标,选择 EVALUATE PER SESSION 或 EVALUATE PER STATEMENT,并根据实际安全要求决定是否启用成功或失败过滤。只有把启用状态检查、策略创建、记录查询和定期清理结合起来,才能形成一个稳定、可维护的 Oracle 统一审计体系。
Oracle统一审计Unified Auditing审计策略修改时间:2026-08-30 07:44:02