Oracle审计功能介绍_第1页
Oracle审计功能介绍_第2页
Oracle审计功能介绍_第3页
Oracle审计功能介绍_第4页
Oracle审计功能介绍_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle审计功能

一、审计分类:

Oracle中审计总体上可分为“标准审计〃和“细粒度审计〃后者也称为“基于政策的审计〃,

在OraclelOG之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计

是任何Oracle用户可设置的审计,主要是用户针对自己创立的数据库表或视图进行审计,记录所

有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计

只能±1DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级

权限下的操作。

二、标准审计:

2.1分类:

在ORACLE中分别支持以下三种标准审计类型:

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

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

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

这三种标准审计类型分别定如下3方面进行审计:

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

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

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

当数据库的审计功能翻开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的

操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数

据库官计记录是在SYS模式的ALD$表中。

2.2设置ORACLE标准审计:

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

1.修改初始化参数文件(init<sid>.ora)

如果使用效劳器参数文件使用altersystemset<parameter>=<value>scope=sp,详情参照LI节中关于参数

文件的介绍),设置AUDIT_TRA1L参数,并且重启数据库。AUDIT_TRAIL的取值如下:

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

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

DB.EXTENDED:具有DB/TRUE的功能,另外填写人皿$的SQLBIND和SQLTEXT字段

NONE/FALSE:关闭审计功能

2,设置AUDIT_TRAIL参数:

如果设置AUDIT_TRAIL=OS,还需要修改参数AUDIT_。

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

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

比方:

AUDIT_=$ORACLE_HOME/rdbms/audit

$Is-1$ORACLE_HOME/rdbms/audit

-rw-rw----1ora92dba881Mar1709:57ora」3264.aud

$ps-ef|grep13264

ora921326413235009:56:43?0:00oracleV92(DESCRIPTION=(LOCAL=Y)

SQL>selectspid,program,usernamefromv$process;

SPIDPROGRAMUSERNAME

13264oracle@frhpll(TNSV1-V3)ora92

3,确认审计相关的表是否巳经安装

SQLPLUS>connect/ASSYSDBA

SQLPLUS>select*fromsys.aud$;一没有记录返回

SQLPLUS>select*fromdba_audit_trail;一没有记录返回

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

SQLPLUS>connect/assysdba

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

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

4.关闭并重启数据库

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

下面是一个例子

SQL>connectsystem/manager

SQL>grantauditsystemtoscott;

SQL>connectscott/tiger

SQL>auditsession;

停止审计:

SQL>noauditsession;

通常设置了标准审计后都是通过Audit语句开启审计,使用noaudit语句收回审计。如下所示:

对修改SC表结构或数据的操作进行审计可使用如下语句:

AUDIEALTER,UPDATEONSC;

取消对SC表的一切审计可使用如下语句:

NOAUDITALLONSC;

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

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

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

2.重启数据库

3.设置审计信息

SQL>AUDITALLBYACCESSWHENEVERNOTSUCCESSFUL

4.查询AUD$

SQL>selectreturncode,action#,userid,userhost,terminal,timestamp

fromaud$

RETURNCODEACTION#USERIDUSERHOSTTERMINAL

1017100SCOTTWPRATA-BR

1017100SCOTTWPRATA-BR

1017100SCOTTWPRATA-BR

ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。

可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:

createorreplaceprocedureAuditLogin(SinceVarchar2,TimesPLS_Integer)

is

USER_IDVARCHAR2(20);

cursorclisSPIpct.nsprid,count(♦)frnmsys.and$whararatiirnccda='1017'and

timestamp#>=to_date(Since,'yyyy-nm-dd*)

groupbyuserid;

cursorC2ISSelectuserhost,terminal,TO_CHAR(timestamptt,rYYYY-MM-DD:HH24:MI:SS')

fromsys.aud$WHEREreturncode='1017*andtimestamp#>=to_date(Since,'yyyy-mm-ddr)AND

USERID=USER_ID;

ctPLS_INTEGER;

V_USERHOSTVARCHAR2(40);

V_TERMINALVARCHAR(40);

V.DATEVARCHAR2(40);

BEGIN

OPENCl;

dbms_output.enable(1024000);

LOOP

FETCHClINTOUSER_ID,CT;

EXITWHENC1%NOTFOUND;

IF(CT>=TIMES)THEN

DBMS_OUTPUT.PUT_LINE(1USERBROKENALARM:”|USER_ID);

OPENC2;

LOOP

FETCHC2INTOV_USERhOST,V_TERMINAL,V_DATE;

1r

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

EXITWHENC2%NOTFOUND;

ENDLOOP;

closec2;

ENDIF;

ENDLOOP;

closecl;

END;

/

一下是执行结果:

SQL>setserveroutputon;

SQL>executeauditloginC2004-01-01',2);

USERBROKENALARM: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:ll:09:29

HOST:,TERM:XUJLTIME:2004-09-22:U:09:29

PL/SQL过程已成功完成。

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

由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把A

叩$移动到其他的表空间上。可以使用下面的语句来进行移动:

sql>connect/assysdba;

sql>altertableaud$movetablespace<newtablespace>;

sql>altarindpxT_and1rAhuiIdnnlinptahlAspactA〈nawt.ablAspacA>;

SQL>altertableaudit$movetablespace<newtablespace>;

SQL>alterindexi_auditrebuildonlinetablespace<newtablespace>;

SQL>altertableaudit_actionsmovetablespace<newtablespace);

