Oracle FGA細粒度審計——基於內容的資料庫審計(一)

realkid4發表於2011-06-26

 

Oracle推出的標準Standard審計機制,提供了對於資料庫物件DDL、特定User特定安全行為的審計Audit。標準審計可以幫助DBA和資訊審計人員掌握生產系統各種重要變化資訊,並且跟蹤其行為。

 

但是很多時候,我們常常會遇到下列情況的需求:

 

ü        記錄向使用者user表插入記錄detpno=10的操作日誌資訊;

ü        記錄更改使用者姓名欄位取值的操作日誌資訊;

ü        記錄刪除日誌記錄的操作資訊;

ü        記錄每天下班之後,對信用卡欄位進行檢索的操作資訊;

 

相對於標準審計機制,此類的審計需求靈活性強。很多時候,都是透過應用層面專門書寫審計模組或者書寫觸發器來實現。這種方法可能出現審計遺漏或者帶來效能問題。實際中,我們可以使用Oracle的細粒度審計FGAFine-grained Audit)來實現。

 

1、  FGA概述

 

Oracle Fine-Grained Audit(細粒度審計)是相對於傳統Oracle審計功能而言的。我們可以藉助FGA指定複雜的審計條件,根據條件的發生來引發審計動作。FGA是我們可以對訪問資料的操作進行控制審計,使資料設計的層次達到最下層的資料層面。

 

FGA集中功能在資料表的DML操作審計上,對特定資料表的selectupdateinsertdelete操作。資料庫使用者的許可權設定只能控制到是否允許進行操作的層面,而沒有對一些更復雜的需求進行考量。

 

 

使用FGA通常需要如下步驟:

 

ü        確定FGA審計需求。要明確系統準確的審計需求,是進行FGA策略設定的第一個步驟。通常方式是對某張資料表進行某種型別操作的時候,在什麼情況下需要進行審計記錄;

ü        確定審計記錄內容和方式。目前FGA支援DB儲存和XML檔案儲存兩種方式,要做出審計方案選擇。同時,審計內容中有對SQL進行記錄的選擇專案,也要確認;

ü        使用DBMS_FGA包,定義審計策略。DBMS_FGA包是進行FGA審計策略定義、刪除、啟用禁用的工具包,歸屬sys schema。如果非sys使用者執行,需要擁有execute許可權;

ü        啟動FGA策略,定期檢視FGA$或者dba_fga_audit_trail檢視中的審計結果;

 

下面使用一個例項來進行介紹說明。

 

2、  實驗環境準備

 

scott使用者下建立資料表T,其中包括一些實驗欄位和基礎資料值。

 

 

SQL> select * from v$version  where rownum<2;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

 

SQL> create table t (id number, vid varchar2(10), dt date);

Table created

 

SQL> select * from t;

 

        ID VID        DT

---------- ---------- --------------------

         1 kfsd       2011-6-23 1:45:39

         2 dfse       2011-6-22 1:45:46

         3 ffdfse     2011-6-24 1:45:53

 

 

審計需求如下:

 

ü        對資料表T插入VID長度超過5的操作進行審計記錄;

ü        修改資料表VID的所有操作;

ü        刪除資料表TDT列為當前天之前日期記錄的操作;

ü        在週末(週日、週六),檢索VID資料的操作;

ü        審計記錄儲存在資料庫中即可;

 

建立了環境,明確了需求,下面可以建立審計策略policy

 

3、設定審計規則策略

 

每個審計需求,都可以實現為一條審計策略policy。啟用的policy可以在設定的時機進行激發,將審計資訊記錄下來。

 

Oracle FGA是使用dbms_fga程式包進行審計規則的建立,使用add_policy方法進行審計策略建立。下面是該方法的API介面。

 

  //dbms_fga包宣告方法

  PROCEDURE add_policy(object_schema   IN VARCHAR2 := NULL,

                       object_name     IN VARCHAR2,

                       policy_name     IN VARCHAR2,

                       audit_condition IN VARCHAR2 := NULL,

                       audit_column    IN VARCHAR2 := NULL,

                       handler_schema  IN VARCHAR2 := NULL,

                       handler_module  IN VARCHAR2 := NULL,

                       enable          IN BOOLEAN  := TRUE,

                       statement_types IN VARCHAR2 := 'SELECT',

                       audit_trail     IN PLS_INTEGER  := 3,

                       audit_column_opts IN BINARY_INTEGER DEFAULT 0,

                       policy_owner    IN VARCHAR2 := NULL);

 

 

