使⽤oracle数据库审计,Oracle数据库审计功能详解
⼀、审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很⼤增强。其中标准审计可分为⽤户级审计和系统级审计。⽤户级审计是任何Oracle⽤户可设置的审计,主要是⽤户针对⾃⼰创建的数据库表或视图进⾏审计,记录所有⽤户对这些表或视图的⼀切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,⽤以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
⼆、标准审计:
1、分类:
在ORACLE中分别⽀持以下三种标准审计类型:
语句审计,对某种类型的SQL语句审计,不指定结构或对象。
特权审计,对执⾏相应动作的系统特权的使⽤审计。
对象审计,对⼀特殊模式对象上的指定语句的审计。
这三种标准审计类型分别对如下3⽅⾯进⾏审计:
审计语句的成功执⾏、不成功执⾏,或者其两者。
对每⼀⽤户会话审计语句执⾏⼀次或者对语句每次执⾏审计⼀次。
对全部⽤户或指定⽤户的活动的审计。
当数据库的审计功能打开后,在语句执⾏阶段产⽣审计记录。审计记录包含有审计的操作、⽤户执⾏的操作、操作的⽇期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。
2、设置ORACLE标准审计:
下列步骤可以设置ORACLE的标准审计功能:
(1)修改初始化参数⽂件(a)
如果使⽤服务器参数⽂件使⽤alter system set parameter=value scope=spfileboth,详情参照1.1节中关于参数⽂件的介绍),设置AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:
DBTRUE:启动审计功能,并且把审计结果存放在数据库的 SYS.AUD$ 表中
OS:启动审计功能,并把审计结果存放在操作系统的审计信息中
DB_EXTENDED:具有DBTRUE的功能,另外填写AUD$的SQLBIND和SQLTEXT字段
NONEFALSE:关闭审计功能
(2)设置AUDIT_TRAIL参数:
如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST。
如果操作系统⽀持设置AUDIT_TRAIL=OS,⽂件会⾃动存放在AUDIT_FILE
_DEST所指定的⽬录下,并且⽂件名包含进程的PID。
⽐如:
AUDIT_FILE_DEST = $ORACLE_HOMErdbmsaudit
$ ls -l $ORACLE_HOMErdbmsaudit
-
rw-rw---- 1 ora92dba881 Mar 17 0957 ora_13264.aud
$ ps -efgrep 13264
ora92 13264 13235 0 095643 000 oracleV92 (DESCRIPTION=(LOCAL=Y)
SQL select spid, program, username from v$process;
SPID PROGRAM USERNAME
------ -------------------------------------------- -------------
…
13264oracle@frhp11 (TNS V1-V3)ora92
(3)确认审计相关的表是否已经安装
SQLPLUS connect AS SYSDBA
SQLPLUS select from sys.aud$; -- 没有记录返回
SQLPLUS select from dba_audit_trail; -- 没有记录返回
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQLPLUS connect as sysdba
SQLPLUS @$ORACLE_HOMErdbmsadmincataudit.sql
审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间⼜⾜够的空间存放审计信息。
(4)关闭并重启数据库
(5)设置所需要的审计信息
下⾯是⼀个例⼦
SQL connect systemmanager
SQL grant audit system to scott;
SQL connect scotttiger
SQL audit session;
停⽌审计:
SQL noaudit session;
通常设置了标准审计后都是通过Audit语句开启审计,使⽤noaudit语句收回审计。如下所⽰:对修改SC表结构或数据的操作进⾏审计可使⽤如下语句:
AUDIE ALTER,UPDATE ON SC;
取消对SC表的⼀切审计可使⽤如下语句:
NOAUDIT ALL ON SC;
3、设置审计的实例(对试图尝试⼝令的访问的审计):
以下是⼀个审计的实例,⽤于记录尝试通过野蛮尝试法破译ORACLE帐号⼝令的例⼦:
(1)修改审计相关参数(参照上⾯介绍的⽅法)
(2)重启数据库
(3)设置审计信息
SQLAUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL
SQL select returncode, action#, userid, userhost, terminal,timestamp
from aud$
RETURNCODEACTION# USERID USERHOST TERMINAL
---------- ---------- -------- -------------------- --------------------
1017100 SCOTTWPRATA-BR
1017100 SCOTTWPRATA-BR
1017100 SCOTTWPRATA-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-DDHH24MISS')
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);
BEGINoracle数据库表结构怎么看
OPEN C1;
able(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;
close c2;
END IF;
END LOOP;
close c1;
END;
⼀下是执⾏结果:
SQLset serveroutput on;
SQL execute auditlogin('2004-01-01',2);
USER BROKEN ALARMSYS
HOST,TERMXUJI,TIME2004-09-22110800
HOST,TERMXUJI,TIME2004-09-22110801
HOST,TERMXUJI,TIME2004-09-22110929
HOST,TERMXUJI,TIME2004-09-22110929
PLSQL 过程已成功完成。
4、将审计相关的表移动到其他表空间:
由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使⽤下⾯的语句来进⾏移动:
sqlconnect as sysdba;
sqlalter table aud$ move tablespace new tablespace;
sqlalter index I_aud1 rebuild online tablespace new tablespace;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论