簡述
審計 (Audit) 用於監視和記錄用戶所執行的數據庫操作,審計記錄可存在數據字典表(默認存儲在system表空間中的SYS.AUD$表中,可通過視圖dba_audit_trail查看審計記錄)或操作系統審計記錄文件中(默認位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)。默認情況下,是沒有開啟審計功能的
審計記錄內容包含
- 操作的日期和時間等信息
- 用戶執行的特定類型操作
注意: 無論是否打開數據庫的審計功能,以系統管理員(sysdba, sysoper)權限連接數據庫實例,啟動數據庫和關閉數據庫的操作都會強制寫入操作系統日志文件中。
存儲位置
舊(12c以前版本)審計引擎不同的組件存放在不同的位置
- SYS.AUD$ : 會存放數據庫的標准審計結果
- SYS.FGA_LOG$ : 會存放細粒度審計結果(fine-grained auditing
- DVSYS.AUDIT_TRAIL$ : 會存放Oracle Database Vault和Oracle Label Security等組件的審計結果
12C 統一審計引擎
- 所有的審計記錄都存儲在字典表
UNIFIED_AUDIT_TRAIL
審計功能
- 審計語句的成功執行、不成功執行或其兩者
審計維度
標准審計(AUD)
細粒度審計(FGA)-Fine Grained Auditing
細粒度的審計使用DBMS_FGA包完成配置和管理工作。細粒度審計除了審計功能外,還可用於綁定變量值的捕獲。oracle 9i引進的一個新特性。
審計級別
Statement (語句)、Privilege (權限)、object(對象)
Statement
對某種類型的SQL語句審計,不指定結構或對象。如audit table 會審計數據庫中所有的create table,drop table,truncate table語句。通過視圖DBA_STMT_AUDIT_OPTS查看當前開啟的審計選項
Privilege
對某些系統權限的使用情況進行審計。通過視圖DBA_PRIV_AUDIT_OPTS查看當前開啟的審計選項
object
對指定模式對象上的指定語句的審計。通過視圖DBA_OBJ_AUDIT_OPTS查看當前開啟的審計選項
審計選項
noaudit | audit
- audit: 開啟指定對象的審計
- noaudit: 取消審計
by ACCESS | by session
-
by access: 每一個被審計的操作都會生成一條審計記錄
-
by session: 同一個會話中同類型操作只會生成一條審計記錄,默認by session
whenever [not] successful
- whenever successful: 操作成功時才被審計
- whenever not successful: 操作失敗時才被審計
省略該子句時,不管操作成功與否都會審計。
新特性
11g 引入新特性之X$DBGALERTEXT內部視圖
若需要利用SQL查詢Oracle的alert.log告警日志,在11g以前可以通過創建Alert.log內容的外部表來實現查詢日志內容的目的。在11g開始,引入了新的ADR(Automatic Diagnostic Repository) 自動診斷倉庫特性之后,自動將alert.log文件格式自動轉換為XML的格式,默認存放在$ADR_HOME/alert&trace目錄下,並且為日志條目增加了更多的屬性(如Level之類),使得告警日志能提供更多有用的信息。
從11g開始,就不需要手動創建外部表的方式查詢,它已經由Oracle的內部視圖X$DBGALERTEXT直接提供。
set linesize 168 pagesize 99
select originating_timestamp, message_group, problem_key, message_text
from X$DBGALERTEXT
where message_text like '%ORA-00600%'
-- and message_group = 'Generic Internal Error' -- 最近出現過的Internal Errors
-- and message_group = 'admin_ddl' -- 審計最近2天內管理員執行過的DDL語句
and rownum < 10;
X$DBGALERTEXT的內容極其豐富,包括message記錄發生的日期、發生問題的進程號、trace日志的位置、問題的關鍵(problem key),為分析數據庫日志提供極為強大的接口,節約大量的時間。
當log.xml的大小超過10MB時,Oracle會將其內容歸檔到如log_$N.xml這樣的歸檔文件中,並清空當前的log.xml的內容。
注意: X$DBGALERTEXT的數據實際來源於ADR中的log.xml文件, 若xml被刪除或者內容缺失都會影響信息完整性
12C 新特性審計模式
-
Mixed Auditing Policy(混合審計模式):支持新的審計引擎和老的審計引擎一起工作,數據庫創建后,默認是使用混合模式,使用ora_secureconfig策略
-
審計策略:
set lines 168 pages 99 col POLICY_NAME for a32 col USER_NAME for a18 col SUCCESS for a8 col FAILURE for a8 select USER_NAME, POLICY_NAME, ENABLED_OPT, ENABLED_OPTION, SUCCESS, FAILURE from AUDIT_UNIFIED_ENABLED_POLICIES;- ora_secureconfig 策略
- ora_account_mgmt 策略
- ora_database_parameter 策略
-
-
Unified Auditing Policy(統一審計模式):12C新引入的審計引擎,審計數據默認放在sysaux表空間中的只讀審計表,其屬主是audsys(該用戶默認是被鎖定的)
查看統一審計模式下的審計記錄數據
通過字典表UNIFIED_AUDIT_TRAIL查看審計記錄
col OS_USERNAME format a12
col TERMINAL for a12
col SQL_TEXT format a60
COL AUDIT_TYPE format a10
col ACTION_NAME format a24
col UNIFIED_AUDIT_POLICIES format a18
select AUDIT_TYPE,OS_USERNAME,TERMINAL,ACTION_NAME,
SQL_TEXT,UNIFIED_AUDIT_POLICIES
from UNIFIED_AUDIT_TRAIL
where OBJECT_NAME='EMP';
相關參數
audit_sys_operations
默認為false,當設置為true時,所有sys用戶(包括以sysdba, sysoper身份登錄的用戶)的操作都會被記錄,審計記錄不會寫到sys.aud$表中。如果是Windows平台,它會記錄在windows的事件管理中,如果是linux/unix平台則會記錄在audit_file_dest參數指定的文件中。
注意:該參數是(static)靜態參數,需要重新啟動數據庫才能生效
audit_trail
注意:該參數是(static)靜態參數,需要重新啟動數據庫才能生效
-
None:是默認值,不做審計;
-
DB:將審計記錄在數據庫的審計相關表中,如aud$,審計的結果只有連接信息;
-
DB,Extended:審計結果里面除了連接信息還包含了當時執行的具體語句;
-
OS:將審計記錄在操作系統文件中,文件名由audit_file_dest參數指定;
-
XML:10g里新增的參數
安裝配置
desc sys.aud$
若上面語句返回結果:表不存在時,說明審計相關的表,視圖等對象還沒有安裝
安裝審計表
由於審計表默認安裝在SYSTEM表空間,因此,需要確保SYSTEM表空間有足夠的空間存放審計信息
sqlplus "/ as sysdba"<<EOF
@$ORACLE_HOME/rdbms/admin/cataudit.sql
shutdown immediate;
startup;
EOF
開啟審計
alter system set audit_sys_operations=TRUE scope=spfile;
alter system set audit_trail=db,extended scope=spfile;
shutdown immediate;
startup;
show parameter audit
查看審計配置信息
col PARAMETER_NAME FOR a30
col PARAMETER_VALUE FOR a16
col AUDIT_TRAIL FOR a20
SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL
FROM DBA_AUDIT_MGMT_CONFIG_PARAMS
WHERE audit_trail = 'STANDARD AUDIT TRAIL';
12C環境中配置審計模式
開啟統一審計模式
檢查當前審計模式
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
若為FALSE,則表示使用混合審計模式
取消統一審計策略
set lines 168 pages 99
col POLICY_NAME for a32
col USER_NAME for a18
col SUCCESS for a8
col FAILURE for a8
select USER_NAME, POLICY_NAME, ENABLED_OPT, ENABLED_OPTION, SUCCESS, FAILURE from AUDIT_UNIFIED_ENABLED_POLICIES;
-- 取消審計策略
NOAUDIT POLICY ORA_LOGON_FAILURES ;
-- 開啟審計策略
AUDIT POLICY ORA_LOGON_FAILURES WHENEVER NOT SUCCESSFUL;
關閉數據庫
sqlplus "/ as sysdba"<<EOF
shutdown immediate;
EOF
srvctl stop database -d orcl
Relink with the uniaud_on option
cd $ORACLE_HOME/rdbms/lib
# 開啟統一審計模式
make -f ins_rdbms.mk uniaud_on ioracle
# 關閉統一審計模式
make -f ins_rdbms.mk uniaud_off ioracle
注意:
- 在Windows平台開啟統一審計模式時,必須將
%ORACLE_HOME%\bin\orauniaud12.dll.dbl文件重命名為%ORACLE_HOME%\bin\orauniaud12.dll - 在Windows平台關閉統一審計模式時,必須將
%ORACLE_HOME%\bin\orauniaud12.dll.dll文件重命名為%ORACLE_HOME%\bin\orauniaud12.dbl
重啟數據庫
sqlplus "/ as sysdba"<<EOF
startup;
EOF
srvctl start database -d orcl
檢查確認
-- 檢查開啟哪種審計模式
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
-- 檢查審計數據
set lines 200 pages 99
col name for a18
col username for a18
col account_status for a24
col def_tbs for a16
col temp_tbs for a16
col lt_tbs for a16
select u.con_id,
c.name,
username,
account_status,
DEFAULT_TABLESPACE def_tbs,
TEMPORARY_TABLESPACE temp_tbs,
LOCAL_TEMP_TABLESPACE lt_tbs
from cdb_users u, v$containers c
where u.con_id = c.con_id
and u.username = upper('audsys');

審計相關的表移動到其他表空間
建議把AUD$表移動到其他的表空間上
手動遷移方式
alter table aud$ move tablespace AUDTBS;
alter table FGA_LOG$ move tablespace AUDTBS;
set lines 168 pages 999
col TABLE_NAME for a32
col SEGMENT_NAME for a32
col TABLESPACE_NAME for a16
col COLUMN_NAME for a32
select TABLE_NAME, SEGMENT_NAME, TABLESPACE_NAME,COLUMN_NAME,'alter table '|| TABLE_NAME || ' move lob('|| COLUMN_NAME ||') store as '|| SEGMENT_NAME ||' (tablespace AUDTBS);' sql_cmd
from dba_lobs
where table_name in ('AUD$', 'FGA_LOG$');
-- alter table AUD$ move lob(SQLBIND) store as SYS_LOB0000000407C00040$$ (tablespace AUDTBS);
-- alter table AUD$ move lob(SQLTEXT) store as SYS_LOB0000000407C00041$$ (tablespace AUDTBS);
select INDEX_NAME, TABLE_NAME, 'alter index ' || INDEX_NAME || ' rebuild online tablespace AUDTBS;' sql_cmd
from dba_indexes
where table_name in ('AUD$', 'FGA_LOG$');
使用存儲過程遷移方式
使用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程SET_AUDIT_TRAIL_LOCATION來實現遷移審計表空間,該存儲過程接受2個參數,順序依次是AUDIT_TRAIL_TYPE和AUDIT_TRAIL_LOCATION_VALUE
-- 遷移審計表到audtbs的表空間
BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_location_value => 'AUDTBS');
END;
/
BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD,
audit_trail_location_value => 'AUDTBS');
END;
/
-- 檢查確認
SELECT table_name, tablespace_name FROM dba_tables WHERE table_name IN ('AUD$', 'FGA_LOG$');
select TABLE_NAME, SEGMENT_NAME, TABLESPACE_NAME from dba_lobs where table_name in ('AUD$', 'FGA_LOG$');
參數AUDIT_TRAIL_TYPE有以下幾種取值
-
AUDIT_TRAIL_ALL: 所有的審計類型,包括標准數據庫審計、細粒度審計、操作系統審計和XML文件審計
-
AUDIT_TRAIL_AUD_STD: 標准數據庫審計
-
AUDIT_TRAIL_DB_STD :標准數據庫審計和細粒度審計
-
AUDIT_TRAIL_FGA_STD: 細粒度審計
-
AUDIT_TRAIL_FILES :操作系統和XML文件審計
-
AUDIT_TRAIL_OS : 操作系統審計,審計數據存放在操作系統的文件里
-
AUDIT_TRAIL_XML :XML文件審計,審計數據存放在XML文件里
參數AUDIT_TRAIL_LOCATION_TYPE的取值是指定要遷移到的表空間的名字
審計記錄數據維護
通過Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程管理
- SET_AUDIT_TRAIL_PROPERTY:設置審計的維護屬性,即每清除多少條數據提交一次
- INIT_CLEANUP:設置審計數據保留的天數
- SET_LAST_ARCHIVE_TIMESTAMP:設置上次歸檔審計記錄的時間戳
- CREATE_PURGE_JOB:設置每隔多長時間清除審計數據的JOB
init_cleanup
-- 設定清除間隔
BEGIN
DBMS_AUDIT_MGMT.init_cleanup(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
default_cleanup_interval => 120 /* hours */);
END;
/
驗證
SET SERVEROUTPUT ON
BEGIN
IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
DBMS_OUTPUT.put_line('YES');
ELSE
DBMS_OUTPUT.put_line('NO');
END IF;
END;
/
select to_char(min(ntimestamp#),'yyyy-mm-dd hh24:mi:ss') ntime from sys.aud$;
SET_LAST_ARCHIVE_TIMESTAMP
-- 設定歸檔間隔
BEGIN
DBMS_AUDIT_MGMT.set_last_archive_timestamp(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
last_archive_time => SYSTIMESTAMP-8
);
END;
/
-- 查看設定的歸檔間隔
SELECT * FROM dba_audit_mgmt_last_arch_ts;
CREATE_PURGE_JOB
-- 通過創建一個purge Job來進行清理已歸檔的歷史審計記錄
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,
AUDIT_TRAIL_PURGE_NAME => 'DAILY_AUDIT_PURGE_JOB',
USE_LAST_ARCH_TIMESTAMP => TRUE
);
END;
/
exec DBMS_SCHEDULER.RUN_JOB(job_name => 'SYS.DAILY_AUDIT_PURGE_JOB');
手動清理審計記錄數據
sqlplus -S / as sysdba << EOF > clear_aud_`date +%Y%m%d`.log
create table tb_aud_`date +%Y%m` nologging tablespace AUDTBS compress as select * from aud\$;
truncate table sys.aud\$;
EOF
# 表如果太大則采用該方式清理,keep值根據實際情況設置,例如當前aud$大小為5000m
truncate table sys.aud$ reuse storage;
alter table sys.aud$ deallocate unused keep 4000m;
alter table sys.aud$ deallocate unused keep 3000m;
alter table sys.aud$ deallocate unused keep 2000m;
alter table sys.aud$ deallocate unused keep 1000m;
## fga_log$ 表使用類似的清理方法
示例
審計登錄失敗事件
alter session set nls_date_format='yyyy-mm-dd HH24:Mi:SS';
set lines 168 pages 99
col userhost for a32
col terminal for a18
col LOGOFF$TIME for a32
select userid,userhost,terminal,action#,LOGOFF$TIME,NTIMESTAMP#
from sys.aud$
where userid ='GDYX2'
and rownum<20;
alter session set nls_date_format='yyyy-mm-dd HH24:Mi:SS';
set lines 168 pages 999
col os_username for a18
col userhost for a32
col terminal for a18
col username for a18
select os_username,userhost,terminal,username,TIMESTAMP,count(*)
from dba_audit_trail
where returncode = 1017
and TIMESTAMP > (sysdate - 10)
group by os_username,userhost,username,terminal,TIMESTAMP
order by TIMESTAMP desc ;

附錄
參考文檔
- How to - Monitor Non Critical 11g Database Alert Log Errors Using a SQL UDM (Doc ID 961682.1)
