关于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