Oracle 資料庫稽核的方式可分為 Value-Base Audit、Standard Database Audit、Fine-Grained Audit(FGA) 與 Unified Audit(12c新功能)。
Value-Base Audit:
Value-Base Audit 主要是以 Trigger 的方式來做稽核,藉由 Trigger 可以用來記錄 Table 所做的 DML 異動,或者是透過 Database Trigger 來記錄使用者登入登出的紀錄,例如員工資訊表 emp 這個 Table 上的 salary 薪資欄位是一個敏感性資料,我們可以建立一個 audit_emp 的 Table 並使用 Trigger 將 salary 異動前後的資料存入 audit_emp:
以下是建立 Database Trigger 來記錄使用者登入的時間:
Standard Database Audit:
Standard Database Audit 指的是透過設定資料庫參數 audit_trail 並且使用 audit 指令來進行稽核。audit_trail 參數是用來設定 audit 紀錄所存放的位置,可設定以下選項:
⠂NONE: 表示不產生 audit trail,意即不使用 audit。
⠂DB: audit 紀錄存放在 DB 的 sys.aud$ 這個 table 裡面。
⠂DB, EXTENDED: 同 DB 選項,EXTENDED 表示多紀錄 SQL Statament。
⠂XML: audit 紀錄以 XML 格式存放在作業系統上,使用參數audit_file_dest 指定位置,預設是$ORACLE_BASE/admin/<ORACLE_SID>/adump 目錄。
⠂XML, EXTENDED: 同 XML 選項,EXTENDED 表示多紀錄 SQL Statament。
⠂OS: audit 紀錄放在作業系統上,使用參數audit_file_dest 指定位置,預設是$ORACLE_BASE/admin/<ORACLE_SID>/adump 目錄。
audit_trail 是靜態參數,設定完畢後必須重啟 DB 讓參數生效,例如:
設定完 audit_trail 之後便可以使用 audit 指令來進行稽核,語法為 ”audit <陳述式或物件> by <session或access> by <owner> whenever <not> successful”;by session 表示此登入 session 所有操作只稽核一次,by access 表示每次觸發到稽核都進行紀錄;by <owner> 表示針對某一位使用者進行稽核,不指定的話表示所有使用者都稽核;whenever successful 表示只稽核成功的操作,whenever not successful 表示只稽核失敗的操作,不使用 whenever 選項的話表示兩者都稽核。例如:
若是 audit_trail 設定為 DB 的話,所有 audit 紀錄可以從 sys.aud$ 查到,除此之外可以透過 dba_audit_trail 這個 view 來查詢,例如我們要稽核登入失敗的紀錄可以設定如下:
當有人登入失敗時便可以從 dba_audit_trail 得到 audit 紀錄:
Standard Audit 預設會稽核sys這個使用者的登入登出紀錄,並且將 audit trail 存放在 audit_file_dest 所設定的位置,若是要稽核 sys 的其他行為,必須設定參數 audit_sys_operations 為 TRUE。
DBA 可以透過 DBA_STMT_AUDIT_OPTS、DBA_OBJ_AUDIT_OPTS,DBA_PRIV_AUDIT_OPTS 來查詢做了哪些 Standard audit 設定。
Fine-Grained Audit:
Fine-Grained Audit 是從 Oracle 9i 開始有的功能,但必須是企業版才可使用。Fine-Grained Audit 是 Standard Audit 的進階版,可以針對 Table 的某個欄位或者是某些敏感性資料來做更細項的稽核,使用的是 dbms_fga 這個 Package 來設定 audit policy,而audit trail 則是存放在 sys.fga_log$ 這個 Table 當中。例如 hr.emp 這個 Table 裡面的 department_id=80 這部分資料較為敏感,我們就可以建立一個 Fine-Grained Audit Policy 來稽核,只要有人存取 department_id=80 的時候就進行 audit,如果是存取 hr.emp 的其他資料則不會 audit:
Policy 建立完畢之後必須將其 enable:
同樣是查詢 hr.emp ,department_id=10 不會被稽核而 department_id=80則會被稽核:
不需要的 Policy 可以透過 dbms_fga.disable_policy 將其disable 或是 dbms_fga.drop_policy 將其刪除。
Fine-Grained Audit 的紀錄可以從 sys.fga_log$ 或者是 dba_fga_audit_trail 來查詢,DBA 可以透過 dba_audit_policies 來檢視所有 Fine-Grained Audit 的 Policy 設定。
由於 sys.aud$ 與 sys.fga_log$ 預設都是放在 SYSTEM 這個 Tablespace 中,隨著 audit 量的增長使得此 Table 容量越來越大,進而增加 SYSTEM Tablespace 的使用率,建議幫 audit 建立專屬的 Tablespace 並且把 sys.aud$ 與 sys.fga_log$ 移動到此專屬的 Tablespace 當中,在 Oracle 11.2 之後提供了 dbms_audit_mgmt 這個 Package 來方便我們搬移,例如將 sys.aud$ 與 sys.fga_log$ 搬移到 AUDIT_TBS 這個 Tablespace: