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

下载本文档

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

文档简介

1、Oracle审计功能详解一、 审计分类:Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。二、 标准审计:2.1 分类:在ORACLE中分别支持以下三种标准审计类型:u 

2、;         语句审计,对某种类型的SQL语句审计,不指定结构或对象。u          特权审计,对执行相应动作的系统特权的使用审计。u          对象审计,对一特殊模式对象上的指定语句的审计。这三种标准审计类型分别对如下3方面进行审计:u       

3、;   审计语句的成功执行、不成功执行,或者其两者。u          对每一用户会话审计语句执行一次或者对语句每次执行审计一次。u          对全部用户或指定用户的活动的审计。当数据库的审计功能打开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的

4、AUD$表中。2.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:是默认值,不做审计;

5、DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;DB,Extended:与DB一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND;OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;XML:10g里新增,将audit trail以XML格式记录在操作系统文件中;XML,Extended:与XML一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND注:这两个参数是static参数,需要重新启动数据库才能生效。2.3 审计级别当开启

6、审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、object(对象)。Statement:按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。用法:AUDIT sql_statement_clause BY SESSION | ACCESS WHENEVER NOT SUCCESSFUL;表1列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计

7、该列表中的任何语句。然而,表2中的语句类型在启用审计时不属于all类别;必须在audit命令中显式地指定它们。表1 包括在ALL类别中的可审计语句语 句 选 项SQL操作ALTER SYSTEM所有ALTER SYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终止用户会话CLUSTERCREATE、ALTER、DROP或TRUNCATE集群CONTEXTCREATE CONTEXT或DROP CONTEXTDATABASE LINKCREATE或DROP数据库链接DIMENSIONCREATE、ALTER或DROP维数DIRECTORYCREATE或DROP目录INDEXC

8、REATE、ALTER或DROP索引MATERIALIZED VIEWCREATE、ALTER或DROP物化视图NOT EXISTS由于不存在的引用对象而造成的SQL语句的失败PROCEDURECREATE或DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE BODY或PROCEDUREPROFILECREATE、ALTER或DROP配置文件PUBLIC DATABASE LINKCREATE或DROP公有数据库链接PUBLIC SYNONYMCREATE或DROP公有同义词ROLECREATE、ALTER、DROP或SET角色ROLLBACK SEGMENTCREAT

9、E、ALTER或DROP回滚段SEQUENCECREATE或DROP序列SESSION登录和退出SYNONYMCREATE或DROP同义词SYSTEM AUDIT系统权限的AUDIT或NOAUDITSYSTEM GRANTGRANT或REVOKE系统权限和角色TABLECREATE、DROP或TRUNCATE表TABLESPACECREATE、ALTER或DROP表空间TRIGGERCREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLETYPECREATE、ALTER和DROP类型以及

10、类型主体USERCREATE、ALTER或DROP用户VIEWCREATE或DROP视图表2 显式指定的语句类型语 句 选 项SQL 操 作ALTER SEQUENCE任何ALTER SEQUENCE命令ALTER TABLE任何ALTER TABLE命令COMMENT TABLE添加注释到表、视图、物化视图或它们中的任何列DELETE TABLE删除表或视图中的行EXECUTE PROCEDURE执行程序包中的过程、函数或任何变量或游标GRANT DIRECTORYGRANT或REVOKE DIRECTORY对象上的权限GRANT PROCEDUREGRANT或REVOKE过程、函数或程序包

11、上的权限GRANT SEQUENCEGRANT或REVOKE序列上的权限GRANT TABLEGRANT或REVOKE表、视图或物化视图上的权限GRANT TYPEGRANT或REVOKE TYPE上的权限INSERT TABLEINSERT INTO表或视图LOCK TABLE表或视图上的LOCK TABLE命令SELECT SEQUENCE引用序列的CURRVAL或NEXTVAL的任何命令SELECT TABLESELECT FROM表、视图或物化视图UPDATE TABLE在表或视图上执行UPDATEPrivilege:按权限来审计,当用户使用了该权限则被审计,如执行grant sele

12、ct any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注重用户是自己表的所有者,所以用户访问自己的表不会被审计。用法:审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限Object:按对象审计,只审计on要害字指定对象的相关操作,如aduit alter,delete,drop,insert on cmy.t by scott; 这里会对cmy用户的

13、t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。注重Oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on default子句来实现自动审计,比如执行audit drop on default by access;后, 对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比trigger可以对schema的DDL进行“审计”,这个功能稍显不足。用法:AUDIT schema_object_clause BY S

14、ESSION | ACCESS WHENEVER NOT SUCCESSFUL;schema_object_clause指定对象访问的类型以及访问的对象。可以审计特定对象上14种不同的操作类型,下表中列出了这些操作。对 象 选 项说    明ALTER改变表、序列或物化视图AUDIT审计任何对象上的命令COMMENT添加注释到表、视图或物化视图DELETE从表、视图或物化视图中删除行EXECUTE执行过程、函数或程序包FLASHBACK执行表或视图上的闪回操作GRANT授予任何类型对象上的权限INDEX创建表或物化视图上的索引INSERT将行插入表、视图或物化视图

15、中LOCK锁定表、视图或物化视图READ对DIRECTORY对象的内容执行读操作RENAME重命名表、视图或过程SELECT从表、视图、序列或物化视图中选择行UPDATE更新表、视图或物化视图2.4 审计的一些其他选项by access / by session:by access 每一个被审计的操作都会生成一条audit trail。by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。whenever not successful:whenever successful 操作成功(dba_audit_trail中returncode字

16、段为0) 才审计,whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。2.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,

17、dba_priv_audit_opts视图功能与之类似all_def_audit_opts:用来查看数据库用on default子句设置了哪些默认对象审计。1. SYS.AUD$审计功能的底层视图,如果需要对数据进行删除,只需要对aud$视图进行删除既可,其他视图里的数据都是由aud$所得.2. DBA_AUDIT_EXISTS列出audit not exists和audit exists产生的审计跟踪,我们默认的都是audit exists.3. DBA_AUDIT_TRAIL可以在里面查处所有审计所跟踪的信息,保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图

18、dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一个子集。4. DBA_AUDIT_OBJECT可以查询所有对象跟踪信息.(例如,对grant,revoke等不记录),信息完全包含于dba_audit_trail5. DBA_AUDIT_SESSION所得到的数据都是有关logon或者logoff的信息.6. DBA_AUDIT_STATEMENT列出grant ,revoke ,audit ,noaudit ,alter system语句的审计跟踪信息.7. DBA_PRIV_AUDIT_OPT

19、S通过系统和由用户审计的当前系统特权8. DBA_OBJ_AUDIT_OPTS可以查询到所有用户所有对象的审计选项9. DB_STMT_AUDIT_OPTS可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似10. ALL_DEF_AUDIT_OPTS用来查看数据库用on default子句设置了哪些默认对象审计11. AUDIT_ACTIONS可以查询出在aud$等视图中actions列的含义12. SYSTEM_PRIVILEGE_MA

20、P可以查询出aud$等视图中priv$used列的含义(注意前面加'-')13. STMT_AUDIT_OPTION_MAP 审计选项类型代码14. DBA_AUDIT_POLICIES审计POLICIES15. DBA_COMMON_AUDIT_TRAIL标准审计+细粒度审计合并视图16. DBA_FGA_AUDIT_TRAIL细粒度审计策略的审计跟踪条目2.6 取消审计将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful

21、;2.7设置ORACLE标准审计:下列步骤可以设置ORACLE的标准审计功能: 1. 修改初始化参数文件(init<sid>.ora)如果使用服务器参数文件使用alter system set <parameter>=<value> scope=spfile|both,详情参照1.1节中关于参数文件的介绍),设置 AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下: l  DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 SYS.AUD$ 表中l DB_EXTENDED:具有DB/TRUE的功能,另外记录AUD$

22、的SQLBIND和SQLTEXT字段 l  OS:启动审计功能,并把审计结果存放在操作系统的审计信息中 l  XML:启动审计功能,并且把审计结果以XML格式存放在操作系统的审计信息中l  XML_EXTENDED:具有XML的功能,另外会记录SQLBIND和SQLTEXT信息 l  NONE/FALSE:关闭审计功能 2.设置AUDIT_TRAIL参数:如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST。如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE_D

