Oracle audit 審計功能說明

keeptrying發表於2013-11-05
Dava的原文:http://blog.csdn.net/tianlesoftware/article/details/4712932

 

一、Audit說明

 

1.1 審計

審計(Audit)用於監視使用者所執行的資料庫操作。審計記錄可存在資料字典表(稱為審計記錄:儲存在system表空間中的SYS.AUD$表中,可通過檢視dba_audit_trail檢視)或作業系統審計記錄中(預設位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)。

預設情況下審計是沒有開啟的。當資料庫的審計是開啟的,在語句執行階段產生審計記錄。審計記錄包含有審計的操作、使用者執行的操作、操作的日期和時間等資訊。不管你是否開啟資料庫的審計功能,以下這些作業系統會強制記錄:用管理員許可權連線instance;啟動資料庫;關閉資料庫。

1.1.1 Oracle審計功能

審計是對選定的使用者動作的監控和記錄,通常用於:

審查可疑的活動。例如:資料被非授權使用者所刪除,此時安全管理員可決定對資料庫的所有連線進行審計,以及對資料庫的所有表的成功地或不成功地刪除進行審計。

監視和收集關於指定資料庫活動的資料。例如:DBA可收集哪些被修改、執行了多少次邏輯的I/O等統計資料。

1.1.2 Oracle所允許的審計

審計語句的成功執行、不成功執行,或者其兩者;

對每一使用者會話審計語句執行一次或者對語句每次執行審計一次;

對全部使用者或指定使用者的活動的審計。

1.1.3 審計相關的表安裝

SQL> connect / as sysdba

已連線。

SQL> select * from sys.aud$;

 

未選定行

 

SQL> select * from dba_audit_trail;

 

未選定行

 

如果做上述查詢的時候發現表不存在,說明審計相關的表還沒有安裝,需要安裝。安裝方法如下:

SQL> connect / as sysdba

SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql

審計表安裝在SYSTEM表空間。所以要確保SYSTEM表空間有足夠的空間存放審計資訊。安裝後要重啟資料庫。

 

1.1.4 將審計相關的表移動到其它表空間

由於AUD$表等審計相關的表存放在SYSTEM表空間,因此為了不影響系統的效能,保護SYSTEM表空間,最好把AUD$移動到其它的表空間上。可以使用下面的語句來進行移動:

SQL> connect / as sysdba

SQL> alter table AUD$ move tablespace ;

SQL> alter index I_AUD1 rebuild online tablespace ;

SQL> alter table AUDIT$ move tablespace ;

SQL> alter index I_AUDIT rebuild online tablespace ;

SQL> alter table AUDIT_ACTIONS move tablespace ;

SQL> alter index I_AUDIT_ACTIONS rebuild online tablespace ;

 

 

1.1.5 truncate或者delete sys.aud$

delete之前,可以先把aud$exp備份一下,注意,不要直接exp,先建立一張臨時表,然後將臨時表exp

SQL> create table audit_record tablespace users as select * from sys.aud$;

然後exp

exptables=AUDIT_RECORD file=audit_record.dmp

最後delete資料:

SQL> delete from sys.aud$;

或者刪除指定表的審計:

SQL> delete from sys.aud$ where obj$name=&table_name;

注意,delete不會釋放system表空間。可以使用truncate table

SQL> truncate table sys.aud$;

 

 

1.2 和審計相關的兩個主要引數

1.2.1 audit_sys_operations

AUDIT_SYS_OPERATIONS enables or disables the auditing of operations issued by user SYS, and users connecting with SYSDBA or SYSOPER privileges. The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to XML.

On UNIX platforms, if the AUDIT_SYSLOG_LEVEL parameter has also been set, then it overrides the AUDIT_TRAIL parameter and SYS audit records are written to the system audit log using the SYSLOG utility.

AUDIT_SYS_OPERATIONS引數預設為false,當設定為true時,所有sys使用者(包括以sysdbasysoper身份登入的使用者)的操作都會被記錄。audit trail不會寫在aud$表中,這個很好理解,如果資料庫還未啟動,aud$不可用,那麼像conn / as sysdba這樣的連線資訊,只能記錄在其它地方。如果是windows平臺,audit trail會記錄在windows的事件管理器中,如果是linux/unix平臺則會記錄在audit_file_dest引數指定的檔案中。

