2021年2月23日 星期二

7.5 Oracle Unified Audit

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:

SQL> shutdown immediate

SQL> exit;

$ cd $ORACLE_HOME/rdbms/lib

$ make -f ins_rdbms.mk uniaud_on ioracle

$ sqlplus / as sysdba

SQL> startup

在轉換為 Unified Auditing Mode 之後,audit_ 相關的資料庫參數便會消失。


我們可以透過以下查詢來確認資料庫是使用 Mixed Auditing Mode 或是 Unified Auditing Mode:

SQL> select parameter, value from v$option where parameter like '%Unified%';

如果 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:

SQL> create audit policy audit_any_table privileges select any table;

SQL> create audit policy audit_dba roles dba;


對於使用者的操作也可以針對不同行為進行 Audit:

SQL> create audit policy audit_alter_table actions alter table;

    (對 alter table 指令進行 audit)

SQL> create audit policy audit_emp actions update on hr.emp;

    (對 update hr.emp 這個 Table 時進行 audit)

SQL> create audit policy audit_exp actions component=datapump export;

    (對 data pump 的 export 進行 audit)


另外也可以使用條件式來設計更細微的 Audit Policy:

SQL> create audit policy audit_scott actions update on hr.emp, delete on hr.emp, when 'sys_context (''userenv'', ''session_user'')=''scott''' evaluate per session;

   (當使用者 scott 對 hr.emp 進行 update, delete 時進行 audit)

   (evaluate per session 表示只針對此 session audit 一次,

    若是 evaluate per statement 表示每下一次語法就進行 audit 次)


這邊比較特殊的是 RMAN 的操作不需要建立 Audit Policy,系統會自動Audit RMAN 的作業,但這個僅限於 Unified Auditing Mode 才會發生。


在建立完 Audit Policy 之後,接下來就是要來啟用這些 Audit Policy,透過 AUDIT 指令可以用來啟用 Audit Policy,同樣的也可以針對不同條件來啟用:

SQL> audit policy audit_any_table;

   (啟用 audit_any_table 這個 policy,針對資料庫所有使用者生效)

SQL> audit policy audit_alter_table by scott, hr;

   (啟用 audit_alter_table 這個 policy,只有對 scott 與 hr 兩個使用者生效)

SQL> audit policy audit_emp except hr;

   (啟用 audit_emp 這個 policy,除了 hr 這個使用者外都生效)

SQL> audit policy audit_alter_table by scott whenever successful;

   (whenever successful,只有在指令成功時進行 audit 紀錄)

SQL> audit policy audit_alter_table by scott whenever not successful;

   (whenever not successful,只有在指令不成功時進行 audit 紀錄)


如果要 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:

SQL> 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 => 'audit_trail_purge_job',

 use_last_arch_timestamp => true);
end;

/


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 來設定:

SQL> begin

dbms_audit_mgmt.set_last_archive_timestamp

(audit_trail_type => dbms_audit_mgmt.audit_trail_unified,

 last_archive_time => sysdate – 30);

end;

/


若是不用排程 JOB 的話也可以透過DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL手動進行清理:

SQL> begin

dbms_audit_mgmt.clean_audit_trail

(audit_trail_type  => dbms_audit_mgmt.audit_trail_unified,

use_last_arch_timestamp => true);

end;

/


由於 Unified Audit Trail 預設是先寫入 SGA 再 Flush 至 Table 中,若是資料庫發生問題而造成非預期的crash ,此時有可能會遺失存放在 SGA 且尚未 Flush 的 Unified Audit Trail,此時我們可以透過 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY 來改變 Unified Audit Trail 存放的行為,讓他直接寫入 Table 而不暫存在 SGA:

SQL> 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;

/


dbms_audit_mgmt.audit_trail_immediate_write 表示立即寫入 Table,預設為dbms_audit_mgmt.audit_trail_queued_write 表示會先寫入 SGA 再 Flush 至 Table。






沒有留言:

張貼留言