23、EST所指定的目录下,并且文件名包含进程的PID。 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 审计表安装在SY

24、STEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。4. 关闭并重启数据库 5. 设置所需要的审计信息 下面是一个例子 SQL> connect system/manager SQL> grant audit system to scott; SQL> connect scott/tiger SQL> audit session; 停止审计: SQL> noaudit session; 通常设置了标准审计后都是通过Audit语句开启审计,使用noaudit语句收回审计。如下所示:对修改SC表结构或数据的操作进行审计可使用如下语句:AUDIE AL

25、TER,UPDATE ON SC;取消对SC表的一切审计可使用如下语句:NOAUDIT ALL ON SC;2.8设置审计的实例(对试图尝试口令的访问的审计):以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:1. 修改审计相关参数(参照上面介绍的方法) 2. 重启数据库 3. 设置审计信息 SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL 4. 查询AUD$ SQL> select returncode, action#, userid, userhost, terminal,timestamp from

26、 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)isUSE

27、R_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='10

28、17' 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_

29、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>

30、;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:29PL/SQL 过程已成功完成。2.9将审计相关的表移动到其他表空间:由于AUD$表等审

31、计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:SQL> connect / as sysdba;SQL> alter table aud$ move tablespace <new tablespace>SQL> alter index I_aud1 rebuild online tablespace <new tablespace>SQL> alter table audit$ move tablespace <new tablesp

32、ace>SQL> alter index i_audit rebuild online tablespace <new tablespace>SQL> alter table audit_actions move tablespace <new tablespace>SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>2.10审计语句样例多层环境下的审计:appserve-应用服务器,jackson-clientAUDIT SELECT

33、TABLE BY appserve ON BEHALF OF jackson;审计连接或断开连接: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;对象审

34、计: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; - 取

35、消所有权限审计NOAUDIT ALL ON DEFAULT; - 取消所有对象审计2.11清除审计信息DELETE FROM SYS.AUD$;TRUNCATE TABLE SYS.AUD$;DELETE FROM SYS.AUD$ WHERE obj$name='EMP'三、 细粒度审计: 细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为“基于政策的审计”。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:FGA 政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD ("dbms_rls&quo

36、t;) 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件: · 在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。 · 使用了公司网络外部的某个 IP 地址。 · 选定或更新了特定列。 · 使用了该列的特定值。 这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 Oracle 数据库 10g 开始,FGA 支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的 FGA 政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次

