Fine-grainedauditing(FGA) 細粒度審計

muxinqing發表於2014-02-27

三.  Fine-grainedauditing(FGA) 細粒度審計

全性和身份管理
現實中的細粒度審計

瞭解如何使用 Oracle 資料庫的細粒度審計特性來跟蹤對錶中特定行的只讀訪問 — 以及更多資訊
傳統的 Oracle 資料庫審計選件允許您在宏觀級別上跟蹤使用者在物件上所執行的操作 — 例如,如果您審計對某個表的 SELECT 語句,則可以跟蹤是誰從表中選擇了資料。但是,您不知道他們選擇了 什麼 。利用資料操縱語句 — 如 INSERT、UPDATE 或 DELETE — 您可以透過使用觸發器或使用 Oracle LogMiner 實用程式來分析歸檔日誌,從而捕獲任何的更改。因為簡單的 SELECT 語句是不操縱資料的,它們既不啟動觸發器,也不記入到那些以後可以進行挖掘的歸檔日誌中,所以這兩種技術在涉及到 SELECT 語句的地方無法滿足要求。
Oracle9i Database 推出了一種稱為細粒度審計 (FGA) 的新特性,它改變了這種局面。該特性允許您將單個的 SELECT 語句聯同使用者提交的確切語句一起進行審計。除了簡單地跟蹤語句之外,FGA 還透過在每次使用者選擇特定的資料集時執行一段程式碼,提供了一種方法來模擬用於 SELECT 語句的觸發器。在分為三部分的這一系列文章中,我將說明如何使用 FGA 解決實際問題。這第一部分的主要內容是構建基本的 FGA 系統。

UDIT_TRAIL啟用或禁用資料庫審計。當設定該引數為NONE或FALSE時,將禁止資料庫審計;當設定該引數為OS時,將啟用資料庫審計,並將審計記錄寫入到OS審計跟蹤檔案中;當設定該引數為DB或TRUE時,將啟用資料庫審計,並將審計記錄寫入到資料字典SYS.AUD$中;當設定該引數為DB_EXTENDED時,不僅將審計記錄寫入到資料字典SYS.AUD$中,還會填充該資料字典的SQLBIND和SQLTEXT列。
取值說明:
none 禁用資料庫審計
os 啟用資料庫審計,並將資料庫審計記錄定向到操作審計記錄,作業系統審計記錄中(預設位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/).。預設情況下審計是沒有開啟的
db 啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$表
db,extended 啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$表。另外,填充SYS.AUD$表的SQLBIND 列和SQLTEXT CLOB 列。
xml 啟用資料庫審計,並將所有記錄寫到XML格式的作業系統檔案中。
xml,extended 啟用資料庫審計,輸出審計記錄的所有列,包括SqlText和SqlBind的值。
你可以使用SQL語句AUDIT來設定審計選項,不管如何設定此引數。

關閉和開啟審計

su – oracle

sqlplus “/as sysdba”

SQL>alter system set audit_trail=’NONE’ spfile=scope; --關閉審計
SQL>alter system set audit_trail=’db_extended’ spfile=scope; --開啟審計

SQL>shutdown immediate;

SQL>startup;

從spfile可以看出,是需要重啟資料庫才生效的。



示例安裝
我們的示例基於一個銀行系統,已經透過應用程式級的審計按照傳統提供了使用者訪問特定資料的審計線索。但是,只要使用者使用諸如 SQL*Plus 等工具從應用程式以外的地方訪問資料,該系統就不能滿足要求。在本文中,我將說明作為 DBA 的您能夠如何使用 FGA 來完成捕獲使用者對特定行的 SELECT 訪問的任務,無論訪問的工具或機制是什麼。
在我們的示例中,資料庫有一個名為 ACCOUNTS 的表,由模式 BANK 擁有,其結構如下:
 
Name Null? Type
---------------- -------- ------------
ACCT_NO NOT NULL NUMBER
CUST_ID NOT NULL NUMBER
BALANCE NUMBER(15,2)
為了構造一個能夠對任何在此表中選擇的使用者進行審計的系統,您需要定義對該表的 FGA 策略 如下:
 
begin
dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS'
);
end;
這段程式碼必須由具有執行程式包 dbms_fga 許可權的使用者來執行。但是,為了提高安全性,建議不要對使用者 BANK(將要被審計的表的所有者)授予執行許可權;而應該將許可權授予一個安全的使用者(比如 SECMAN),此使用者應該執行新增策略的過程。
在定義了策略以後,當使用者以通常的方式對錶進行查詢時,如下所示:
 
