2021年1月15日 星期五

7.4 資料庫稽核

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:

SQL> create table audit_emp 

(aud_user varchar2(20),b_salary number,f_salary number,modify_date date);


SQL> create or replace trigger t_audit_emp

before update on emp for each row

Begin

        IF :old.salary != :new.salary THEN

         insert into audit_emp values 

(sys_context('USERENV', 'SESSION_USER'),:old.salary,:new.salary,sysdate);

        END IF;

End t_audit_emp;

/


以下是建立 Database Trigger 來記錄使用者登入的時間:

SQL> create table audit_logon (audit_user varchar2(20),logon_date date);


SQL> create or replace trigger t_audit_logon

after logon on database

Begin

         insert into audit_logon values 

(sys_context('USERENV', 'SESSION_USER'),sysdate);

End t_audit_logon;

/


  • 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 讓參數生效,例如:

SQL> alter system set audit_trail=DB,EXTENDED scope=spfile;

SQL> shutdown immediate;

SQL> startup


設定完 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 選項的話表示兩者都稽核。例如:

SQL> audit select table by scott by access;

   (稽核 scott 這個使用者做 select 的動作)

SQL> audit create any trigger by hr by access;

   (稽核 hr 這個使用者做 create trigger 的動作)

SQL> audit update,delete on hr.emp by session;

   (稽核 hr.emp 這個 table 所有 update 與 delete 的動作)


若是 audit_trail 設定為 DB 的話,所有 audit 紀錄可以從 sys.aud$ 查到,除此之外可以透過 dba_audit_trail 這個 view 來查詢,例如我們要稽核登入失敗的紀錄可以設定如下:

SQL> audit create session by access whenever not successful;


當有人登入失敗時便可以從 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:

SQL> begin

dbms_fga.add_policy (

  object_schema    =>     'hr',

  object_name        =>     'emp',

  policy_name        =>     'audit_emp',

  audit_condition=>    'department_id=80',

  audit_column    =>     'salary',

  statement_types=>    'select' );

end;

/


Policy 建立完畢之後必須將其 enable:

SQL> begin

dbms_fga.enable_policy (

  object_schema    =>     'hr',

  object_name        =>     'emp',

  policy_name        =>     'audit_emp');

end;

/


同樣是查詢 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:

SQL> BEGIN

DBMS_AUDIT_MGMT.set_audit_trail_location(

audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 🡨 搬移 AUD$

audit_trail_location_value => 'AUDIT_TBS');

END;

/


SQL> BEGIN

DBMS_AUDIT_MGMT.set_audit_trail_location(

audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD,  🡨 搬移 FGA_LOG$

audit_trail_location_value => 'AUDIT_TBS');

END;

/





沒有留言:

張貼留言