ORALCE 的AUDIT 以及開啟AUDIT對REDO 的影響

dawn009發表於2014-05-20

關於audit:

1、什麼是審計

簡單來講,就是把對資料庫的操作記錄下來。

不管你是否開啟資料庫的審計功能,以下這些作業系統會強制記錄。

a:用管理員許可權連線Instance

b:啟動資料庫

c:關閉資料庫

記錄的位置由AUDIT_FILE_DEST指定。例如:/home/oracle/admin/orcl/adump。

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

Audit_sys_operations

預設為false,當設定為true時,所有(注意是所有!)sys使用者(包括以sysdba,sysoper身份登入的使用者)的操作都會被記錄,若為預設的false,則只記錄start,shutdown ,connect操作。

audit trail不會寫在aud$表中,記錄在檔案系統上,記錄的位置由AUDIT_FILE_DEST指定。例如:/home/oracle/admin/orcl/adump

這個引數可以單獨修改,跟audit_trail沒幹系,只針對sys使用者的修改記錄做審計,若對其他使用者審計,看Audit_trail

Audit_trail

取值:

none

Disables database auditing. 

os

Enables database auditing and directs all audit records to the operating system's audit trail.  ---將audit記錄到OS檔案中

db

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). ----將audit記錄到aud$表中(不記錄到SQLBIND和SQLTEXT欄位)

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.將audit記錄到aud$表中(記錄到SQLBIND和SQLTEXT欄位,即:將操作SQL記錄下來)

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.

注:這兩個引數是static引數,需要重新啟動資料庫才能生效。

3、審計級別

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

對於語句和許可權審計,生效從執行語句後下一個登陸使用者開始,當前的所有session不受影響。而物件的審計,則從審計語句開始後對當前所有的使用者生效

Statement

按語句來審計,比如audit table 會審計資料庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy使用者所有的資料庫連線。

Privilege

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

Object

按物件審計,只審計on關鍵字指定物件的相關操作,如aduit 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可以對schema的DDL進行“審計”,這個功能稍顯不足。

4、審計的一些其他選項

by access / by session :by access 每一個被審計的操作都會生成一條audit trail。 by session,一個會話裡面同型別的操作只會生成一條audit trail。 預設為by session

whenever [ not ] successful :whenever successful 操作成功(dba_audit_trail中returncode欄位為0) 才審計,whenever not successful反之。 省略該子句的話,不管操作成功與否都會審計。

5、和審計相關的檢視

dba_audit_trail

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

dba_stmt_audit_opts

可以用來檢視statement審計級別的audit options,即資料庫設定過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts檢視功能與之類似

all_def_audit_opts

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

6、取消審計

將對應審計語句的audit改為noaudit即可,如audit session whenever successful;取消審計noaudit session whenever successful;

============操作

下面修改audit_sys_operations。 對sys進行審計。

SQL> alter system set audit_sys_operations=true;

alter system set audit_sys_operations=true

                 *

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified

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

(All audit records for SYS are written to the operating system file that contains the audit trail, and not to SYS.AUD$ (also viewable as DBA_AUDIT_TRAIL))

System altered.

修改audit_sys_operations必須加入scope=spfile.否則報錯。

 

現在重啟:

 

SQL> startup force;

ORACLE instance started.

Total System Global Area  209715200 bytes

Fixed Size                  1218580 bytes

Variable Size             117442540 bytes

Database Buffers           88080384 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.


audit_sys_operations ,修改了這個引數為true,所有sys操作記錄在  ora_30922.aud 中

[oracle@localhost adump]$ more ora_30922.aud

Mon Jun  6 16:45:09 2011

ACTION : 'select * from test'

DATABASE USER: '/'

PRIVILEGE : SYSDBA

CLIENT USER: oracle

CLIENT TERMINAL: pts/4

STATUS: 0

 

Mon Jun  6 16:47:12 2011

ACTION : 'delete from test'

DATABASE USER: '/'

PRIVILEGE : SYSDBA

CLIENT USER: oracle

CLIENT TERMINAL: pts/4

STATUS: 0

 

