ORALCE 的AUDIT 以及开启AUDIT对REDO 的影响

关于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=========
转载于:http://hi.baidu.com/longredhao/item/14ade076f404c8255d178911

请使用浏览器的分享功能分享到微信等