SQL> show parameter audit_file_dest;

 

NAME                                 TYPE        VALUE

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

audit_file_dest            string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

 

 

1.2.2 audit_trail

AUDIT_TRAIL enables or disables database auditing.

Values:

·         none

Disables database auditing.(default)

·         os

Enables database auditing and directs all audit records to the operating system's audit trail.

·         db

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).

·         db,extended

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.

·         xml

Enables database auditing and writes all audit records to XML format OS files.

·         xml,extended

Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.

You can use the SQL statement AUDIT to set auditing options regardless of the setting of this parameter.

 

1.3審計級別

當開啟審計功能後,可在三個級別對資料庫進行審計:Statement(語句)、Privilege(許可權)、Object(物件)。

1.3.1 Statement

語句審計,對某種型別的SQL語句審計,不指定結構或物件。比如audit table會審計資料庫中所有的create tabledrop tabletruncate table語句。audit session by cmy會審計cmy使用者所有的資料庫連線。

1.3.2 Privilege

許可權審計,當使用者使用了該許可權則被審計。如執行grant select any table to a,當執行了audit select any table語句後,當使用者a訪問了使用者b的表時(如select * from b.t),會用到select any table許可權,故會被審計。注意使用者是自己表的所有者,所以使用者訪問自己的表不會被審計。

1.3.3 Object

物件審計,對一特殊模式物件上的指定語句的審計。如審計on關鍵字指定物件的相關操作,如audit alter,delete,drop,insert on cmy.t by scott;這裡會對cmy使用者的t表進行審計,但同時使用了by子句,所以只會對scott使用者發起的操作進行審計。

注意:Oracle沒有提供對schema中所有物件的審計功能,只能一個一個物件審計,對於後面建立的物件,Oracle則提供on default子句來實現自動審計,比如執行audit drop on default by access;後,對於隨後建立的物件的drop操作都會審計。但這個default會對之後建立的所有資料庫物件有效,似乎沒辦法指定只對某個使用者建立的物件有效,相比trigger可以對schemaDDL進行“審計”,這個功能稍顯不足。

 

 

1.4審計的一些其他選項

1.4.1 by access / by session

by access:每一個被審計的操作都會生成一條audit trail

by session:一個會話裡面同類的操作只會生成一條audit trail,預設為by session

 

1.4.2 whenever [not] successful

whenever successful:只審計操作成功(dba_audit_trailreturncode欄位為0)的情況。

whenever not successful:只審計操作失敗的情況。

如果忽略這個子句,則不管操作成功與否都審計。

 

 

1.5 和審計相關的檢視

1.5.1 dba_audit_trail

儲存所有的audit trail,實際上它只是一個基於aud$的檢視。其它的檢視dba_audit_sessiondba_audit_objectdba_audit_statement都只是dba_audit_trail的一個子集。

1.5.2 dba_stmt_audit_opts

可以用來檢視statement審計級別的audit options,即資料庫設定過哪些statement級別的審計。

dba_obj_audit_optsdba_priv_audit_opts檢視功能與之類似。

1.5.3 all_def_audit_opts

用來檢視資料庫用on default子句設定了哪些預設物件審計。

 

 

1.6 取消審計

將對應審計語句的audit改為noaudit即可。

audit session whenever successful,對應的取消審計語句改為noaudit session whenerer successful;

 

 

 

二、Fine-graind Auditing(FGA)細粒度審計

細粒度審計(FGA),是在Oracle 9i中引入的,能夠記錄SCN號和行級的更改以重建舊的資料。但是它們只能用於select語句,而不能用於DML,如updateinsertdelete語句。因此,對於Oracle資料庫10g之前的版本,使用觸發器雖然對於以行級跟蹤使用者初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。10g之後版本可以audit所有DMLFGA的實現基於DBMS_FGA包,它屬於SYS使用者。

 

2.1 增加FGA策略

--審計表

SQL> grant resource,connect to bank identified by bank;

 

