Fine Grained Auditing (FGA)

jichengjie發表於2018-04-20

Oracle Database 12c Fine Grained Auditing (FGA) enables audit policies to be associated with columns in application tables along with conditions necessary for an audit record to be generated. FGA policies are assigned to application tables using the FGA API. Fine grained audit policies can be used to create audit records when a table is accessed during specific periods or specific columns are accessed. FGA complements the new Oracle Database 12c Unified Audit by enabling audit conditions to be associated with specific columns.



Audit trail records created by Fine Grained Auditing can be captured and analyzed in Oracle Audit Vault and Database Firewall, automatically alerting the security team about possible malicious activity. Click here for more information about Oracle Audit Vault and Database Firewall.


大家對trigger可能比較熟悉,但Oracle還有一個叫FGA的功能,它的作用和trigger類似,但功能更強大.它的全稱是Fine-Grained Audit ,是Audit的一種特殊方式.使用FGA只要呼叫Oracle的包DBMS_FGA.ADD_POLICY建立一些policy(審計策略)就行.每個policy只能針對一個表或檢視.建好策略後所有對錶或檢視的DML操作(select,insert,update,delete都可以記錄到,當然也可以新增一些篩選條件只監測某些特殊的操作.
補充:所謂審計就是記錄你的任意操作,假如你的操作(執行DML語句)符合指定的條件,則你執行的sql語句,將被記錄到sys使用者下的一些表中,還會將你的其他資訊,比如執行時間,使用者名稱,透過什麼工具,機器名等.
FGA在oracle 9i中就有了,但在9i中只能審計select語句.從10g開始才能審計所有的DML操作
 
1.包DBMS_FGA.ADD_POLICY的用法
 
建立審計策略的語法
DBMS_FGA.ADD_POLICY (
  object_schema      VARCHAR2,  --schema的名字,表或檢視的擁有者
  object_name        VARCHAR2, --物件名,表或檢視的名字
  policy_name        VARCHAR2,  --審計策略名字,它和資料庫中其他物件一樣,需要有一個不重複,唯一的名字
  audit_condition      VARCHAR2,  --篩選條件比如可以選擇哪些符合條件的操作被記錄
  audit_column        VARCHAR2, --表中的某一列,可以只記錄對錶中某一列的操作.如果不指定表示審計所有的列
  handler_schema     VARCHAR2,  --是下面的handler_module的擁有者,其實也只能是建立policy的使用者,而上面的object_schema可以是任意使用者
  handler_module      VARCHAR2,--可以是一個一個儲存過程或函式,但監測到任何一條符合條件的操作時執行它.
  enable              BOOLEAN,  --true 或false表示policy是開啟或關閉狀態,如果是false表示不進行審計
  statement_types     VARCHAR2, --表示哪些操作將被審計,可以填上select,insert,update,delete中的一個或幾個
  audit_trail           BINARY_INTEGER IN DEFAULT,--有引數db,xml表示審計到的資訊儲存到資料庫中或是以xml檔案形式儲存到磁碟上
  audit_column_opts   BINARY_INTEGER IN DEFAULT); --這個選項其實只有在audt_column中指定了某列時才起作用.它有any_columns,all_columns兩個選項假如表中有eno,ename兩列,並在audit_column中指定了這兩列,那麼選any_columns表示只要操作其中的任意一列都將被記錄,而這裡指定all_columns的話是說只有一個sql語句同時操作了這兩列才被記錄
 
舉例,假如建立表:create table temp(eno int,ename varchar2(30));針對這個表建立policy
每個策略只能針對一個表或檢視,而一個表或檢視可能對應多個策略.當表被刪除時策略也隨之預設被刪除
BEGIN
          SYS.DBMS_FGA.ADD_POLICY  (
    object_schema    => 'ARWEN'
    ,object_name     => 'TEMP'
    ,policy_name     => 'FGA_TEMP'
   ,audit_condition       => NULL
   ,audit_column          => eno,ename
   ,handler_schema        => null
   ,handler_module        => null
   ,enable                => TRUE
   ,statement_types       =>'SELECT,INSERT,UPDATE,DELETE'
   ,audit_trail           => SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED
     --DBMS_FGA.DB表示記錄將被儲存到資料庫中,DBMS_FGA.EXTENDED表示如果sql語句中帶有繫結變數也會被記錄下來.
      --如果是這樣選audit_trail => SYS.DBMS_FGA.DB表示不會記錄繫結變數
      --SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED改成SYS.DBMS_FGA.XML+SYS.DBMS_FGA.EXTENDED表示記錄儲存成xml檔案
--xml檔案所在目錄可以透過SHOW PARAMETER AUDIT_FILE_DEST檢視,如果要更改目錄ALTER SYSTEM SET AUDIT_FILE_DEST = directory_path DEFERRED;
 ,audit_column_opts     => SYS.DBMS_FGA.ALL_COLUMNS)
END;
 
 檢視建立好的policy物件和符合審計條件時被記錄的操作
我們可以透過select * from dba_objects檢視table,view等物件,類似的policy建立好後我們可以透過SELECT * FROM DBA_AUDIT_POLICIES來檢視.
如果我們對錶temp執行了DML操作,那些資訊將會被操作到sys使用者下的表中,Select* from sys.dba_fga_audit_trail可以查詢到.(注意這隻有前面設定將記錄資訊
儲存到資料庫才能這樣查,如果儲存到xml檔案中可以Select *from  V$XML_AUDIT_TRAIL)
 
2.刪除審計策略,假如刪除上面建立的策略
begin
SYS.DBMS_FGA.DROP_POLICY  (
            object_schema    => 'ARWEN'
            ,object_name     => 'TEMP'
            ,policy_name     => 'FGA_TEMP'
            );
end;
 
3.使用handler_module
 
假如你想在審計到某些操作時還進行進一步的處理,比如把資訊寫到自己建立的日誌中,或者傳送郵件通知相關人員.就要在建立policy時使用handler_module的功能,指定一個儲存過程去做相應的處理.假如我建立一個儲存過程temp_handler
CREATE OR REPLACE PROCEDURE temp_handler
( v_object_schema VARCHAR2
      , v_object_name VARCHAR2
      , v_policy_name VARCHAR2
     )
     IS
v_temp varchar2(30);
begin
null;
end temp_handler;
--這裡的儲存過程有點特殊,它必須帶v_object_schema VARCHAR2, v_object_name VARCHAR2, v_policy_name VARCHAR2這三個引數才行,如果直接寫一個一般的儲存過程就會出錯的.在policy中呼叫儲存過程就這樣 寫
 
BEGIN
          SYS.DBMS_FGA.ADD_POLICY  (
   object_schema    => 'ARWEN'
   ,object_name     => 'TEMP'
   ,policy_name     => 'FGA_TEMP'
   ,audit_condition       => NULL
   ,audit_column          => eno,ename
   ,handler_schema        =>'ARWEN' --注意此處的使用者只能是建立此policy的使用者,如果是其他使用者名稱會出錯的
   ,handler_module        => 'TEMP_HANDLER'
   ,enable                => TRUE
   ,statement_types       =>'SELECT,INSERT,UPDATE,DELETE'
   ,audit_trail           => SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED
   ,audit_column_opts     => SYS.DBMS_FGA.ALL_COLUMNS)
END;








與FGA相關的表或者檢視:




select  * from fga$
select  * from fga_log$
select  * from fgacol$
select * from dba_fga_audit_trail
select * from dba_common_audit_trail
select * from dba_audit_policies
select * from dba_fga_audit_trail


與FGA相關的包或者過程:


dbms_fga.add_policy
dbms_fga.drop_policy


表、檢視、包的列或者引數的使用方法,可以檢視相關文件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26870952/viewspace-2153122/,如需轉載,請註明出處,否則將追究法律責任。