Mon Jun  6 16:47:13 2011

ACTION : 'commit'

DATABASE USER: '/'

PRIVILEGE : SYSDBA

CLIENT USER: oracle

CLIENT TERMINAL: pts/4

STATUS: 0

 

這時發現會記錄sys所有執行過的命令,而不只是shutdown start connect 這些命令了。

===============

下面修改Audit_trail 對普通使用者進行審計:

 

SQL> audit all on test.chh  by access;  ---對test使用者下的chh表的每一次操作都進行審計

Audit succeeded.

SQL> conn test/test;

Connected.

SQL> select * from chh;

no rows selected

SQL> delete from chh;

0 rows deleted.

SQL> select * from dba_audit_trail;

 

OS_USERNAME                                                                      USERNAME                       USERHOST                                                                         TERMINAL                                                                         TIMESTAMP   OWNER                          OBJ_NAME                                                                             ACTION ACTION_NAME                  NEW_OWNER                      NEW_NAME                                                                         OBJ_PRIVILEGE    SYS_PRIVILEGE                            ADMIN_OPTION GRANTEE                        AUDIT_OPTION                             SES_ACTIONS         LOGOFF_TIME LOGOFF_LREAD LOGOFF_PREAD LOGOFF_LWRITE LOGOFF_DLOCK                             COMMENT_TEXT                                                                      SESSIONID    ENTRYID STATEMENTID RETURNCODE PRIV_USED                                CLIENT_ID                                                        ECONTEXT_ID                                                      SESSION_CPU EXTENDED_TIMESTAMP                                                               PROXY_SESSIONID GLOBAL_UID                       INSTANCE_NUMBER OS_PROCESS       TRANSACTIONID           SCN SQL_BIND                                                                         SQL_TEXT

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

oracle                                                                           TEST                           localhost.localdomain                                                            pts/4                                                                            2011-6-6 17 TEST                           CHH                                                                                       3 SELECT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              4009          1           7          0                                                                                                                                                                                        06-6月 -11 05.24.25.835606 下午 +08:00                                                                                                          0 32553                                1959247                                                                                  select * from chh

oracle                                                                           TEST                           localhost.localdomain                                                            pts/4                                                                            2011-6-6 17 TEST                           CHH                                                                                       7 DELETE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              4009          2           8          0                                                                                                                                                                                        06-6月 -11 05.24.29.066447 下午 +08:00                                                                                                          0 32553                                1959251                                                                                  delete from chh

 已記錄操作。

 ====修改為xml,把審計資訊以xml形式放到OS上

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

System altered.

SQL> audit all on test.chh  by access;

Audit succeeded.

再次檢視目錄下檔案:

[oracle@localhost adump]$ ls

adx_orcl.txt  ora_3215886152.xml  ora_3216147500.xml  ora_3218050184.xml

發現作業系統目錄下有了審計檔案。

那麼是把審計資訊放到資料庫裡面 還是放到檔案系統中呢?

把審計資訊放到資料庫中,是指放到sys.aud$資料字典表中,它在sytem表空間。放到資料庫中的好處是:

1:可以使用預定義的檢視檢視審計資訊,比如: DBA_AUDIT_TRAIL

2:可以使用ORALCE工具或第三方報表產生審計報表。

缺點是:

1:不安全,DBA可以對審計資料進行修改。

2:萬一資料庫不能對外服務,則審計資訊也不能訪問了。

把審計資訊放到OS檔案系統上

1:更安全,比如可以設定檔案系統目錄dba不能訪問的許可權,使DBA不可修改審計檔案。或者即使資料暫時不能對外服務了,審計檔案也可訪問

2;設定AUDIT_TRAIL=XML,形成的XML審計檔案可更好的與第三方系統互動。

 

由於把審計資訊放到sys.aud$,修改system表空間,想是否跟資料庫形成資源爭用。

下面驗證 把審計資訊放到資料庫 和 把審計資訊放到OS檔案系統 對redo 的影響:

先驗證第一種:把審計資訊放到資料庫

(注:test.chh 又 crate table test.chh as select * from dba_tables where 1=0 建立)

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