add_policy方法的可用引數很多,而且大部分引數帶有預設值。下面表格進行概要說明。

 

引數名稱

含義作用

預設值

object_schema

指定進行審計的物件所隸屬的使用者schema。如果沒有指定,就認為是當前的使用者下;

NULL

object_name

指定審計物件名稱;

policy_name

FGA審計策略的名稱;

audit_condition

設定進行審計活動的條件,該引數是一個布林表示式。當進行statement_type操作的時候,進行條件驗證,如果為True就表示進行審計;

NULL,作用和True相同;

audit_column

指定資料表的一個到多個column的名稱,當statement_type操作涉及到該資料列的時候,就進行審計;

NULL,表示所有列;

handler_schema

在審計策略被激發的時候,可以呼叫一段程式程式碼。hander_schema表示程式程式碼的所屬schema

NULL,如果設定上handler_module,表示當前的schema

handler_module

在審計策略被激發的時候,呼叫的程式程式碼名稱;

 

enable

啟動審計策略開關;

True

statement_type

審計操作動作,包括selectupdatedeleteinsert

select

audit_trail

設定審計內容層次和審計記錄存放位置;Oracle目前支援DBXML檔案兩種方式,可以設定詳細的SQL變數資訊;

3,存放在資料庫中;

audit_column_opt

audit_column中如果是多列的話,是所有列進行審計動作,還是任意列進行審計動作;

任意列進行審計動作;

policy_owner

設定的policy的所屬owner

 

 

 

 

 

 

我們提交的審計需求,可以透過如下程式碼實現。

 

ü        對資料表T插入VID長度超過5的操作進行審計記錄;

建立審計策略pol_vid_length

 

 

SQL> show user;

User is "SYS"

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_vid_length',

  5                        audit_condition => 'length(vid)>5',

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'INSERT');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路難點:審計條件點是在insert動作時進行的,額外條件是vid欄位長度大於5

 

ü        修改資料表VID的所有操作;

 

建立策略pol_vid_modify

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_vid_modify',

  5                        audit_column => 'VID',

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'UPDATE');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路難點:只針對資料列vidupdate操作時,才會進行審計動作。

 

ü        刪除資料表TDT列為當前天之前日期記錄的操作;

建立審計策略pol_dt_del

 

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_dt_del',

  5                        audit_condition => 'trunc(dt),

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'DELETE');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路難點:審計條件設定。

 

ü        在週末(週日、週六),檢索VID資料的操作;

 

建立審計策略pol_vid_select

 

SQL> begin

  2     dbms_fga.add_policy(object_schema => 'SCOTT',

  3                          object_name => 'T',

  4                          policy_name => 'pol_vid_select',

  5                       audit_condition => 'to_char(sysdate,''Day'') in (''星期六'',''星期日'')',

  6                        enable => True,

  7                          audit_trail => dbms_fga.DB_EXTENDED,

  8                          statement_types => 'SELECT',

  9                          audit_column => 'VID');

 10   end;

 11  /

 

PL/SQL procedure successfully completed

 

 

從資料字典dba_audit_policies中,可以檢查出設定的policy資訊。

 

 

SQL> select object_name, policy_name, SEL, INS, UPD, DEL, AUDIT_TRAIL, POLICY_COLUMN_OPTIONS from dba_audit_policies;

 

OBJEC POLICY_NAME     SEL INS UPD DEL AUDIT_TRAIL  POLICY_COLUMN_OPTIONS

----- --------------- --- --- --- --- ------------ ---------------------

T     POL_VID_LENGTH  NO  YES NO  NO  DB+EXTENDED  ANY_COLUMNS

T     POL_VID_MODIFY  NO  NO  YES NO  DB+EXTENDED  ANY_COLUMNS

T     POL_DT_DEL      NO  NO  NO  YES DB+EXTENDED  ANY_COLUMNS

T     POL_VID_SELECT  YES NO  NO  NO  DB+EXTENDED  ANY_COLUMNS

 

 

對專門columns的審計資訊,可以在dba_audit_policy_columns檢視中檢查到。

 

 

SQL> select * from dba_audit_policy_columns;

 

OBJECT_SCHEMA                  OBJEC POLICY_NAME     POLICY_COLUMN

------------------------------ ----- --------------- ------------------------------

SCOTT                          T     POL_VID_MODIFY  VID

 

 

 

下面透過實驗來驗證這些policy的應用情況。

 

 

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

相關文章