Oracle审计功能

转载自:http://www.oraclefans.cn/forum/showblog.jsp?rootid=4675 作者:白鳝

审计是对选定的用户动作的监控和记录,通常用于:

u 审查可疑的活动。例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。

u 监视和收集关于指定数据库活动的数据。例如:DBA可收集哪些被修改、执行了多少次逻辑的I/O等统计数据。

ORACLE支持三种审计类型:

u 语句审计,对某种类型的SQL语句审计,不指定结构或对象。

u 特权审计,对执行相应动作的系统特权的使用审计。

u 对象审计,对一特殊模式对象上的指定语句的审计。

ORACLE所允许的审计选择限于下列方面:

u 审计语句的成功执行、不成功执行,或者其两者。

u 对每一用户会话审计语句执行一次或者对语句每次执行审计一次。

u 对全部用户或指定用户的活动的审计。

当数据库的审计是使能的,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。

[@more@]

Oracle 审计功能 简单介绍
Oracle的审计机制是用来监视用户对ORACLE数据库所做的各种操作。
在缺省情况下,系统的审计功能是关闭的。可以在INIT.ORA参数文件中将参数AUDIT_TRAIL设置为正整数来激活。
审计功能激活后,任何拥有表或视图的用户就可以进行如下审计操作:
 ·使用SQL语句来挑选审计选择项;
 ·审计对该用户所拥有的表或视图的成功或不成功的存取企图;
 ·有选择的审计各种类型的SQL操作(SELECT、UPDATE、INSERT、DELETE);
 ·控制审计的程度(是以SESSION还是ACCESS为单位)。
对于DBA用户还可以以下审计功能:
 ·对成功的LOGON、LOGOFF、GRANT、REVOKE进行审计;
例如:
审计不成功的登陆、创建表、删除表、修改表、drop表,及其授权操作。
audit session whenever not successful;
audit create any table, delete any table, drop any table, alter any table by access ;
audit table by access ;
audit create user, alter user, drop user by access ;
audit grant table, grant procedure by access;
撤销所有审计:
noaudit all;
noaudit all privileges;
那么,如何对DBA的所有操作进行审计?
执行结果为select 'AUDIT ALL PRIVILEGES by '||a.granted_role||';' from dba_role_privs a where a.granted_role = 'DBA';的查询
或者直接用更简单的方式:
audit DBA;
查询审计结果:
DBA_AUDIT_TRAIL 审计追踪记录
DBA_AUDIT_SESSION SESSION审计记录
DBA_AUDIT_STATEMENT STATEMENT审计记录
DBA_AUDIT_OBJECT 对象审计记录
ALL_DEF_AUDIT_OPTS 所有缺省审计
DBA_STMT_AUDIT_OPTS 所有语句审计
DBA_PRIV_AUDIT_OPTS 所有权限审计
DBA_OBJ_AUDIT_OPTS 所有对象审计
相关表和视图:
SYS.AUD$ 是唯一保留审计结果的表。其它的都是视图。
STMT_AUDIT_OPTION_MAP 包含有关审计选项类型代码的信息由SQL.BSQ 脚本在CREATEDATABASE 的时候创建
AUDIT_ACTIONS 包含对审计跟踪动作类型代码的说明
ALL_DEF_AUDIT_OPTS 包含默认对象审计选项。当创建对象时将应用这些选项
DBA_STMT_AUDIT_OPTS 描述由用户设置的跨系统的当前系统审计选项 (这张表记录了开启哪些审记功能)
DBA_PRIV_AUDIT_OPTS 描述由用户正在审计的跨系统的当前系统权限
DBA_OBJ_AUDIT_OPTS 描述在所有对象上的审计选项
USER_OBJ_AUDIT_OPTS USER 视图描述当前用户拥有的所有对象上的审计选项

设置ORACLE审计

下列步骤可以设置ORACLE的审计功能:

1. 修改参数文件(init.ora,如果使用服务器参数文件使用alter system set = scope=spfile|both,详情参照1.1节中关于参数文件的介绍),设置 AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:

l DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 SYS.AUD$ 表中

l OS:启动审计功能,并把审计结果存放在操作系统的审计信息中

l DB_EXTENDED:具有DB/TRUE的功能,另外填写AUD$SQLBINDSQLTEXT字段

l NONE/FALSE:关闭审计功能

2.如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST

如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE

_DEST所指定的目录下,并且文件名包含进程的PID

比如:

AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit

$ ls -l $ORACLE_HOME/rdbms/audit

-rw-rw---- 1 ora92 dba 881 Mar 17 09:57 ora_13264.aud

$ ps -ef|grep 13264

ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)

SQL> select spid, program, username from v$process;

SPID PROGRAM USERNAME

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

...

13264 oracle@frhp11 (TNS V1-V3) ora92

注意:WINDOWS NT不使用AUDIT_FILE_DEST参数,如果使用OS设置,那么审计信息会存放在WINDOWS NT的事件日志里。下面的章节会有专门的介绍。

3. 确认审计相关的表是否已经安装

SQLPLUS> connect / AS SYSDBA

SQLPLUS> select * from sys.aud$; -- 没有记录返回

SQLPLUS> select * from dba_audit_trail; -- 没有记录返回

如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。

SQLPLUS> connect / as sysdba

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

审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。

4. 关闭并重启数据库

5. 设置所需要的审计信息

下面是一个例子

SQL> connect system/manager

SQL> grant audit system to scott;

SQL> connect scott/tiger

SQL> audit session;

停止审计:

SQL> noaudit session;

设置审计的实例:对试图尝试口令的访问的审计

本节讨论的是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:

1. 修改审计相关参数(参照上一节介绍的方法)

2. 重启数据库

3. 设置审计信息

SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL

4. 查询AUD$

SQL> select returncode, action#, userid, userhost, terminal,timestamp

from aud$

RETURNCODE ACTION# USERID USERHOST TERMINAL

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

1017 100 SCOTT WPRATA-BR

1017 100 SCOTT WPRATA-BR

1017 100 SCOTT WPRATA-BR

ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:

create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)

is

USER_ID VARCHAR2(20);

cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')

group by userid;

cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')

from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2(40);

BEGIN

OPEN C1;

dbms_output.enable(1024000);

LOOP

FETCH C1 INTO USER_ID,CT;

EXIT WHEN C1%NOTFOUND;

IF(CT>=TIMES) THEN

DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);

OPEN C2;

LOOP

FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;

DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);

EXIT WHEN C2%NOTFOUND;

END LOOP;

close c2;

END IF;

END LOOP;

close c1;

END;

/

一下是执行结果:

SQL>set serveroutput on;

SQL> execute auditlogin('2004-01-01',2);

USER BROKEN ALARM:SYS

HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00

HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01

HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

PL/SQL 过程已成功完成。

将审计相关的表移动到其他表空间

由于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 ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/786540/viewspace-1004200/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/786540/viewspace-1004200/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值