oracle 19c默认未启用统一审计,需重启数据库执行audit unified auditing并打开库才能生效;验证需查v$unified_audit_trail且返回记录,提权行为审计依赖精细策略与extra_info解析。

Oracle 19c 默认不启用统一审计(Unified Auditing),直接查 V$UNIFIED_AUDIT_TRAIL 会返回空,或报错 ORA-00942: table or view does not exist —— 这不是权限问题,是审计功能根本没开。
确认统一审计是否已启用
统一审计是编译进 Oracle 可执行文件的特性,但运行时需显式启用。不能靠 AUDIT 语句触发,必须重启数据库生效:
- 登录为
SYS(AS SYSDBA),执行:SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
返回TRUE才表示已编译支持;若为FALSE,说明安装时未勾选该选项,需重装数据库软件(常见于 Windows 下静默安装漏选) - 检查当前是否实际启用:
SELECT PARAMETER, VALUE FROM V$PARAMETER WHERE NAME = 'unified_audit_sga_queue_size';
若返回空行,说明未启用;若返回值(如1048576),才表示已开启 - 最直接验证:
SELECT COUNT(*) FROM V$UNIFIED_AUDIT_TRAIL;
首次查询可能报ORA-00942,这是正常现象——说明数据字典视图尚未创建,需执行启用步骤
启用统一审计并重启实例
启用操作不可逆(禁用需重建数据库),且必须停库。关键点在于:不是改参数,而是重建控制文件级别的审计配置:
- 关闭数据库:
SHUTDOWN IMMEDIATE;
- 以
MOUNT模式启动:STARTUP MOUNT;
- 启用统一审计:
AUDIT UNIFIED AUDITING;
(注意:这不是 DML,是 DDL 级别指令) - 打开数据库:
ALTER DATABASE OPEN;
- 验证是否生效:
SELECT * FROM V$UNIFIED_AUDIT_TRAIL WHERE ROWNUM 此时应能查到至少一条系统自动生成的审计记录(如数据库启动事件)
审计用户提权行为(SU / SUDO 不在此列)
Oracle 本身不处理 OS 层的 su 或 sudo,它只审计数据库内用户身份变更行为,比如:
-
CONNECT AS SYSDBA(含sqlplus / as sysdba) - 通过
ALTER SESSION SET CURRENT_SCHEMA切换 schema(非提权,但属上下文变更) - 使用
SET ROLE启用高权限角色(如DBA) - 执行
GRANT/REVOKE权限操作
要捕获这些,需创建精细策略:
CREATE AUDIT POLICY ora_user_privilege_policy<br> ACTIONS COMPONENT=DATAPUMP,<br> COMPONENT=RMAN,<br> GRANT,<br> REVOKE,<br> ALTER SYSTEM,<br> ALTER SESSION,<br> SYSTEM GRANT;<br>AUDIT POLICY ora_user_privilege_policy;
⚠️ 注意:SYSTEM GRANT 包含 GRANT DBA TO ...,但不包括普通用户连入后用 SET ROLE DBA —— 后者需额外加 ACTIONS SET ROLE。
查提权相关审计记录的关键字段
统一审计日志字段多、嵌套深,真正反映“谁在何时以何身份干了什么”的核心字段就几个:
-
AUDIT_TYPE:值为Unified Audit表示来自统一审计 -
ACTION_NAME:如LOGON、GRANT、SET ROLE、ALTER SYSTEM -
RETURN_CODE:0 表示成功,非 0 是失败(如权限不足被拒) -
OS_USERNAME和DBUSERNAME:区分操作系统登录名与数据库用户名,提权常表现为二者不一致(如 OS 用户oracle连入后AS SYSDBA) -
EXTRA_INFO:JSON 字段,含"ROLE"、"GRANTEE"等细节,需用JSON_VALUE解析,例如:SELECT JSON_VALUE(EXTRA_INFO, '$.ROLE') AS role_name<br>FROM UNIFIED_AUDIT_TRAIL<br>WHERE ACTION_NAME = 'SET ROLE';
真正难的是把 OS_USERNAME 和数据库会话生命周期对齐——Oracle 不记录 SSH 登录 IP 或终端类型,这部分得靠 Linux 层的 auditd 或 sshd 日志交叉比对。统一审计只管“数据库内发生了什么”,不管“谁从哪台机器连进来”。











