Oracle12.2c統一審計(unified auditing)六問
概述
統一審計體系是Oracle在12c推出的新的日志體系。12.1和12.2雖然都屬於該體系,但是12.1與12.2版本相比,明顯給人一種半成品的感覺。包括基表,刪除行為等方面存在較大差異,有興趣的可以去了解一下,本文主要以12.2講述。
1. 什么是統一審計?
2. 如何檢查統一審計是否開啟?
3. 審計數據落盤策略是什么?
4. 如何將操作系統上的審計數據寫入數據庫統一審計文件中?
5. 刪除審計的兩種方法?
6. 統一審計生產實戰配置?
什么是統一審計?
審計是指監控和記錄用戶對數據庫執行所有成功或失敗的操作。
而統一審計( UNIFIED_AUDIT_TRAIL )是 Oracle 在 12c 版本推出的一種全新的審計體系。在新的體系下, Oracle 提供了更精細化的管理,並且將所有的審計記錄按照統一的格式寫入到 AUDSYS schema 下,可以通過 UNIFIED_AUDIT_TRAIL 視圖查看。默認地,審計記錄會被存放在 SYSAUX 表空間下。當然, Oracle 也建議將審計數據從 SYSAUX 中剝離出來放到新的表空間下,這一功能可以通過 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION 包實現。
統一審計的相關權限?
除了 SYS 用戶外,只有被賦予 AUDIT_ADMIN 或 AUDIT_VIEWER 的用戶才能看到 UNIFIED_AUDIT_TRAIL 數據字典視圖。如果用戶只需要查詢 UNIFIED_AUDIT_TRAIL ,但是不需要創建審計策略 (audit policy) ,那么只需要賦予 AUDIT_VIEWER role 就可以了。
如何檢查統一審計是否開啟?
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
VALUE ---------------------------------------------------------------- FALSE |
TRUE: 代表完全統一審計開啟;
FALSE :代表傳統審計和統一審計的混合模式。
什么是完全統一審計模式 (Pure unified auditing) 和混合審計模式 (Mixed Mode Auditing) ?
完全統一審計模式,顧名思義,就是摒棄了之前的傳統審計模式。
禁用統一審計方法 , 以單機為例:
shutdown cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_off ioracle startup |
混合審計模式,只要開啟了統一審計策略,就會形成統一審計和傳統審計並存的局面,此時就是混合審計模式。默認建庫時會啟用 ORA_SECURECONFIG ,一個統一審計策略,這也就意味着默認建庫時,就是混合審計模式。
ORA_SECURECONFIG 詳情如下:
CREATE AUDIT POLICY ORA_SECURECONFIG PRIVILEGES ALTER ANY TABLE, CREATE ANY TABLE, DROP ANY TABLE, CREATE ANY PROCEDURE, DROP ANY PROCEDURE, ALTER ANY PROCEDURE, GRANT ANY PRIVILEGE, GRANT ANY OBJECT PRIVILEGE, GRANT ANY ROLE, AUDIT SYSTEM, CREATE EXTERNAL JOB, CREATE ANY JOB, CREATE ANY LIBRARY, EXEMPT ACCESS POLICY, CREATE USER, DROP USER, ALTER DATABASE, ALTER SYSTEM, CREATE PUBLIC SYNONYM, DROP PUBLIC SYNONYM, CREATE SQL TRANSLATION PROFILE, CREATE ANY SQL TRANSLATION PROFILE, DROP ANY SQL TRANSLATION PROFILE, ALTER ANY SQL TRANSLATION PROFILE, TRANSLATE ANY SQL, EXEMPT REDACTION POLICY, PURGE DBA_RECYCLEBIN, LOGMINING, ADMINISTER KEY MANAGEMENT ACTIONS ALTER USER, CREATE ROLE, ALTER ROLE, DROP ROLE, SET ROLE, CREATE PROFILE, ALTER PROFILE, DROP PROFILE, CREATE DATABASE LINK, ALTER DATABASE LINK, DROP DATABASE LINK, CREATE DIRECTORY, DROP DIRECTORY, CREATE PLUGGABLE DATABASE, DROP PLUGGABLE DATABASE, ALTER PLUGGABLE DATABASE, EXECUTE ON DBMS_RLS; |
審計數據落盤策略是什么?
審計數據寫入數據文件有兩種方式:
1. immediate-write mode 立即寫
2. queued-write mode 隊列寫
立即寫是將產生的審計數據馬上寫入硬盤,這樣可以保證不丟失審計數據,但是對系統系統會有些許影響。
隊列寫是先將審計數據寫入 SGA ,而不是直接寫入數據文件,根據一定的策略再將審計數據寫入數據文件。一般有兩種策略:
l 時間策略:每隔三秒鍾,視系統繁忙程度,也可能三秒鍾了也沒有寫入。由隱含參數 _unified_audit_flush_interval 控制。
l 空間策略:存放在 SGA 中的審計數據容量達到 85% 。該區域默認是 1M ,由參數 unified_audit_sga_queue_size 控制,比例由隱含參數 _unified_audit_flush_threshold 控制
SQL> col name for a30; SQL> col value for a10; SQL> select * from 2 (select 3 x.ksppinm name, 4 y.ksppstvl value, 5 y.ksppstdf isdefault, 6 decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod, 7 decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj 8 from 9 sys.x$ksppi x, 10 sys.x$ksppcv y 11 where 12 x.inst_id = userenv('Instance') and 13 y.inst_id = userenv('Instance') and 14 x.indx = y.indx 15 order by 16 translate(x.ksppinm, ' _', ' ')) T where T.name like '%unified_audit%';
NAME VALUE ISDEFAULT ISMOD ISADJ ------------------------------ ---------- --------- ---------- ----- _unified_audit_flush_interval 3 TRUE FALSE FALSE _unified_audit_flush_threshold 85 TRUE FALSE FALSE _unified_audit_policy_disabled FALSE TRUE FALSE FALSE unified_audit_sga_queue_size 1048576 TRUE FALSE FALSE |
當前落盤方式
SQL> SELECT PARAMETER_VALUE 2 FROM DBA_AUDIT_MGMT_CONFIG_PARAMS 3 WHERE PARAMETER_NAME = 'AUDIT WRITE MODE';
PARAMETER_VALUE ----------------------------------------------------------------- QUEUED WRITE MODE |
修改為 immediate-write mode
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY( DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE, DBMS_AUDIT_MGMT.AUDIT_TRAIL_IMMEDIATE_WRITE); END; / |
修改為
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY( DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE, DBMS_AUDIT_MGMT.AUDIT_TRAIL_QUEUED_WRITE); END; / |
隊列寫模式下如何手動 flush 審計數據?
手動刷新當前實例,適用於單機和 rac 單實例
EXEC DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL;
EXEC DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(DBMS_AUDIT_MGMT.FLUSH_CURRENT_INSTANCE);
|
Flush RAC 所有實例
EXEC DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(DBMS_AUDIT_MGMT.FLUSH_ALL_INSTANCES); |
對於多租戶環境
當前 PDB
BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT); END; / |
所有的 PDB 環境
BEGIN DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL( CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_ALL); END; / |
如何將操作系統上的審計數據寫入數據庫統一審計文件中?
當數據庫 mount 狀態,或者 read only ,或者關閉時, Oracle 會將審計數據存放在操作系統的 $ORACLE_BASE/audit/$ORACLE_SID 目錄下。
查看當前操作系統下
oracle@bd-dev-mingshuo-183:/opt/app/oracle/audit/mingdb/70A2182C94E1412DE053B7D91FAC647A$ll total 32 -rw------- 1 oracle oinstall 30720 Jul 10 16:57 ora_audit_0786.bin |
登入數據庫執行
EXEC DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES; |
命令完成之后,操作系統那個文件就消失了。
每個 PDB 會有一個同名的 uuid 目錄,如果要將 pdb 的數據導入數據庫,那么需要在 pdb 中執行上述命令。
刪除審計的兩種方法?
1. 自動清理任務
設置清理時間點
BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, LAST_ARCHIVE_TIME => '12-OCT-2013 06:30:00.00', RAC_INSTANCE_NUMBER => 1, CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT); END; / |
AUDIT_TRAIL_TYPE :指定審計數據類型
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED :統一審計數據
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD : AUD$ 表
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD : FGA_LOG$ 表
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS :操作系統上 .aud 結尾的文件
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_XML : XML 文件
LAST_ARCHIVE_TIME :指定時間,設置后該時間可以從 DBA_AUDIT_MGMT_LAST_ARCH_TS 中查出,設置時間點的意義在於,會清理這個時間點之前的歸檔過的數據。
RAC_INSTANCE_NUMBER : RAC 數據庫相關參數。單實例不需要設置。默認值是 null 。因為 RAC 數據庫也只有一個 AUD$ 表和 FGA_LOG$ 表
,那么即使是 RAC 數據庫,對應的審計類型 DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD 和 DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD ,那么也不用設置這個值。
CONTAINER :適用於多租戶環境
l DBMS_AUDIT_MGMT.CONTAINER_CURRENT :指定當前 PDB
l DBMS_AUDIT_MGMT.CONTAINER_ALL :所有 PDB
當上述設置完成后,就可以用 DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 包清理設置的時間點之前的審計數據。
BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => TRUE); END; / |
創建清理 job
BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB ( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, AUDIT_TRAIL_PURGE_INTERVAL => 12, AUDIT_TRAIL_PURGE_NAME => 'Audit_Trail_PJ', USE_LAST_ARCH_TIMESTAMP => TRUE, CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT); END; / |
AUDIT_TRAIL_TYPE: 指定審計數據類型
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED :統一審計數據
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD :針對 AUD$ 表
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD :針對 FGA_LOG$ 表
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD :針對 AUD$ 表和 FGA_LOG$ 表
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS :操作系統上 .aud 結尾的文件
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_XML : XML 文件
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_FILES :操作系統上 .aud 結尾的文件和 XML 文件
l DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL :上述所有類型的審計數據
AUDIT_TRAIL_PURGE_INTERVAL : job 每隔多久就運行一次,單位是小時。如果后面想要更改這個值,那么可以用 DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL 包。
USE_LAST_ARCH_TIMESTAMP :清理數據的時間選項
l TRUE: 清理截止到上次歸檔的時間點
l FLASE: 刪除所有的數據
CONTAINER :多租戶環境適用
l DBMS_AUDIT_MGMT.CONTAINER_CURRENT : PDB 級別
l DBMS_AUDIT_MGMT.CONTAINER_ALL : CDB 和 PDB 級別
設置好 job 后,啟動
BEGIN DBMS_AUDIT_MGMT.SET_PURGE_JOB_STATUS( AUDIT_TRAIL_PURGE_NAME => 'Audit_Trail_PJ', AUDIT_TRAIL_STATUS_VALUE => DBMS_AUDIT_MGMT.PURGE_JOB_ENABLE); END; / |
AUDIT_TRAIL_PURGE_NAME : purge job 策略的名字,就是上面 CREATE_PURGE_JOB 里指定的。
AUDIT_TRAIL_STATUS_VALUE :
l DBMS_AUDIT_MGMT.PURGE_JOB_ENABLE :開啟
l DBMS_AUDIT_MGMT.PURGE_JOB_DISABLE :停止
修改 job 運行間隔
BEGIN DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL( AUDIT_TRAIL_PURGE_NAME => 'Audit_Trail_PJ', AUDIT_TRAIL_INTERVAL_VALUE => 24); END; / |
刪除清理 job
BEGIN DBMS_AUDIT_MGMT.DROP_PURGE_JOB( AUDIT_TRAIL_PURGE_NAME => 'Audit_Trail_PJ'); END; / |
2. 手動清理審計
BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, USE_LAST_ARCH_TIMESTAMP => TRUE, CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT ); END; /
|
各參數含義同上。
統一審計生產實戰配置?
為了防止審計數據過多,需要定期對審計數據進行清理。
移動審計表空間
BEGIN DBMS_AUDIT_MGMT.set_audit_trail_location( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD, audit_trail_location_value => 'TBS_MING'); END; / |
設置 purge job
BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB ( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, AUDIT_TRAIL_PURGE_INTERVAL => 24, AUDIT_TRAIL_PURGE_NAME => 'Unified_Audit_Trail_PURGEJOB', USE_LAST_ARCH_TIMESTAMP => TRUE); END; / |
上面的 job 在運行時,要根據 SET_LAST_ARCHIVE_TIMESTAMP 的時間,下面的 job 可以手動刷新這個時間,不然上面的 job 最多只運行一次。
BEGIN DBMS_SCHEDULER.create_job ( job_name => 'audit_last_archive_time', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, TRUNC(SYSTIMESTAMP)-60); END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=daily; byhour=0; byminute=0; bysecond=0;', end_date => NULL, enabled => TRUE, comments => 'Automatically set audit last archive time.'); END; / |
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/31480688/viewspace-2221638/,如需轉載,請注明出處,否則將追究法律責任。
轉載於:http://blog.itpub.net/31480688/viewspace-2221638/