Oracle审计功能一、审计分类:Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。二、标准审计:2.1分类:在ORACLE中分别支持以下三种标准审计类型:语句审计,对某种类型的SQL语句审计,不指定结构或对象。特权审计,对执行相应动作的系统特权的使用审计。对象审计,对一特殊模式对象上的指定语句的审计。这三种标准审计类型分别对如下3方面进行审计:审计语句的成功执行、不成功执行,或者其两者。对每一用户会话审计语句执行一次或者对语句每次执行审计一次。对全部用户或指定用户的活动的审计。当数据库的审计功能打开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。2.2设置ORACLE标准审计:下列步骤可以设置ORACLE的标准审计功能:1.修改初始化参数文件(initsid.ora)如果使用服务器参数文件使用altersystemsetparameter=valuescope=spfile|both,详情参照1.1节中关于参数文件的介绍),设置AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:DB/TRUE:启动审计功能,并且把审计结果存放在数据库的SYS.AUD$表中OS:启动审计功能,并把审计结果存放在操作系统的审计信息中DB_EXTENDED:具有DB/TRUE的功能,另外填写AUD$的SQLBIND和SQLTEXT字段NONE/FALSE:关闭审计功能2.设置AUDIT_TRAIL参数:如果设置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----1ora92dba881Mar1709:57ora_13264.aud$ps-ef|grep13264ora921326413235009:56:43?0:00oracleV92(DESCRIPTION=(LOCAL=Y)SQLselectspid,program,usernamefromv$process;SPIDPROGRAMUSERNAME---------------------------------------------------------------...13264oracle@frhp11(TNSV1-V3)ora923.确认审计相关的表是否已经安装SQLPLUSconnect/ASSYSDBASQLPLUSselect*fromsys.aud$;--没有记录返回SQLPLUSselect*fromdba_audit_trail;--没有记录返回如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。SQLPLUSconnect/assysdbaSQLPLUS@$ORACLE_HOME/rdbms/admin/cataudit.sql审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。4.关闭并重启数据库5.设置所需要的审计信息下面是一个例子SQLconnectsystem/managerSQLgrantauditsystemtoscott;SQLconnectscott/tigerSQLauditsession;停止审计:SQLnoauditsession;通常设置了标准审计后都是通过Audit语句开启审计,使用noaudit语句收回审计。如下所示:对修改SC表结构或数据的操作进行审计可使用如下语句:AUDIEALTER,UPDATEONSC;取消对SC表的一切审计可使用如下语句:NOAUDITALLONSC;2.3设置审计的实例(对试图尝试口令的访问的审计):以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:1.修改审计相关参数(参照上面介绍的方法)2.重启数据库3.设置审计信息SQLAUDITALLBYACCESSWHENEVERNOTSUCCESSFUL4.查询AUD$SQLselectreturncode,action#,userid,userhost,terminal,timestampfromaud$RETURNCODEACTION#USERIDUSERHOSTTERMINAL--------------------------------------------------------------------1017100SCOTTWPRATA-BR1017100SCOTTWPRATA-BR1017100SCOTTWPRATA-BRORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:createorreplaceprocedureAuditLogin(SinceVarchar2,TimesPLS_Integer)isUSER_IDVARCHAR2(20);cursorc1isselectuserid,count(*)fromsys.aud$wherereturncode='1017'andtimestamp#=to_date(Since,'yyyy-mm-dd')groupbyuserid;cursorC2ISSelectuserhost,terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')fromsys.aud$WHEREreturncode='1017'andtimestamp#=to_date(Since,'yyyy-mm-dd')ANDUSERID=USER_ID;ctPLS_INTEGER;V_USERHOSTVARCHAR2(40);V_TERMINALVARCHAR(40);V_DATEVARCHAR2(40);BEGINOPENC1;dbms_output.enable(1024000);LOOPFETCHC1INTOUSER_ID,CT;EXITWHENC1%NOTFOUND;IF(CT=TIMES)THENDBMS_OUTPUT.PUT_LINE('USERBROKENALARM:'||USER_ID);OPENC2;LOOPFETCHC2INTOV_USERhOST,V_TERMINAL,V_DATE;DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);EXITWHENC2%NOTFOUND;ENDLOOP;closec2;ENDIF;ENDLOOP;closec1;END;/一下是执行结果:SQLsetserveroutputon;SQLexecuteauditlogin('2004-01-01',2);USERBROKENALARM:SYSHOST:,TERM:XUJI,TIME:2004-09-22:11:08:00HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29PL/SQL过程已成功完成。2.4将审计相关的表移动到其他表空间:由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:sqlconnect/assysdba;sqlaltertableaud$movetablespacenewtablespace;sqlalterindexI_aud1rebuildonlinetablespacenewtablespace;SQLaltertableaudit$movetablespacenewtablespace;SQLalterindexi_auditrebuildonlinetablespacenewtablespace;SQLaltertableaudit_actionsmovetablespacenewtablespace;SQLalterindexi_audit_actionsrebuildonlinetablespacenewtablespace;三、细粒度审计:细粒度审计(FGA)(通过Oracle9i引入)可以理解为“基于政策的审计”。与标准的审计功能相反,FGA可用于指定生成审计记录必需的条件:FGA政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过VPD(dbms_rls)进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。使用了公司网络外部的某个IP地址。选定或更新了特定列。使用了该列的特定值。这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从Oracle数据库10g开始,FGA支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的FGA政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web接口或通过SQL*Plus),其操作都会记录下来。3.1使用细粒度审计:1、创建测试表:createtableACCOUNT(AACT_NOnumbernotnull,CUST_IDnumbernotnull,BALANCEnumber(15,2));2、添加审计策略:beginDBMS_FGA.DROP_POLICY(object_schema='TEST',object_name='ACCOUNT',policy_name='ACCOUNT_ACCESS');end;这段代码必须由具有执行程序包dbms_fga权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:OBJECT_SCHEMA对其定义了FGA策略的表或视图的所有者OBJECT_NAME表或视图的名称POLICY_NAME策略的名称,由用户自定义—例如,ACCOUNTS_ACCESSPOLICY_TEXT在添加策略时指定的审计条件—例如,BALANCE=11000POLICY_COLUMN审计列—例如,BALANCEENABLED如果启用则为YES,否则为NOPF_SCHEMA拥有策略处理器模块的模式(如果存在)PF_PACKAGE处理器模块的程序包名称(如果存在)PF_FUNCTION处理器模块的过程名称(如果存在)3、在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:select*fr