select * from bank.accounts;
審計線索記錄此操作。您可以使用以下語句檢視線索:
 
select timestamp,
db_user,
os_user,
object_schema,
object_name,
sql_text
from dba_fga_audit_trail;

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT
--------- ------- ------- ------- -------- ----------------------
22-SEP-03 BANK ananda BANK ACCOUNTS select * from accounts
注意名為 DBA_FGA_AUDIT_TRAIL 的新檢視,它記錄細粒度的訪問資訊。其中顯示了審計事件的時間標記、查詢者的資料庫使用者 ID、作業系統使用者 ID、查詢中所使用表的名稱和所有者,最後還有確切的查詢語句。在 Oracle9i Database 之前不可能得到這種資訊,但隨著 FGA 的推出,獲得此資訊變得輕而易舉。
在 Oracle9i Database 中,FGA 只能捕獲 SELECT 語句。利用 Oracle Database 10g ,FGA 還可以處理 DML 語句 — INSERT、UPDATE 和 DELETE — 使其成為完整的審計特性。在本系列的第 3 部分,我將詳細說明這些新的功能。
審計列和審計條件
讓我們更詳細地檢查前面的示例。我們要求審計對該表所使用的 任何 SELECT 語句。但是在現實中,可能不必要這樣做,並且這樣可能會使儲存線索的審計表承受不起。當使用者選擇含有敏感資訊的餘額列時,銀行可能需要進行審計,但當使用者選擇特定客戶的帳號時,可能不需要進行審計。列 BALANCE(選擇它可觸發審計)稱為 審計列 ,在此情況下, dbms_fga.add_policy 過程的引數指定該列如下:
 
audit_column => 'BALANCE'
如果每次使用者從表中選擇時都記錄審計線索,則線索的大小將增長,導致空間和管理問題,因此您可能希望只有在滿足特定條件時進行審計,而不是每次都進行審計。也許只有當使用者訪問極為富有的戶主帳號時,銀行需要審計 — 例如,只有當使用者選擇了餘額為 11,000 美元或更多的帳號時需要審計。這種型別的條件稱為審計條件 ,並作為一項引數傳遞到 dbms_fga.add_policy 過程,如下所示:
 
audit_condition => 'BALANCE >= 11000'
讓我們來看這兩個引數如何起作用。現在策略定義的形式類似於:
 
begin
dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000'
);
end;
在此情況下,只有當使用者選擇列 BALANCE 並且檢索的行包含大於或等於 $11,000 的餘額時,才會審計該操作。如果這兩個條件中有一個不為真,則該操作不會被寫入到審計線索中。表 1 中的示例演示了何時審計操作和何時不審計操作的各種情況。
最佳化器模式
FGA 需要基於開銷的最佳化 (CBO),以便正確地工作。在基於規則的最佳化時,只要使用者從表中進行選擇,無論是否選擇了相關的列,都始終生成審計線索,增加了誤導專案出現的可能性。為使 FGA 正確地工作,除了在例項級啟用 CBO 之外,在 SQL 語句中應該沒有規則暗示,並且必須至少使用評估選項對查詢中的所有表進行分析。
管理 FGA 策略
在前文中您看到了如何新增 FGA 策略。要刪除策略,您可以使用以下語句:
 
begin
dbms_fga.drop_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS'
);
end;
對於更改策略而言,沒有隨取隨用的解決方案。要更改策略中的任何引數,必須刪除策略,再使用更改後的引數新增策略。
有時您可能需要臨時禁用審計收集 — 例如,如果您希望將線索表移動到不同的表空間或者要刪除線索表。您可以按如下方法禁用 FGA 策略:
 
begin
dbms_fga.enable_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS',
enable => FALSE
);
end;
要重新啟用它,可使用同一函式,但是將引數 enable 設定為 TRUE。

3.1 增加 FGA 策略

Begin
dbms_fga.add_policy (
  object_schema=>'BANK',
  object_name=>'ACCOUNTS',
  policy_name=>'ACCOUNTS_ACCESS');
end;
/

select * from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;


查詢審計使用者資料

select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,ENABLED from dba_audit_policies

select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,SQL_TEXT from dba_fga_audit_trail; 

        dba_audit_policies:用來存放審計策略
        dba_fga_audit_trail:用來存放審計日誌,即執行了那些SQL語句

