審計Oracle資料庫的使用

db_wjw發表於2011-11-25
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

僅使用許可權、角色、檢視、甚至細粒度安全策略建立訪問控制系統還不能保證資料庫的安全。審計資料庫的使用能讓我們知道訪問控制機制是否確實像所希望的那樣工作。審計涉及監控和記錄使用者的資料庫活動。

Oracle提供了大量的審計型別的控制選擇,可以再會話級或在整個資料庫級進行審計。主要分為標準審計和細粒度審計,標準審計基於語句級、許可權級和物件級。而細粒度審計涉及某種粒度的資料訪問,或涉及基於內容的某些活動。

應該儘量使審計選項滿足審計目的的最低要求。在審計開啟時,應密切關注SYSTEM表空間和SYS.AUD$表。如果SYS.AUD$被填滿,則資料庫中進一步的連線和DML活動可能會停止。因此,應該定期歸檔和清除SYS.AUD$表中的記錄。

Oracle資料庫允許在3中不同的級別上審計資料庫的使用,這3中級別分別為:語句、許可權和物件。語句級審計指定任意型別物件上所有活動的審計。許可權級審計跟蹤源於系統許可權的活動。物件級審計監控特定表上的UPDATEDELETEINSERT等語句的活動。

1)        啟用審計

為了審計資料庫內的所有使用者的活動,甚至是登陸資料庫的活動,需要再初始化引數檔案中指定AUDIT_TRAIL引數以啟用審計。AUDIT_TRAIL引數可以取如下的值:

l        NONE:禁用資料庫審計。NONE為此引數的預設值。

l        OS:指出Oracle將把審計記錄寫到一個作業系統檔案中。

l        DB:指出Oracle將把審計記錄寫入資料庫審計跟蹤,可視為DBA_AUDIT_TRAIL(儲存在SYS.AUD$表中)。

l        DB,EXTENDED:指出Oracle將把所有審計記錄傳送到資料庫審計跟蹤,除此之外,填充SQLBINDSQLTEXTCLOB列。

l        XML:指定資料庫審計,進入OS檔案的是XML格式的審計記錄。

l        XML,EXTENDED:與XML設定相同,另外還記錄所有審計跟蹤列,包括SQLTEXTSQLBIND

如果指定AUDIT_TRAIL=OS,則審計跟蹤不再資料庫中儲存審計資訊,而是在由AUDIT_TRAIL_DEST引數指定的位置儲存審計資訊。如果指定AUDIT_TRAIL=OS且省略AUDIT_TRAIL_DEST引數,則預設將審計資訊寫到$ORACLE_HOME/rdbms/audit/目錄中。

2)        Oracle的預設審計

在沒有指定AUDIT_TRAIL引數的預設情況下,Oracle也會將3種型別的資料庫活動記錄到$ORACLE_HOME/rdbms/audit目錄中:

l        作為SYSOPERSYSDBA連線

l        資料庫啟動

l        資料庫關閉

通常,審計檔案捕獲使用者SYS(具有SYSDBA許可權)進行的CONNECTSHUTDOWNSTARTUP事件。

3)        開啟審計

一旦設定了AUDIT_TRAIL引數,就啟用了資料庫中的審計。但是,為了實際開始審計,還必須指定希望資料庫審計哪些表和哪些活動。

可以使用恰當的命令開始任何級別的審計活動。示例如下:

SQL> audit select on employees;

SQL> audit delete any table by wjw whenever not successful;

SQL> audit update any table;

SQL> audit session by wjw;

SQL> audit select,insert,update,delete on employees by access whenever successful;

下面是一個更強的審計選項,它保證審計所有許可權:

SQL> audit all privileges;

4)        關閉審計

為了關閉審計,可以使用幾乎和開啟審計相同的語句。示例如下:

SQL> noaudit session;

SQL> noaudit delete any table by wjw whenever not successful;

SQL> noaudit delete any table by wjw;

       如果要關閉所有級別(語句、許可權和物件)的審計,可以使用下面3條語句:

SQL> noaudit all;                /*關閉所有語句審計*/

SQL> noaudit all privileges;       /*關閉所有許可權審計*/

SQL> noaudit all on default;       /*關閉所有物件審計*/

5)        用觸發器定製資料庫審計

可以再Oracle中建立集中型別的觸發器,包括DML觸發器和DDL觸發器以及系統級觸發器。

a)        為審計使用基於DML的觸發器:

SQL> create or replace trigger audit_insert_regions

after insert on hr.regions

for each row

insert into regions_audit

values(user,sysdate);

b)        為審計使用系統觸發器:

Oracle提供了強有力的系統級觸發器,如資料庫啟動之後、資料庫關閉之前引發的觸發器。登陸和退出觸發器對資料庫審計特別有用。

下面為一個記錄使用者登陸和退出資料庫資訊的系統級觸發器示例:

(1)     建立一個記錄登陸和退出資料庫資訊的表:

SQL> create table logon_audit(

user_id varchar2(30),

session_id number(10),

logon_time date,

logoff_time date,

host varchar2(20));

