Oracle 細粒度審計(FGA)之DBMS_FGA包的實驗案例一則

來源:互聯網
上載者:User

       從Oracle9i開始,就可以使用DBMS_FGA可以對指定的表的select語句進行審計
       但是在9i中只能對select語句進行審計,在10g中可以實現對DML的審計功能
       下面用DBMS_FGA來展示select語句的審計功能

 

          ① 假定我們存在表t,包含記錄為

sys@ORCL> select * from hr.t;        ID NAME---------- --------------------         1 a         2 b         3 c         4 d         5 e

          ② 分析該表,讓其使用CBO最佳化模式

sys@ORCL> analyze table hr.t compute statistics;Table analyzed.

          ③ 檢查以前的審計策略與審計日誌

sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME from dba_audit_policies;no rows selectedsys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,SQL_TEXT from dba_fga_audit_trail;no rows selected

        dba_audit_policies:用來存放審計策略
        dba_fga_audit_trail:用來存放審計日誌,即執行了那些SQL語句
        通過以上的查詢,我們也可以看到,以前沒有審計策略,也沒有審計日誌

 

          ④ 現在,我們在hr.t表增加一個審計策略

sys@ORCL> begin  2       dbms_fga.add_policy(object_schema=>'HR',  3                           object_name=>'T',  4                           policy_name=>'chk_t',  5                           audit_condition=>'id=2',  6                           audit_column=>'NAME',  7                           enable=>TRUE,  8                           statement_types=>'SELECT,INSERT,UPDATE,DELETE'  9                           ); 10       end; 11  /PL/SQL procedure successfully completed.

          ⑤ 我們再查詢dba_audit_policies,就可以發現這條審計策略了

sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,ENABLED from dba_audit_policies;OBJECT_SCHEMA                  OBJECT_NAME                    POLICY_NAME                    ENA------------------------------ ------------------------------ ------------------------------ ---HR                             T                              CHK_T                          YES

          ⑥ 那麼就讓我們看看該審計策略怎麼生效,假定我們執行如下的一些語句

u1@ORCL> select count(*) from hr.t where id=1;  COUNT(*)----------         1  可以看到,該查詢返回的結果集中顯然沒有id=2的行,所以,該查詢不能被審計u1@ORCL> select count(*) from hr.t where id=2;  COUNT(*)----------         1  有人說這個語句包含了id=2,該被審計了吧,然,我們的審計條件中還有一個是審計列必須要有name  count(*)沒有包含name,所以該語句還是沒有被審計u1@ORCL> select count(*) from hr.t where name='b';  COUNT(*)----------         1  這個語句被審計了,因為已經包含了列name在where中,而name=b正好是id=2的行,所以id=2是被隱式包含的u1@ORCL> select * from hr.t where id=2;        ID NAME---------- --------------------         2 b  該語句肯定被審計,所有列肯定包含審計列name,謂語條件正好是id=2u1@ORCL> select id from hr.t where id=3;        ID----------         3  這個語句肯定就不被審計了,典型的什麼都不滿足u1@ORCL> select name from hr.t where name='b';NAME--------------------b  這個語句也被審計,為什麼呢?這個語句包含審計列,而且隱式包含了id=2(因為id=2與name=b是同一行)u1@ORCL> select name from hr.t where name='d';NAME--------------------d  這個語句沒有被審計,因為雖然滿足了審計列的條件,但是沒有顯式或隱式包含id=2  但是如果在您的環境中,這個語句如果被審計了,就請您確信是否分析過表,該查詢是否是使用的CBO最佳化計劃

 

        綜合以上結果,以上被審計的語句應當是3個:

sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,SQL_TEXT from dba_fga_audit_trail;OBJEC OBJEC POLIC SQL_TEXT----- ----- ----- ---------------------------------------------HR    T     CHK_T select count(*) from hr.t where name='b'HR    T     CHK_T select * from hr.t where id=2HR    T     CHK_T select name from hr.t where name='b'

 

        對于越來越多的審計記錄,我們必須手工維護,刪除沒有參考價值的記錄,我們可以運行如下查詢來刪除審計記錄(需要delete any table的許可權或在sys下執行):

        delete from sys.fga_log$        or        delete from Dba_Fga_Audit_Trail

        到這裡,大家總該明白了怎麼樣審計表的Select語句,同普通審計與DML觸發器一樣,對過多的表進行審計,將會嚴重影響效能。
        但是,在特定的情況下,如果想跟蹤一個表的Select語句已便於最佳化,也還是可以的

 

          ⑦ 相關注意事項
         
             沒有提交也被審計
             sys不被審計,我第一次實驗時用sys便錯了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.