System altered.

SQL> audit all on test.chh by access;

Audit succeeded.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

       672

SQL> insert into chh select * from dba_tables where rownum<2000;

1641 rows created.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    408296

SQL> commit;

Commit complete.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    408464

最終產生redo:408464-672=407792

檢視審計表:

SQL> select * from dba_audit_trail;

oracle                                                                           TEST                           localhost.localdomain                                                            pts/4                                                                            2011-6-6 19 TEST                           CHH                                                                                       2 INSERT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              4048          2           9          0                                                                                                                                                                                        06-6月 -11 07.52.29.155304 下午 +08:00                                                                                                          0 5020             05001400C9020000    1985640                                                                                  insert into chh select * from dba_tables where rownum<5000

裡面對應操作的只有一條記錄。

其實 insert into chh select * from dba_tables where rownum<2000 影響的資料快很多,但它只是一條語句而已,所以在審計中是一條記錄。


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

System altered.


SQL> noaudit all on test.chh;

Noaudit succeeded.

SQL> audit all on test.chh by access;

Audit succeeded.

SQL> shutdown immediate;

SQL> startup;



SQL> conn test/test;

Connected.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

         0

SQL> insert into chh select * from dba_tables where rownum<5000;

1641 rows created.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    388468

 

SQL> commit;

Commit complete.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    388636

最終產生:388636-0=388636

與407792相差不多。說明把audit放到sys.aud$字典表與放到OS上,對redo的影響不大。

檢視檔案系統下的審計檔案:

[oracle@localhost adump]$ ls -l -t

總計 24

-rw-r----- 1 oracle oinstall  753 06-06 20:04 ora_5524.aud

-rw-r----- 1 oracle oinstall  762 06-06 20:03 ora_5510.aud

-rw-r----- 1 oracle oinstall  665 06-06 20:03 ora_5482.aud

-rw-r----- 1 oracle oinstall  672 06-06 20:03 ora_5481.aud

-rw-r----- 1 oracle oinstall 1326 06-06 20:03 ora_5454.aud

-rw-r----- 1 oracle oinstall  802 06-06 20:02 ora_5235.aud

[oracle@localhost adump]$ more  ora_5524.aud

Audit file /home/oracle/admin/orcl/adump/ora_5524.aud

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_1

System name:    Linux

Node name:      localhost.localdomain

Release:        2.6.18-194.26.1.el5

Version:        #1 SMP Tue Nov 9 12:54:40 EST 2010

Machine:        i686

Instance name: orcl

Redo thread mounted by this instance: 1

Oracle process number: 15

Unix process pid: 5524, image: oracle@localhost.localdomain (TNS V1-V3)

Mon Jun  6 20:04:15 2011

SESSIONID: "4058" ENTRYID: "1" STATEMENT: "8" USERID: "TEST" USERHOST: "localhost.localdomain" TERMINAL: "pts/4" ACTION: "2" RETURNCODE: "0" OBJ$CREATOR: "TEST" OBJ$NAME: "CHH" OS

$USERID: "oracle" 

對insert into chh select * from dba_tables where rownum<2000,形成也是一條audit記錄而已。


下面禁用掉審計 看看產生redo的情況:

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

System altered.

SQL> shutdown immediate;

SQL> startup;

SQL> conn test/test;

Connected.

SQL>  select value from v$mystat where statistic#=134;

     VALUE

----------

       624

SQL> insert into chh select * from dba_tables where rownum<5000;

1641 rows created.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    389212

SQL> commit;

Commit complete.

SQL> select value from v$mystat where statistic#=134;

     VALUE

----------

    389352

產生REDO:389352-624=388728

發現:

啟用audit,記錄audit到資料庫,產生redo:407792

啟用audit,記錄audit到OS,      產生redo:388636

關閉audit,                                      產生redo:388728



結論:

開啟審計,把audit放到sys.aud$字典表與放到OS上,對redo的爭用影響不大。前者稍微比後者產生稍微多                的redo。

是否開啟audit對 整個資料庫的redo 影響不大。


=============end=========
轉載於:

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

相關文章