oracle 11g 默认 audit_trail=db 不算“严格审计”,因其仅记录基础事件(如create session)、不审计sys操作(audit_sys_operations=false默认),且无sqltext/sqlbind内容;严格审计需同时配置db, extended、audit_sys_operations=true,并迁移aud$出system表空间。

直接结论:Oracle 11g 默认已开启审计(AUDIT_TRAIL=DB),但“严格用户审计”需额外配置 AUDIT_SYS_OPERATIONS=TRUE 并启用细粒度策略,否则仅记录基础会话和权限操作,无法捕获 SYS 用户行为或 SQL 内容。
为什么默认的 AUDIT_TRAIL=DB 不算“严格”
Oracle 11g 安装后 audit_trail 默认值就是 DB,但它只记录标准审计事件(如 CREATE SESSION、GRANT、DROP TABLE),且 SYS 用户操作默认不审计(audit_sys_operations=FALSE)。更关键的是:DB 模式下 SYS.AUD$ 表中不含实际执行的 SQL 文本和绑定变量 —— 这意味着你看到的只是“谁在什么时间删了表”,但看不到“删的是哪几行、WHERE 条件是什么”。
-
DB:只写入AUD$,无SQLTEXT/SQLBIND -
DB, EXTENDED:填充SQLTEXT和SQLBIND字段(需重启) -
audit_sys_operations=TRUE:强制审计所有SYSDBA/SYSOPER登录及操作(日志写入 OS 文件,不受audit_trail影响)
AUDIT_SYS_OPERATIONS=TRUE 必须配 OS 审计路径
这个参数设为 TRUE 后,所有以 SYSDBA 等高权限登录的用户(包括 SYS)的操作,都会写入操作系统文件,路径由 audit_file_dest 决定。注意:它**完全绕过** audit_trail 设置,哪怕你设的是 NONE,只要 audit_sys_operations=TRUE,SYS 的操作就一定落盘。
- 检查当前路径:
show parameter audit_file_dest,典型值如/u01/app/oracle/admin/ORCL/adump - 该目录需有足够空间,且 Oracle OS 用户(如
oracle)有写权限 - Windows 下日志不进
adump,而是进 Windows 事件查看器 → 应用程序日志 → OracleServiceORCL - 不能动态修改:必须用
scope=spfile+ 重启才生效
启用 DB, EXTENDED 才能看到真实 SQL
普通用户执行的 DML/DDL 若想被完整还原,必须让 AUDIT_TRAIL 包含 EXTENDED。否则 DBA_COMMON_AUDIT_TRAIL.SQL_TEXT 列全为空。
- 正确设置命令:
alter system set audit_trail='DB, EXTENDED' scope=spfile;(注意逗号后有空格) - 错误写法:
'DB,EXTENDED'(无空格)会被 Oracle 忽略,仍按DB处理 - 重启后验证:
show parameter audit_trail应返回DB, EXTENDED(不是DB,EXTENDED) - 此时再执行
AUDIT INSERT, UPDATE ON scott.emp BY ACCESS;,后续查询DBA_COMMON_AUDIT_TRAIL就能拿到完整语句
真正严格的审计还缺三件事
光改参数不够。生产环境开启严格审计,以下三点极易被忽略,但直接决定审计是否可用:
-
审计数据不能放在 SYSTEM 表空间:默认
AUD$在 SYSTEM 中,撑爆 SYSTEM 会导致普通用户无法登录(因CREATE SESSION本身被审计)。必须提前迁移:alter table aud$ move tablespace tbs_audit;+ 对应 LOB 段 -
必须清理旧审计数据:
TRUNCATE TABLE SYS.AUD$比DELETE快得多,且释放空间;但注意:TRUNCATE 是 DDL,会隐式提交,不可回滚 -
细粒度审计(FGA)要单独加:
AUDIT命令对SELECT无效(除非是SELECT ANY TABLE权限审计)。查敏感字段必须用DBMS_FGA.ADD_POLICY,例如查工资字段时触发记录











