Oracle审计需按场景选择机制:标准审计(AUDIT_TRAIL)记录语句级操作;统一审计(12c+)策略化管理;FGA实现列级条件审计;登录触发器捕获会话行为;手动写aud$无效且危险。

Oracle PL/SQL 本身不提供独立的“审计功能”,真正的审计能力来自数据库层配置(如 AUDIT_TRAIL)或系统触发器。直接在 PL/SQL 块里写 INSERT INTO aud$ 是无效且危险的——aud$ 是只读审计基表,不允许手动写入。
用标准审计开启语句级/对象级操作记录
标准审计由参数 AUDIT_TRAIL 控制,生效需重启实例,适用于记录 CREATE、DROP、SELECT 等动作的执行者和时间,但不记录 SQL 文本内容(除非设为 DB, EXTENDED)。
-
AUDIT_TRAIL = DB:审计记录存入SYS.AUD$,通过DBA_AUDIT_TRAIL视图查询;仅含操作类型、用户、时间、对象名 -
AUDIT_TRAIL = DB, EXTENDED:额外填充SQLTEXT和SQLBIND字段,可查到完整语句(注意性能开销增大) -
AUDIT SELECT ON hr.employees BY scott;:只审计scott对该表的 SELECT,不审计其他用户 - 不支持条件过滤(比如“只审 WHERE salary > 10000 的 UPDATE”),这是细粒度审计的范畴
用登录/登出触发器捕获会话级行为
系统触发器是 PL/SQL 实现定制化审计最常用方式,但极易因权限、上下文或字段长度出错。
- 必须用
SYS_CONTEXT('USERENV', 'IP_ADDRESS')获取客户端 IP,不能用:NEW或:OLD(否则报ORA-04082) - 审计表字段要预留足够长度:
IP_ADDRESS至少VARCHAR2(46)(兼容 IPv6),PROGRAM推荐VARCHAR2(64) - 触发器所有者必须有
INSERT权限:GRANT INSERT ON audit_login_log TO sys;(若在sys下建触发器) - 测试必须用普通用户(如
conn scott/tiger),/ AS SYSDBA登录默认绕过登录触发器 - 触发器状态必须为
ENABLED:SELECT trigger_name, status FROM dba_triggers WHERE triggering_event = 'LOGON';
用统一审计策略替代旧式 AUDIT 语句
Oracle 12c+ 推荐统一审计(Unified Auditing),它绕过传统 AUDIT 语法,所有记录统一写入 UNIFIED_AUDIT_TRAIL,且无需重启数据库。
- 启用前需确认数据库已编译为统一审计模式:
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';返回TRUE - 创建策略:
CREATE AUDIT POLICY hr_select_policy ACTIONS SELECT ON hr.employees; - 启用策略并指定用户:
AUDIT POLICY hr_select_policy BY scott; - 查记录:
SELECT event_timestamp, sql_text, userhost FROM unified_audit_trail WHERE policy_name = 'HR_SELECT_POLICY'; - 统一审计默认不记录绑定变量值,如需捕获需配合
WITH CONTEXT或细粒度审计
细粒度审计(FGA)用于列级/条件级监控
当需要“只审计 UPDATE salary SET bonus = ? WHERE dept = 'SALES'”这类带条件的操作时,标准审计和统一审计都做不到,必须用 DBMS_FGA。
- FGA 策略不记录在
UNIFIED_AUDIT_TRAIL,而是走独立路径:DBA_FGA_AUDIT_TRAIL或ALL_FGA_AUDIT_TRAIL - 添加策略示例:
DBMS_FGA.ADD_POLICY(object_schema => 'hr', object_name => 'employees', policy_name => 'salary_fga', audit_condition => 'dept = ''SALES''', audit_column => 'salary'); - FGA 不审计 SELECT *,只审计明确指定的列;
audit_condition是 SQL 表达式,不是 PL/SQL 块 - 策略启用后立即生效,无需重启,但无法捕获 DDL 或登录行为
真正难的不是写几行 CREATE TRIGGER,而是搞清每种机制的边界:标准审计管语句类型,统一审计管策略分组,FGA 管列+条件,而登录触发器只管会话生命周期——混用之前,先确认你要审计的到底是“谁在什么时候连上来”,还是“谁改了哪一行的哪个字段”。


















