Unified Audit 是 Oracle 12c 開始有的新功能,整合了 Standard Audit 與 Fine-Grained Audit 到單一個 UNIFIED_AUDIT_TRAIL 中,具有下列的優點:
1. Unified Audit 產生的 audit trail 會先暫存在SGA 中,再經由GEN0這個 Background Process 寫入 AUDSYS 這個使用者的 Table 中,處理 audit trail 的效能上比起傳統的 Audit 較好。透過執行 SYS.DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL 可以手動強制將SGA中的 audit trail 寫入 Table 當中。
2. SYS.AUD$ 與 SYS.FGA_LOG$ 存在一定的風險,只要具有資料庫高級權限的使用者便可以來竄改這兩個 Audit 的紀錄,而 Unified Audit 是存放在 AUDSYS 這個使用者的 Table 當中,AUDSYS 底下的 Table 都是 Read-Only 屬性,可以保護 audit trail 不被竄改。
3. Unified Audit 可以針對 DB 的一些維運操作進行稽核,例如 Data Pump、RMAN…等作業都可以進行 Audit。
自 Oracle 12c 開始,資料庫的稽核有兩種模式可以使用:
Mixed Auditing Mode: 為預設模式,表示可以使用 Standard Audit、Fine-Grained Audit 或者是 Unified Audit。
Unified Auditing Mode: 開啟純 Unified Audit 模式,Standard Audit 與 Fine-Grained 在此模式下不可使用。需透過下列步驟轉換為純 Unified Auditing Mode:
在轉換為 Unified Auditing Mode 之後,audit_ 相關的資料庫參數便會消失。
我們可以透過以下查詢來確認資料庫是使用 Mixed Auditing Mode 或是 Unified Auditing Mode:
如果 value 是 FALSE 表示為 Mixed Auditing Mode;如果 value 為 TRUE 表示為 Unified Auditing Mode。
使用 Unified Audit 的方式首先必須要先建立 Audit Policy,然後再將此 Policy Enable 來使用它,如果要取消的話可以將 Policy Drop 或是 Disable。Audit Policy 的建立與維護不一定要使用 SYS 使用者來操作,只要資料庫的使用者具有 AUDIT_ADMIN 的權限即可;而要讀取UNIFIED_AUDIT_TRAIL 的話則是需要 AUDIT_VIEWER 的權限。
Unified Audit 可以建立的 Audit Policy 非常多樣化,例如針對select any table權限與 DBA 角色進行 Audit:
對於使用者的操作也可以針對不同行為進行 Audit:
另外也可以使用條件式來設計更細微的 Audit Policy:
這邊比較特殊的是 RMAN 的操作不需要建立 Audit Policy,系統會自動Audit RMAN 的作業,但這個僅限於 Unified Auditing Mode 才會發生。
在建立完 Audit Policy 之後,接下來就是要來啟用這些 Audit Policy,透過 AUDIT 指令可以用來啟用 Audit Policy,同樣的也可以針對不同條件來啟用:
如果要 Disable Audit Policy 則使用 NOAUDIT 指令。
我們可以透過 AUDIT_UNIFIED_POLICIES 來查詢目前所有的 Unified Audit Policy;透過 AUDIT_UNIFIED_ENABLED_POLICIES 來查詢目前被 Enabled 的 Unified Audit Policy。Oracle 12c 不論是 Mixed 或是 Unified Audit Mode,預設都會有三個 Unified Audit Policy,ORA_ACCOUNT_MGMT、ORA_DATABASE_PARAMETER 與 ORA_SECURECONFIG:
ORA_ACCOUNT_MGMT 針對使用者的帳號與權限做稽核、ORA_DATABASE_PARAMETER 針對資料庫參數的異動做稽核,ORA_SECURECONFIG 針對資料庫安全性相關的操作進行稽核,例如 drop any table、alter any table …等操作。這三個 Policy 只有 ORA_SECURECONFIG 預設是被 Enabled 的:
對於 Unified Audit Trail 的維護必須透過 DBMS_AUDIT_MGMT 進行操作,例如建立一個 Auto Purge 的 Job 來定時清理 Unified Audit Trail:
audit_trail_purge_interval 單位為 hour,上述範例表示每24小時執行清理 Unified Audit Trail 的 Job;use_last_arch_timestamp 表示刪除 Last Archive Time 之前的資料,在此必須先定義 Last Archive Time ,例如定義 Last Archive Time 為 30 天前的資料,透過DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP 來設定:
若是不用排程 JOB 的話也可以透過DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL手動進行清理:
由於 Unified Audit Trail 預設是先寫入 SGA 再 Flush 至 Table 中,若是資料庫發生問題而造成非預期的crash ,此時有可能會遺失存放在 SGA 且尚未 Flush 的 Unified Audit Trail,此時我們可以透過 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY 來改變 Unified Audit Trail 存放的行為,讓他直接寫入 Table 而不暫存在 SGA:
dbms_audit_mgmt.audit_trail_immediate_write 表示立即寫入 Table,預設為dbms_audit_mgmt.audit_trail_queued_write 表示會先寫入 SGA 再 Flush 至 Table。