SQL>alterindexi_audit_actionsrebuildonlinetablespace<newtablespace>;

三、细粒度审计:

细粒度审计(FGA)(通过0racle9/引入)可以理解为“基于政策的审计〃。与标准的审计功

能相反,FGA可用于指定生成审计记录必需的条件:

FGA政策通过使用“dbms_fga〃程序包以编程方式绑定到对象(表、视图)。类似于用于通过VPD

("dbms_rls")进行访问庭制的程序包,它允许您创立任何需要的条件,例如:仅当以下条件为真

时审计事件:

•在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。

•使用了公司网络外部的某个IP地址。

•选定或更新了特定列。

•使用了该列的特定值。

这将创立更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从Oracle数据库10g

开始,FGA支持在一个策略中使用“选择〃、”插入〃、”更新〃和"删除〃语句的任意组合。事

实上,绑定到表的FGA政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不

用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Mb

接口或通过SQL*Plus),其操作都会记录下来。

3.1使用细粒度审计:

L创立测试表:

createtableACCOUNT

(AACT_NOnumbernotnul1,

CUST_IDnumbernotnull,

BALANCEnumber(15,2)

):

2、添加审计谋略:

begin

[)BMS_FGA,I)ROP_POLICY(object_schema=>'TEST',

object_nair.e=>'ACCOUNT',

policy_nane=>'ACCOUNT_ACCESS');

end;

这段代码必须由具有执行程序包dbms.fga权限的用户来执行。建议应该建立一个专门的用户

来专门负责添加审计谋略。该过程有许多参数,具体含义如下:

OBJECTSCHEMA对其定义?FGA策略的表或视图的所有者

OBJECT_NAME表或视图的名称

POLICY_NAME策略的名称,由用户自定义一例如,ACCOUNTS_ACCESS

POLICY_TEXT在添加策略时指定的审计条件一例如,BALANCE>=11000

POLICY_COLUMN审计列—例如,BALANCE

ENABLED如果启用则为YES,否则为N0

PF_SCHEMA拥有策略处理器模块的模式(如果存在)

PF_PACKAGE处理器模块的程序包名称(如果存在)

PF.FUNCTION处理器模块的过程名称(如果存在)

3、在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:

select*frombank,accounts;

审计爱索记录此操作。可以使用以下语句查看线索:

selecttimestamp,

db_user,

os_user,

object_schema,

object_name,

sql_text

fromdbafgaaudittrail;

TIMESTAMPDB_USEROS.USEROBJECTOBJECTNSQL_TEX7

26-MAR-10TESTanandaTESTACCOUNTselect*fromaccount

注意名为DBA_FGA_AUD1T_TRA1L的新视图,它记录细粒度的访问信息。其中显示了审计事件

的时间标记、查询着的薪据库房户ID、操作系统用户ID、查询中所使用表的名称和所有者,最后

还有瑜切的查询语句。

32审计歹和审计条件•

默认情况下会对被审计对象的所有列开启审计,当任何一列被访问时都会纪录一条审计信息,

这在现实情况下不太常见,因为这样会使审计信息表增长过快造成存储空间的压力,因此通常都会

设置审计条件,当条件触发时再发起审计。例如我们可以对Account表的Balance列谀置审计条件,

当访问该列并触发审计条件时才进行审计。如下所示:

begin

dbms_fga.add_policy(

object_schema=>,TEST,,

object_name=>*ACCOUNT,,

policy_name=>'ACCOUNT_ACCESS',

audit_column=>1BALANCE1,

audit_condition=>1BALANCE>=11000,

);

