Oracle FGA審計

來源:互聯網
上載者:User

Oracle FGA審計

大家對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操作

FGA與Triger的明顯區別:

1.FGA使用自治的事務,即使DML操作被rollback了,它仍然照樣執行不會rollback.而trigger是會被rollback的.

2.做更新操作時trigger可以記錄更新前的舊值和更新後的新值,而FGA是不記錄舊值.

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;

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.