Chinaunix首页 | 论坛 | 博客
  • 博客访问: 684048
  • 博文数量: 41
  • 博客积分: 5070
  • 博客等级: 大校
  • 技术积分: 1265
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-02 13:12
文章分类

全部博文(41)

文章存档

2013年(8)

2011年(2)

2009年(9)

2008年(22)

我的朋友

分类: Oracle

2013-08-05 14:44:00



1、什么是审计



审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)中。默认情况下审计是没有开启的。



不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。



2、和审计相关的两个主要参数



Audit_sys_operations



默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。



Audit_trail



None:是默认值,不做审计;



DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;



DB_Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;



OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;



XML10g里新增的。



注:这两个参数是static参数,需要重新启动数据库才能生效。



3、审计级别



当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)Privilege(权限)、object(对象)。



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可以对schemaDDL进行“审计”,这个功能稍显不足。



4、审计的一些其他选项



by access /
by session



by access 每一个被审计的操作都会生成一条audit trail



by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session



whenever
[not] successful



whenever
successful
操作成功(dba_audit_trailreturncode字段为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;



8、实例讲解



8.1、激活审计



sqlplus / as
sysdba



SQL> show
parameter audit



NAME                                 TYPE        VALUE



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



audit_file_dest                      string      /u01/app/oracle/admin/ORCL/adump



audit_sys_operations                 boolean     FALSE



audit_syslog_level                   string



audit_trail                          string      NONE



SQL>
alter system set audit_sys_operations=TRUE scope=spfile;    --
审计管理用户(sysdba/sysoper角色登陆)



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



SQL>
startup force;



SQL> show
parameter audit



NAME                                 TYPE        VALUE



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



audit_file_dest                      string      /u01/app/oracle/admin/ORCL/adump



audit_sys_operations                 boolean     TRUE



audit_syslog_level                   string



audit_trail                          string      DB_EXTENDED          



8.2、开始审计



sqlplus / as
sysdba



--记录对一个表的所有操作



SQL>
audit all on t_test;



SQL> conn
u_test



SQL>
select * from t_test;



SQL>
insert into u_test.t_test (c2,c5) values ('test1','2');



SQL>
commit;



SQL>
delete from u_test.t_test;



SQL>
commit;



SQL> conn
/as sysdba



SQL> select
OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_bind,sql_text
from dba_audit_trail;



sql>
audit select table by u_test by access;



如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).



例:



AUDIT DELETE
ANY TABLE;    --
审计删除表的操作



AUDIT DELETE
ANY TABLE WHENEVER NOT SUCCESSFUL;    --
只审计删除失败的情况



AUDIT DELETE
ANY TABLE WHENEVER SUCCESSFUL;    --
只审计删除成功的情况



AUDIT
DELETE,UPDATE,INSERT ON user.table by test;   
--
审计test用户对表user.tabledelete,update,insert操作



8.3、撤销审计



SQL>
noaudit all on t_test;



9、审计语句



多层环境下的审计:appserve-应用服务器,jackson-client



AUDIT SELECT
TABLE BY appserve ON BEHALF OFjackson;



审计连接或断开连接:



AUDIT
SESSION;



AUDIT
SESSION BY jeff, lori;    --
指定用户



审计权限(使用该权限才能执行的操作)



AUDIT DELETE
ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;



AUDIT DELETE
ANY TABLE;



AUDIT SELECT
TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT
SUCCESSFUL;



对象审计:



AUDIT DELETE
ON jeff.emp;



AUDIT
SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;



取消审计:



NOAUDIT
session;



NOAUDIT
session BY jeff, lori;



NOAUDIT
DELETE ANY TABLE;



NOAUDIT
SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;



NOAUDIT
ALL;    --
取消所有statement审计



NOAUDIT ALL
PRIVILEGES;    --
取消所有权限审计



NOAUDIT ALL
ON DEFAULT;    --
取消所有对象审计



10、清除审计信息



DELETE FROM
SYS.AUD$;



DELETE FROM
SYS.AUD$ WHERE obj$name='EMP';



11、审计视图



STMT_AUDIT_OPTION_MAP    -- 审计选项类型代码



AUDIT_ACTIONS    -- action代码



ALL_DEF_AUDIT_OPTS    -- 对象创建时默认的对象审计选项



DBA_STMT_AUDIT_OPTS    -- 当前数据库系统审计选项



DBA_PRIV_AUDIT_OPTS    -- 权限审计选项



DBA_OBJ_AUDIT_OPTS   



USER_OBJ_AUDIT_OPTS   



; -- 对象审计选项



DBA_AUDIT_TRAIL   



USER_AUDIT_TRAIL    -- 审计记录



DBA_AUDIT_OBJECT   



USER_AUDIT_OBJECT    -- 审计对象列表



DBA_AUDIT_SESSION   



USER_AUDIT_SESSION    -- session审计



DBA_AUDIT_STATEMENT   



USER_AUDIT_STATEMENT    -- 语句审计



DBA_AUDIT_EXISTS    -- 使用BY AUDIT NOT EXISTS选项的审计



DBA_AUDIT_POLICIES    -- 审计POLICIES



DBA_COMMON_AUDIT_TRAIL    -- 标准审计+精细审计



12、将审计结果表从system表空间里移动到别的表空间上



实际上sys.aud$表上包含了两个lob字段,并不是简单的move table就可以。



下面是具体的过程:



alter table
sys.aud$ move tablespace users;



alter table
sys.aud$ move lob(sqlbind) store as( tablespace USERS);



alter table
sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);



alter index sys.I_AUD1 rebuild tablespace u





 

阅读(1487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~