end;

该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有

如下不同审计状态:

SQL语句审计状态

进行审计。用户选择了在添加策略时所指定的审计列

selectbalancefromaccount;

BALANCEo

进行审计。即使用户没有明确指定列BALANCE,*也隐

select*fromaccount;

含地选择了它。

selectcust_idfromaccountwhere进行审计。即使用户没有明确指定列BALANCE,where子

balance<10000;句也隐含地选择了它。

selectcust_idfromaccount;不进行审计。用户没有选择列BALANCEo

selectcount(*)fromaccount;不进行审计。用户没有明确或隐含地选择列BALANCEo

3.3优化器模式:

FGA需要基于本钱的优化(CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进

行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导工程出现的可能性。为使FGA

正确地工作,除了在实例级启用CBO之外,在SQL语句中应该没有规则暗示(hint),并且必须

至少使用评估选项对查询中的所有表进行分析。

34管理FGA策略:

要删除策略,您可以使用以下语句:

begin

dbms_fga.drop_policy(

object_schema=>*TEST*,

object_name=>rACCOUNT',

policy_name=>rACCOUNT_ACCESS'

);

end;

对于更改策略而言,没有随取随用的解决方案。要更改策咚中的任何参数,必须删除策略,再使用

更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示:

begin

dbms_fga.enable_policy(

object_schema=>'TEST',

object_name=>rACCOUNT',

policy_name=>rACCOUNT.ACCESS1,

pnahlA=>FALSE

);

end;

若要重新启用它,可使用同一函数,只需将参数enable设置为TRUE。

3.5FGA数据字典视图:

FGA策略的定义位于数据字典视图DBA_AUDTT_POLTCTES中。该市途中各列含义如下:

SESSION_TD审计会话标识符;与V$SESSION视图中的会话标识符不同

TIMESTAMP审计记录生成时的时间标记

DBJJSER发出查询的数据库用户

OS.USER操作系统用户

USERHOST用户连接的机器的主机名

CLIENT.ID客户标识符(如果由对打包过程dbms_session.set_identifier的调用所设置)

EXT_NAME外部认证的客户名称,如LDAP用户

OBJECT_SCHEMA对该表的访问触发了审计的表所有者

OBJECTNAME对该表的SELECT操作触发了审计的表名称

触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。

POLICY.NAME

在此情况下,该列显示哪些行是由哪个策略插入的。)

SCN记录了审计的Oracle系统更改号

SQL_TEXT由用户提交的SQL语句

SQLBIND由SQL语句使用的绑定变量(如果存在)

3.6视图和FGA:

假定在ACCOUNTS表上定义视图VW_ACCOUNT如下:

createviewvwaccountasselect*fromaccount;

现在,如果用户从视图中而不是从表中进行选择:

select*fromvw_account;

您将看到以下审计线索:

selectobject_name,sql_textfromdba_fga_audit_trail;

OBJECT_NAMESQL_TEXT

ACCOUNTselect*fromvw_account

注意,是基表名称而不是视图名称出现在OBJECT_NAME列中,因为视图中的选择是从基表中进行

选择。但是,SQL_TEXT列记录了用户提交的实际语句。

如果只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称

而不是表的名称传递给打包的过程dbms_fga.add_policy中的参数object_namc,可以完成这项

工作。随后DBA_FGA_AUDIT_TRAIL中的OBJECT_NAME列将显示视图的名称,并且不会出现有关表

访问的附加记录。

3.7其它用途:

除了记录对表的选择访问,FGA还可用于某些其它情况:

•可以对数据仓库使用FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于

方案索引。不需要到V$SQL视图去获取这些信息。即使SQL语句已经超出了V$SQL的期

限,在FGA审计线索中将会始终提供它。

•由于FGA捕获绑定变量.它可以帮助了解绑定变量值的模式,这有助于设计直方图集合等。

•可以向审计者或DBA发送警告,这有助于跟踪恶意应用程序。

由于FGA可以作为SELECT语句的触发器,可以在需要这种功能的任何时候使用它。

3.8FGA在10G中的增强:

3.8.1对所有DML的审计:

在9i中FGA只能对Select语句进行审计,而不能对其他DML语句(Update>Delete^Insert)

进行审计,如果想对其他DML语句进行审计那么只能采取数据库处发起的形式来实现。在10G中实

现了对所有DML语句的审计,如下所示:

begin