create table bank.accounts

(

   acct_no number primary key,

   cust_id number not null,

   balance number(15,2) null

);

insert into bank.accounts values(1,1,10000);

insert into bank.accounts values(2,2,20000);

commit;

 

begin

dbms_fga.drop_policy(

  object_schema=> BANK,

  object_name=> ACCOUNTS,

  policy_name=> ACCOUNTS_ACCESS);

 

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;

 

 

--審計列和審計條件,在add_policy中加入

--audit_column => BALANCE

--audit_condition => BALANCE >=11000

 

 

begin

dbms_fga.drop_policy(

  object_schema=> BANK,

  object_name=> ACCOUNTS,

  policy_name=> ACCOUNTS_ACCESS);

 

dbms_fga.add_policy(

  object_schema=> BANK,

  object_name=> ACCOUNTS,

  audit_column => BALANCE

  audit_condition => BALANCE >=11000

  policy_name=> ACCOUNTS_ACCESS);

end;

/

 

 

select BALANCE from bank.accounts;

select timestamp,db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

 

 

 

2.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;

 

--演示何時審計操作以及何時不審計操作的各種情況 SQL 語句審計狀態:

select balance from bank.accounts;  

       進行審計。使用者選擇了在新增策略時所指定的審計列 BALANCE

 

select * from  bank.accounts;     

       進行審計。即使使用者沒有明確指定列 BALANCE* 也隱含地選擇了它。

 

select cust_id from bank.accounts where balance < 10000;

       進行審計。即使使用者沒有明確指定列 BALANCEwhere 子句也隱含地選擇了它。

 

select cust_id from bank.accounts;  

       不進行審計。使用者沒有選擇列 BALANCE

select count(*) from bank.accounts; 

       不進行審計。使用者沒有明確或隱含地選擇列 BALANCE

 

2.3 處理器模組

FGA的功能不只是記錄審計線索中的事件,FGA還可以任意執行過程。過程可以執行一項操作,比如當使用者從表中選擇特定行時向審計者傳送電子郵件警告,或者可以寫到不同的審計線索中。這種儲存程式碼段可以是獨立的過程或者是程式包中的過程,稱為策略的處理器模組。

實際上由於安全性原因,它不必與基表本身處於同一模式中。您可能希望特意將它放置在不同的模式中。由於只要SELECT出現時過程就會執行,非常類似於DML語句啟動的觸發器,您還可以將其看做SELECT語句觸發器。

 

--以下引數指定將一個處理器模組指定給策略:

1)、handler_schema擁有資料過程的模式

2)、handler_module過程名稱

3)、處理器模組還可以採用程式包的名稱來代替過程名稱。在這種情況下,引數handler_module package.procedure 的格式中指定。

 

2.4 FGA資料字典檢視

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

審計線索收集在SYS擁有的表FGA_LOG$中。對於SYS擁有的任何原始表,此表上的某些檢視以對使用者友好的方式顯示資訊。DBA_FGA_AUDIT_TRAIL是該表上的一個檢視。

一個重要的列是SQL_BIND,它指定查詢中使用的繫結變數的值,這是顯著增強該工具功能的一項資訊。

另一個重要的列是SCN,當發生特定的查詢時,它記錄系統更改號。此資訊用於識別使用者在特定時間看到了什麼,而不是現在的值,它使用了閃回查詢,這種查詢能夠顯示在指定的SCN值時的資料。

 

2.5 檢視和FGA

到目前為止已經討論了在表上應用FGA,現在看一下如何在檢視上使用FGA。假定ACCOUNTS表上定義檢視VW_ACCOUNTS,如下:

create view bank.vw_accounts as select * from bank.accounts;

 

select * from bank.vw_accounts;

 

select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

 

如果只希望審計對檢視的查詢而不是對錶的查詢,可以對檢視本身建立策略。通過將檢視名稱而不是表的名稱傳遞給打包的過程dbms_fga.add_policy 中的引數 object_name,可以完成這項工作。

隨後 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示檢視的名稱,並且不會出現有關表訪問的附加記錄。

 

 

 

2.6 其它用途