(2)     建立登陸觸發器和退出觸發器:

SQL> create or replace trigger logon_audit_trigger

after logon on database

begin

insert into logon_audit

values(user,

sys_context(‘userenv’,’sessionid’),

sysdate,

null,

sys_context(‘userenv’,’host’));

end;

SQL> create or replace trigger logoff_audit_trigger

after logoff on database

begin

insert into logon_audit values

(user,

sys_context(‘userenv’,’sessionid’),

null,

sysdata,

sys_context(‘userenv’,’host’));

end;

(3)     檢視使用者的登陸/退出資訊:

SQL> select * from logon_audit;

c)        為審計使用DDL觸發器:

可以用DDL觸發器捕獲使用者對物件所做的更改,包括修改、建立和刪除各種型別的物件。還可以捕獲關於引發DDL觸發器的時間和使用者的大量屬性。

(1)     建立一個記錄修改DDL資訊的表:

SQL> create table ddl_log(

username varchar2(20),

change_date date,

object_type varchar2(20),

object_owner varchar2(20),

database varchar2(20));

(2)     建立DDL觸發器:

SQL> create or replace trigger ddl_log_trigger

after ddl on database

begin

insert into ddl_log values

(ora_login_user,

sysdate,

ora_dict_obj_type,

ora_dict_obj_owner,

ora_database_name);

end;

(3)     檢視使用者修改DDL資訊:

SQL> select * from ddl_log;

Oracle 允許基於內容審計資料庫中的活動,即可以規定只針對滿足一定條件的語句而不是所有的SELECTINSERTUPDATEDELETE語句來寫審計記錄。可以對想監控的個別的表或特定的操作應用細粒度審計(FGA)。

使用FGA只需要dbms_fga程式包上的許可權。在使用DBMS_FGA程式包時,審計記錄不進入標準的SYS.AUD$審計表,即使開啟了資料庫的審計跟蹤也是如此。審計記錄進入一個名為SYS.FGA_AUD$的表。

1)        啟用細粒度審計

使用FGA不需要開啟資料庫範圍的審計,因為這種審計是基於表訪問的。FGA記錄可以透過DBA_FGA_AUDIT_TRAILDBA_COMMON_AUDIT_TRIAL檢視來訪問,後一個檢視組合了標準和細粒度審計日誌記錄。

DBMS_FGA程式包的ADD_POLICY過程來新增細粒度審計策略。下面為該過程的結構。

SQL> execute dbms_fga.add_policy(

object_schema varchar2,

object_name varchar2,

policy_name varchar2,

audit_condition varchar2,

audit_column varchar2,

handler_schema varchar2,

handler_module varchar2,

enable boolean,

statement_types varchar2,

audit_trail binary_integer in default,

audit_column_opts binary_integer in default);

       以下是ADD_POLICY過程的引數說明:

l        object_schema:待審計的物件的模式;預設為NULL,表示登陸使用者的模式。

l        object_name:待審計的物件的名稱。

l        policy_name:使用者給出的審計策略名。

l        audit_condition:行內的條件,指出一個監控條件;預設為NULL,其作用於TRUE相同。

l        audit_column:希望審計的列訪問;預設為NULL,表示所有列訪問都要審計;audit_column_opts引數與這個引數結合使用。

l        handler_schema:包含事件處理程式的模式;預設為NULL,表示當前模式。

l        handler_module:過程或程式包名。

l        enable:此引數啟用和禁用策略;預設值為TRUE,表示啟用策略。

l        statement_types:此策略可以應用的SQL語句型別:insertupdatedeleteselect。預設為select

l        audit_trail:指出是否填寫fga_log$表中的lsqltextlsqlbind的引數;DB設定不填寫這兩個列;預設值為DB_EXTENDED,它填寫這兩個列。

l        audit_column_opts:確定查詢引用audit_column引數中指定的列或所有列時,是否實施審計;設定為DBMS_FGA.ALL_COLUMNS,則語句只在引用audit_column引數中指定的所有列時進行審計;預設為DBMS_FGA.ANY_COLUMNS,表示如果語句引用audit_column引數指定的任何列時進行審計。

2)        使用細粒度審計

下面的FGA示例審計hr.exp表上任何訪問sales部門的任何僱員的salary列的DML語句:

SQL> execute dbms_fga.add_policy(

object_schema => 'hr',

object_name => 'emp',

policy_name => 'chk_hr_emp',

audit_condition => 'dept = ''sales'' ',

audit_column => 'salary',

statement_types => 'insert,update,delete,select',

handler_schema => 'sec',

handler_module => 'log_id',

enable => true);

3)        檢視審計跟蹤

如果在資料庫中使用FGA,則DBA_FGA_AUDIT_TRAIL檢視顯示審計跟蹤(儲存在sys.fga_aud$表中)。

       SQL> select timestamp,db_user,os_user,object_schema,object_name,sql_text

from dba_fga_audit_trial;

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

相關文章