dbms_fga.add_policjr(

object_schema=>'TEST,

object_name=>'ACCOUNT,

policyname=>'ACCOUNTACCESS',

audit_column=>'BALANCE',

audit_condition=>'BALANCE>=3000',

statement!ypes=>'INSERT,UPDATE,DELETE,SELECT'

);

end;

通过statement_types=>'INSERT,UPDATE,DELETE,SELECT参数制定了新的策略,该策略可以对Select之外的

所有EML操作进行审计。因此根据新的审计条件和审计谋略会有如下不同情况:

第1种情况

之前:BALANCE=1000

用户发出:

updateaccountsetbalance=1200whereACCOL'NT_NO=....

旧的和新的balance都小于3,000,审计条件不满足;因此这条语句将不会被审计。

第2种情况

之前:BALANCE=1000

用户发出:

updateaccountsetbalance=3200whereACCOUNT_NO=....

新的balance大于3,000,审计条件满足;因此这条语句将会被审计。

第3种情况

之前:BALANCE=3200

用户发出:

updateaccountsetbalance=1200whereACCOUNTING=....

新的balance小于3,000,但旧的balance大于3,000。因此审计条件满足,这条语句将被审计。

第4种情况

用户插入一行,其中有BALANCE<3000o

insertintoaccountvalues(9999,1200,‘X’);

因为balance1,200不满足审计条件,所以这条语句不被审计。如果balance列大于或等于

3,000,它将被审计。

第5种情况

用户插入一行,其中balance的值为空。

insertintoaccount(account_no,status)values(9997,,X*);

因为balance为空,该列没有任何默认值,所以审计条件不满足(比较NULL>=3000结果为

FALSE),这条语句不会被审计。重要重点事项:假设该列有一个大于3,000的默认值时,这条

语句仍然不会被审计,即使插入行的balance列值大于3000o注意对于DML语句的审计是由一

个自动事务插入的;即使回滚DML语句的操作,审计记录也将存在不会跟着回滚。

3.8.2制定相关的列策略:

在表ACCOUNT上定义的一个策略,如下:

begin

dbms_fga.add_polic5^(

object_schema=>'TEST',

objectname=>rACCOUNT\

policy_name=>rACCOUNT_SEL',

auditcolumn=>rACCOUNT_NO,BALANCE,,

audi"condition=>rBALANCE>=3000',

statcment_typcs=>'SELECT'

);

end;

在某些情况下,列的组合可能很重要,而不是某个特定的列。以上策略是在ACC0UNT_N0和BALANCE

上定义的。那么如果用户发出以下语句:

selectbalancefromaccountswhereaccount_no=9995;

这条语句将被审计,因为balance列被选中,且余额为3,200,大于3,000,满足审计条件。

如果一个用户想查出在银行的总余额,他发出:

selectsum(balance)fromaccount;

这条查询几乎没什么害处;它不明确指出帐户所有者和帐户余额。因此平安策略可能不会要求审计

这条查询。不过,这条查询

selectbalancefromaccountwhereaccountno=9995

必须被审计;因为它明确地指定了一个帐户。默认地,所有语句都被审计(无论使用了什么样的列

组合)。这将创立大量不需要的审计线索工程,并可能带天一些空间限制问题。为了限制它们,您

可以指定仅当在查询中使用了希望的列组合时才开始审计。当定义策略时,您可以使用一个新的参

数:

audit_co1umn_opts=>DBMS_FGA.ALL_COLUMNS

这个参数将使策略仅当列ACCOUNT_NO和BALANCE在查询中都被访问时才创立审计设索工程。例

如,以下查询将产生一个审计线索工程。

selectaccount_no,balancefromaccount;

但这条查询不会产生审计线索工程。

selectaccount_nofromaccount;

使用这个参数将把审计的数量限制在一个更易管理的大小。如果希望采用默认的行为一即任意列

被选中时都进行审计,那么您可以对同一参数的使用不同值。

audit_column_opts=>DBMS_FGA.ANY_COLUMNS

3.8.3与标准审计的结合:

通过制定如下审计谋略实现标准审计与细粒度审计的结合

begin

dbms_fga.add_policy(

objectschema=>'TEST',

object_name=>'ACCOUNT',

policy_name=>,ACCOUNT_SEL,,

audit_column=>'ACCOUNT_NO,BALANCE1,

audit_condition=>'BALANCE>=3000\

statementtypes=>'SELECT1,

audit_column_opts=>DBMS_FGA.ALL_COLUMNS,

audittrail=>DB

);

end;

通过指定audit_trail=>DB参数实现在细粒度审计时开启标准审计。在Oracl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论