除了記錄對錶的選擇訪問,FGA 還可用於某些其它情況:

1)可以對資料倉儲使用 FGA,以捕獲特定的表、檢視或物化檢視上發生的所有語句,這有助於計劃索引。不需要到 V$SQL 檢視去獲取這些資訊。即使 SQL 語句已經超出了 V$SQL 的期限,在 FGA 審計線索中將會始終提供它。

2)由於 FGA 捕獲繫結變數,它可以幫助您瞭解繫結變數值的模式,這有助於設計直方圖集合等。

3)處理器模組可以向審計者或DBA 傳送警告,這有助於跟蹤惡意應用程式。

4)由於 FGA 可以作為 SELECT 語句的觸發器,您可以在需要這種功能的任何時候使用它。

 

 

2.7 檢視部分欄位說明

2.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     處理器模組的過程名稱(如果存在)

 

 

2.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 語句使用的繫結變數(如果存在)

 

 

小結:

    FGA Oracle 資料庫中支援隱私和職能策略。因為審計發生在資料庫內部而不是應用程式中,所以無論使用者使用的訪問方法是什麼(通過諸如 SQL*Plus 等工具或者應用程式),都對操作進行審計,允許進行非常簡單的設定。

 

 

 

 

四、相關示例

4.1 審計功能的引數控制

audit_trail引數的值可以設定為以下幾種:

l   NONE:不開啟;

l   DB:開啟審計功能;

l   OS:審計記錄寫入一個作業系統檔案;

l   TRUE:與引數DB一樣;

l   FALSE:不開啟審計功能。

這個引數是寫到spfile裡面的,需要重啟資料庫。

 

4.2 檢視審計功能是否啟動

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest  string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations               boolean     FALSE

audit_trail                          string       NONE

 

4.3 開啟審計

SQL> alter system set audit_sys_operations=TRUE scope=spfile;

系統已更改。

--審計管理使用者(以sysdba/sysoper角色登入)

SQL> alter system set audit_trail=db,extended scope=spfile;

系統已更改。

開啟審計需要重啟例項。

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest  string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations             boolean     TRUE

audit_trail                        string      DB, EXTENDED

 

4.4 關閉審計

SQL> alter system set audit_trail=none scope=spfile;

系統已更改。

關閉審計也需要重啟例項。

 

4.5審計例項

4.5.1 啟用審計

SQL> show parameter audit

NAME                                 TYPE        VALUE

------------------------------------ ----------- audit_file_dest  string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations                 boolean     FALSE

audit_trail                          string      NONE

 

SQL> alter system set audit_sys_operations=TRUE scope=spfile;

系統已更改。

SQL> alter system set audit_trail=db,extended scope=spfile;

系統已更改。

重啟資料庫。

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest                      string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations               boolean     TRUE

audit_trail                          string      DB, EXTENDED

 

4.5.2 開始審計

注意:無法對SYS使用者操作執行auditnoaudit命令。

SQL> conn / as sysdba

已連線。

SQL> create table tb1(id int,name varchar2(10)) tablespace users;

表已建立。

SQL> insert into tb1 values(1,'a');

已建立 1 行。

 

SQL> commit;

提交完成。

SQL> grant delete on sys.tb1 to lxh;

授權成功。

SQL> audit all on tb1;

審計已成功。

 

SQL> commit;

提交完成。

SQL> conn lxh/lxh

已連線。

SQL> delete from sys.tb1;

已刪除 1 行。

 

SQL> commit;

提交完成。

SQL> select * from dba_audit_trail

 

SQL> audit select table by tb1 by access;

如果在命令後面新增by user則只對user的操作進行審計,如果省去by使用者,則對系統中所有的使用者進行審計,不包含sys使用者。

例:

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

audit delete any table whenever successful;

                             --只審計刪除成功的情況

audit delete any table whenever not successful;

                             --只審計刪除失敗的情況

audit delete,update,insert on user.table by system;

--審計system使用者對錶user.tabledeleteupdateinsert操作。

 

 

4.5.3 撤銷審計

SQL> noaudit all on tb1;

 

 

 

 

 

 

 

 

 

 

 

 

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

相關文章