37、次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web 接口或通过 SQL*Plus),其操作都会记录下来。细粒度审计的程序包DBMS_FGA具有4个过程: ADD_POLICY   -添加使用谓词和审计列的审计策略DROP_POLICY  -删除审计策略DISABLE_POLICY  -禁用审计策略,但保留与表或视图关联的策略ENABLE_POLICY  -启用策略3.1 使用细粒度审计: 1、创建测试表: create table ACCOUNT(AACT_NO number not null, CUST_ID number

38、not null, BALANCE number(15,2); 2、添加审计策略: begin DBMS_FGA.ADD_POLICY(object_schema => 'TEST', object_name => 'ACCOUNT', policy_name => 'ACCOUNT_ACCESS');end;这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:OBJECT_SCHEMA对其定义了 FGA 策略的表或视图的所有者OBJ

39、ECT_NAME表或视图的名称POLICY_NAME策略的名称,由用户自定义 例如,ACCOUNTS_ACCESSPOLICY_TEXT在添加策略时指定的审计条件 例如,BALANCE >= 11000POLICY_COLUMN审计列 例如,BALANCEENABLED如果启用则为 YES,否则为 NO PF_SCHEMA拥有策略处理器模块的模式(如果存在)PF_PACKAGE处理器模块的程序包名称(如果存在)PF_FUNCTION处理器模块的过程名称(如果存在)3、在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示: select * from bank.accounts;

40、审计线索记录此操作。可以使用以下语句查看线索: select timestamp, db_user,os_user,object_schema,object_name,sql_textfrom dba_fga_audit_trail;TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT- - - - - -26-MAR-10 TEST ananda TEST ACCOUNT select * from account注意名为 DBA_FGA_AUDIT_TRAIL 的新视图,它记录细粒度的访问信息。其中显示了审计事件的时间标记、查询者的数据库用

41、户 ID、操作系统用户 ID、查询中所使用表的名称和所有者,最后还有确切的查询语句。3.2 审计列和审计条件:默认情况下会对被审计对象的所有列开启审计,当任何一列被访问时都会纪录一条审计信息,这在现实情况下不太常见,因为这样会使审计信息表增长过快造成存储空间的压力,因此通常都会设置审计条件,当条件触发时再发起审计。例如我们可以对Account表的Balance列设置审计条件,当访问该列并触发审计条件时才进行审计。如下所示:begindbms_fga.add_policy (object_schema=>'TEST',object_name=>'ACCOUNT

42、',policy_name=>'ACCOUNT_ACCESS',audit_column => 'BALANCE',audit_condition => 'BALANCE >= 11000' );end;该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有如下不同审计状态:SQL 语句审计状态select balance from account;进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。select * from account;进行审计。即使用户

43、没有明确指定列 BALANCE,* 也隐含地选择了它。select cust_id from account where balance < 10000;进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。select cust_id from account;不进行审计。用户没有选择列 BALANCE。select count(*) from account;不进行审计。用户没有明确或隐含地选择列 BALANCE。更详细的设置策略如下:DBMS_FGA.ADD_POLICY (  object_schema VARCHAR2,  -s

44、chema的名字,表或视图的拥有者  object_name VARCHAR2, -对象名,表或视图的名字  policy_name VARCHAR2,  -审计策略名字,它和数据库中其他对象一样,需要有一个不重复,唯一的名字  audit_condition VARCHAR2,  -筛选条件比如可以选择哪些符合条件的操作被记录  audit_column VARCHAR2, -表中的某一列,可以只记录对表中某一列的操作.如果不指定表示审计所有的列  handler_schema VARCHAR2,  -是下面的h

45、andler_module的拥有者,其实也只能是创建policy的用户,而上面的object_schema可以是任意用户  handler_module VARCHAR2,-可以是一个一个存储过程或函数,但监测到任何一条符合条件的操作时执行它.  enable BOOLEAN,  -true 或false表示policy是开启或关闭状态,如果是false表示不进行审计  statement_types VARCHAR2, -表示哪些操作将被审计,可以填上select,insert,update,delete中的一个或几个  audit_trai

46、l BINARY_INTEGER IN DEFAULT,-有参数db,xml表示审计到的信息保存到数据库中或是以xml文件形式保存到磁盘上  audit_column_opts BINARY_INTEGER IN DEFAULT); -这个选项其实只有在audt_column中指定了某列时才起作用.它有any_columns,all_columns两个选项假如表中有eno,ename两列,并在audit_column中指定了这两列,那么选any_columns表示只要操作其中的任意一列都将被记录,而这里指定all_columns的话是说只有一个sql语句同时操作了这两列才被记录3.3

47、优化器模式:FGA 需要基于成本的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO 之外,在 SQL 语句中应该没有规则暗示(hint),并且必须至少使用评估选项对查询中的所有表进行分析。3.4管理 FGA 策略:要删除策略,您可以使用以下语句: begindbms_fga.drop_policy (object_schema => 'TEST',object_name => 'ACCOUNT',po

48、licy_name => 'ACCOUNT_ACCESS' );end;对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示:begindbms_fga.enable_policy (object_schema => 'TEST',object_name => 'ACCOUNT',policy_name => 'ACCOUNT_ACCESS',enable => FALSE );end;若要重新启用它,可使用同一

49、函数,只需将参数 enable 设置为 TRUE。3.5 FGA 数据字典视图:FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。该市途中各列含义如下:SESSION_ID审计会话标识符;与 V$SESSION 视图中的会话标识符不同TIMESTAMP审计记录生成时的时间标记DB_USER发出查询的数据库用户OS_USER操作系统用户USERHOST用户连接的机器的主机名CLIENT_ID客户标识符(如果由对打包过程 dbms_session.set_identifier 的调用所设置)EXT_NAME外部认证的客户名称,如 LDAP 用户OBJECT_SCHEMA

50、对该表的访问触发了审计的表所有者OBJECT_NAME对该表的 SELECT 操作触发了审计的表名称POLICY_NAME触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪些行是由哪个策略插入的。)SCN记录了审计的 Oracle 系统更改号SQL_TEXT由用户提交的 SQL 语句 SQL_BIND由 SQL 语句使用的绑定变量(如果存在)3.6视图和 FGA:假定在 ACCOUNTS 表上定义视图 VW_ACCOUNT 如下: create view vw_account as select * from account;现在,如果用户从视图中而不

51、是从表中进行选择: select * from vw_account;您将看到以下审计线索: select object_name, sql_text from dba_fga_audit_trail;OBJECT_NAME SQL_TEXT- -ACCOUNT select * from vw_account注意,是基表名称而不是视图名称出现在 OBJECT_NAME 列中,因为视图中的选择是从基表中进行选择。但是,SQL_TEXT 列记录了用户提交的实际语句。如果只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.

52、add_policy 中的参数 object_name,可以完成这项工作。随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。3.7 其它用途: 除了记录对表的选择访问,FGA 还可用于某些其它情况: · 可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。 · 由于 FGA 捕获绑定变量,它可以帮助了解绑定变量值的模式,这有助

53、于设计直方图集合等。 · 可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。 由于 FGA 可以作为 SELECT 语句的触发器,可以在需要这种功能的任何时候使用它。3.8 FGA在10G中的增强:3.8.1 对所有DML的审计: 在9i中FGA只能对Select语句进行审计,而不能对其他DML语句(Update、Delete、Insert)进行审计,如果想对其他DML语句进行审计那么只能采取数据库处发起的形式来实现。在10G中实现了对所有DML语句的审计,如下所示:begin dbms_fga.add_policy ( object_schema => 'T

54、EST', object_name => 'ACCOUNT', policy_name => 'ACCOUNT_ACCESS', audit_column => 'BALANCE', audit_condition => 'BALANCE >= 3000', statement_types => 'INSERT, UPDATE, DELETE, SELECT' );end;通过statement_types => 'INSERT, UPDATE, DELET

55、E, SELECT'参数制定了新的策略,该策略可以对Select之外的所有DML操作进行审计。因此根据新的审计条件和审计策略会有如下不同情况:第 1 种情况 之前:BALANCE = 1000 用户发出: update account set balance = 1200 where ACCOUNT_NO = .旧的和新的 balance 都小于 3,000,审计条件不满足;因此这条语句将不会被审计。第 2 种情况 之前:BALANCE = 1000 用户发出: update account set balance = 3200 where ACCOUNT_NO = .新的 balan

56、ce 大于 3,000,审计条件满足;因此这条语句将 会被审计。 第 3 种情况 之前:BALANCE = 3200 用户发出: update account set balance = 1200 where ACCOUNT_NO = .新的 balance 小于 3,000,但旧的 balance 大于 3,000。因此审计条件满足,这条语句将被审计。 第 4 种情况 用户插入一行,其中有 BALANCE < 3000。 insert into account values (9999,1200,'X');因为 balance 1,200 不满足审计条件,所以这条语句不

57、被审计。如果 balance 列大于或等于 3,000,它将被审计。 第 5 种情况 用户插入一行,其中 balance 的值为空。 insert into account (account_no, status) values (9997, 'X');因为 balance 为空,该列没有任何默认值,所以审计条件不满足(比较 NULL >= 3000 结果为 FALSE),这条语句不会被审计。重要注意事项:假设该列有一个大于 3,000 的默认值时,这条语句仍然不会被审计,即使插入行的 balance 列值大于 3000。 注意对于DML语句的审计是由一个自动事务插入的;即使回滚 DML语句的操作,审计记录也将存在不会跟着回滚。3.8.2制定相关的列策略:在表 ACCOUNT 上定义的一个策略,如下: begin dbms_fga.add_policy ( object_schem

温馨提示

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

评论

0/150

提交评论