透過以上的查詢,我們也可以看到,以前沒有審計策略,也沒有審計日誌
現在,我們在hr.t表增加一個更改插入刪除審計策略


select BALANCE from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

begin 
dbms_fga.add_policy(object_schema=>'HR', 
object_name=>'T', 
policy_name=>'chk_t', 
audit_condition=>'id=2', 
audit_column=>'NAME', 
enable=>TRUE, 
statement_types=>'SELECT,INSERT,UPDATE,DELETE'); 
end; 

3.2  管理 FGA 策略


--要刪除策略,您可以使用以下語句:
begin
dbms_fga.drop_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS'
   );
end;
/

-- 對於更改策略而言,沒有隨取隨用的解決方案。要更改策略中的任何引數,必須刪除策略,再使用更改後的引數新增策略。


-- 需要臨時禁用審計收集

       例如,如果您希望將線索表移動到不同的表空間或者要刪除線索表。您可以按如下方法禁用 FGA 策略:
begin
dbms_fga.enable_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS',
enable => FALSE );
end;
/
-- 重新啟用很簡單 enable =>TRUE;


 FGA 資料字典檢視


       FGA 策略的定義位於資料字典檢視 DBA_AUDIT_POLICIES 中。

       審計線索收集在 SYS 擁有的表 FGA_LOG$ 中。對於 SYS 擁有的任何原始表,此表上的某些檢視以對使用者友好的方式顯示資訊。DBA_FGA_AUDIT_TRAIL是該表上的一個檢視。
       一個重要的列是 SQL_BIND,它指定查詢中使用的繫結變數的值,這是顯著增強該工具功能的一項資訊。
       另一個重要的列是 SCN,當發生特定的查詢時,它記錄系統更改號。此資訊用於識別使用者在特定時間看到了什麼,而不是現在的值,它使用了閃回查詢,這種查詢能夠顯示在指定的 SCN 值時的資料。

 檢視部分欄位說明

3.7.1 DBA_AUDIT_POLICIES

-----------------------------------------------------------------------
OBJECT_SCHEMA   對其定義了 FGA 策略的表或檢視的所有者
OBJECT_NAME     表或檢視的名稱
POLICY_NAME     策略的名稱 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT     在新增策略時指定的審計條件 — 例如,BALANCE >;= 11000
POLICY_COLUMN   審計列 — 例如,BALANCE
ENABLED         如果啟用則為 YES,否則為 NO 
PF_SCHEMA       擁有策略處理器模組的模式(如果存在)
PF_PACKAGE      處理器模組的程式包名稱(如果存在)
PF_FUNCTION     處理器模組的過程名稱(如果存在)


3.7.2  DBA_FGA_AUDIT_TRAIL

-----------------------------------------------------------------------
SESSION_ID      審計會話識別符號;與 V$SESSION 檢視中的會話識別符號不同
TIMESTAMP       審計記錄生成時的時間標記
DB_USER         發出查詢的資料庫使用者
OS_USER         作業系統使用者
USERHOST        使用者連線的機器的主機名
CLIENT_ID       客戶識別符號(如果由對打包過程dbms_session.set_identifier 的呼叫所設定)
EXT_NAME        外部認證的客戶名稱,如 LDAP 使用者
OBJECT_SCHEMA   對該表的訪問觸發了審計的表所有者
OBJECT_NAME     對該表的 SELECT 操作觸發了審計的表名稱
POLICY_NAME     觸發審計的策略名稱(如果對錶定義了多個策略,則每個策略將插入一條記錄。在此情況下,該列顯示哪些行是由哪個策略插入的。)
SCN             記錄了審計的 Oracle 系統更改號
SQL_TEXT        由使用者提交的 SQL 語句
SQL_BIND        由 SQL 語句使用的繫結變數(如果存在)


(透過諸如 SQL*Plus 等工具或者應用程式),都對操作進行審計,允許進行非常簡單的設定。



audit delete any table; --審計刪除表的操作

audit delete any table whenever notsuccessful; --只審計刪除失敗的情況

audit delete any table whenever successful;--只審計刪除成功的情況

audit delete,update,insert on user.table bysystem; --審計system使用者對錶user.table的delete,update,insert操作



希望(ˇ?ˇ) 想~進步dba加入我群,共同討論問題,一起進步
技術群:132304250


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

相關文章