Oracle FGA细粒度审计——基于内容的数据库审计(一)

 

Oracle推出的标准Standard审计机制,提供了对于数据库对象DDL、特定User特定安全行为的审计Audit。标准审计可以帮助DBA和信息审计人员掌握生产系统各种重要变化信息,并且跟踪其行为。

 

但是很多时候,我们常常会遇到下列情况的需求:

 

ü        记录向用户user表插入记录detpno=10的操作日志信息;

ü        记录更改用户姓名字段取值的操作日志信息;

ü        记录删除日志记录的操作信息;

ü        记录每天下班之后,对信用卡字段进行检索的操作信息;

 

相对于标准审计机制,此类的审计需求灵活性强。很多时候,都是通过应用层面专门书写审计模块或者书写触发器来实现。这种方法可能出现审计遗漏或者带来性能问题。实际中,我们可以使用Oracle的细粒度审计FGAFine-grained Audit)来实现。

 

1、  FGA概述

 

Oracle Fine-Grained Audit(细粒度审计)是相对于传统Oracle审计功能而言的。我们可以借助FGA指定复杂的审计条件,根据条件的发生来引发审计动作。FGA是我们可以对访问数据的操作进行控制审计,使数据设计的层次达到最下层的数据层面。

 

FGA集中功能在数据表的DML操作审计上,对特定数据表的selectupdateinsertdelete操作。数据库用户的权限设置只能控制到是否允许进行操作的层面,而没有对一些更复杂的需求进行考量。

 

 

使用FGA通常需要如下步骤:

 

ü        确定FGA审计需求。要明确系统准确的审计需求,是进行FGA策略设置的第一个步骤。通常方式是对某张数据表进行某种类型操作的时候,在什么情况下需要进行审计记录;

ü        确定审计记录内容和方式。目前FGA支持DB保存和XML文件保存两种方式,要做出审计方案选择。同时,审计内容中有对SQL进行记录的选择项目,也要确认;

ü        使用DBMS_FGA包,定义审计策略。DBMS_FGA包是进行FGA审计策略定义、删除、启用禁用的工具包,归属sys schema。如果非sys用户执行,需要拥有execute权限;

ü        启动FGA策略,定期查看FGA$或者dba_fga_audit_trail视图中的审计结果;

 

下面使用一个实例来进行介绍说明。

 

2、  实验环境准备

 

scott用户下建立数据表T,其中包括一些实验字段和基础数据值。

 

 

SQL> select * from v$version  where rownum<2;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

 

SQL> create table t (id number, vid varchar2(10), dt date);

Table created

 

SQL> select * from t;

 

        ID VID        DT

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

         1 kfsd       2011-6-23 1:45:39

         2 dfse       2011-6-22 1:45:46

         3 ffdfse     2011-6-24 1:45:53

 

 

审计需求如下:

 

ü        对数据表T插入VID长度超过5的操作进行审计记录;

ü        修改数据表VID的所有操作;

ü        删除数据表TDT列为当前天之前日期记录的操作;

ü        在周末(周日、周六),检索VID数据的操作;

ü        审计记录保存在数据库中即可;

 

建立了环境,明确了需求,下面可以建立审计策略policy

 

3、设置审计规则策略

 

每个审计需求,都可以实现为一条审计策略policy。启用的policy可以在设置的时机进行激发,将审计信息记录下来。

 

Oracle FGA是使用dbms_fga程序包进行审计规则的建立,使用add_policy方法进行审计策略建立。下面是该方法的API接口。

 

  //dbms_fga包声明方法

  PROCEDURE add_policy(object_schema   IN VARCHAR2 := NULL,

                       object_name     IN VARCHAR2,

                       policy_name     IN VARCHAR2,

                       audit_condition IN VARCHAR2 := NULL,

                       audit_column    IN VARCHAR2 := NULL,

                       handler_schema  IN VARCHAR2 := NULL,

                       handler_module  IN VARCHAR2 := NULL,

                       enable          IN BOOLEAN  := TRUE,

                       statement_types IN VARCHAR2 := 'SELECT',

                       audit_trail     IN PLS_INTEGER  := 3,

                       audit_column_opts IN BINARY_INTEGER DEFAULT 0,

                       policy_owner    IN VARCHAR2 := NULL);

 

 

add_policy方法的可用参数很多,而且大部分参数带有默认值。下面表格进行概要说明。

 

参数名称

含义作用

默认值

object_schema

指定进行审计的对象所隶属的用户schema。如果没有指定,就认为是当前的用户下;

NULL

object_name

指定审计对象名称;

policy_name

FGA审计策略的名称;

audit_condition

设置进行审计活动的条件,该参数是一个布尔表达式。当进行statement_type操作的时候,进行条件验证,如果为True就表示进行审计;

NULL,作用和True相同;

audit_column

指定数据表的一个到多个column的名称,当statement_type操作涉及到该数据列的时候,就进行审计;

NULL,表示所有列;

handler_schema

在审计策略被激发的时候,可以调用一段程序代码。hander_schema表示程序代码的所属schema

NULL,如果设置上handler_module,表示当前的schema

handler_module

在审计策略被激发的时候,调用的程序代码名称;

 

enable

启动审计策略开关;

True

statement_type

审计操作动作,包括selectupdatedeleteinsert

select

audit_trail

设置审计内容层次和审计记录存放位置;Oracle目前支持DBXML文件两种方式,可以设置详细的SQL变量信息;

3,存放在数据库中;

audit_column_opt

audit_column中如果是多列的话,是所有列进行审计动作,还是任意列进行审计动作;

任意列进行审计动作;

policy_owner

设置的policy的所属owner

 

 

 

 

 

 

我们提交的审计需求,可以通过如下代码实现。

 

ü        对数据表T插入VID长度超过5的操作进行审计记录;

建立审计策略pol_vid_length

 

 

SQL> show user;

User is "SYS"

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_vid_length',

  5                        audit_condition => 'length(vid)>5',

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'INSERT');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路难点:审计条件点是在insert动作时进行的,额外条件是vid字段长度大于5

 

ü        修改数据表VID的所有操作;

 

建立策略pol_vid_modify

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_vid_modify',

  5                        audit_column => 'VID',

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'UPDATE');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路难点:只针对数据列vidupdate操作时,才会进行审计动作。

 

ü        删除数据表TDT列为当前天之前日期记录的操作;

创建审计策略pol_dt_del

 

 

SQL> begin

  2    dbms_fga.add_policy(object_schema => 'SCOTT',

  3                        object_name => 'T',

  4                        policy_name => 'pol_dt_del',

  5                        audit_condition => 'trunc(dt),

  6                        enable => True,

  7                        audit_trail => dbms_fga.DB_EXTENDED,

  8                        statement_types => 'DELETE');

  9  end;

 10  /

 

PL/SQL procedure successfully completed

 

 

思路难点:审计条件设置。

 

ü        在周末(周日、周六),检索VID数据的操作;

 

创建审计策略pol_vid_select

 

SQL> begin

  2     dbms_fga.add_policy(object_schema => 'SCOTT',

  3                          object_name => 'T',

  4                          policy_name => 'pol_vid_select',

  5                       audit_condition => 'to_char(sysdate,''Day'') in (''星期六'',''星期日'')',

  6                        enable => True,

  7                          audit_trail => dbms_fga.DB_EXTENDED,

  8                          statement_types => 'SELECT',

  9                          audit_column => 'VID');

 10   end;

 11  /

 

PL/SQL procedure successfully completed

 

 

从数据字典dba_audit_policies中,可以检查出设置的policy信息。

 

 

SQL> select object_name, policy_name, SEL, INS, UPD, DEL, AUDIT_TRAIL, POLICY_COLUMN_OPTIONS from dba_audit_policies;

 

OBJEC POLICY_NAME     SEL INS UPD DEL AUDIT_TRAIL  POLICY_COLUMN_OPTIONS

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

T     POL_VID_LENGTH  NO  YES NO  NO  DB+EXTENDED  ANY_COLUMNS

T     POL_VID_MODIFY  NO  NO  YES NO  DB+EXTENDED  ANY_COLUMNS

T     POL_DT_DEL      NO  NO  NO  YES DB+EXTENDED  ANY_COLUMNS

T     POL_VID_SELECT  YES NO  NO  NO  DB+EXTENDED  ANY_COLUMNS

 

 

对专门columns的审计信息,可以在dba_audit_policy_columns视图中检查到。

 

 

SQL> select * from dba_audit_policy_columns;

 

OBJECT_SCHEMA                  OBJEC POLICY_NAME     POLICY_COLUMN

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

SCOTT                          T     POL_VID_MODIFY  VID

 

 

 

下面通过实验来验证这些policy的应用情况。

 

 

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

转载于:http://blog.itpub.net/17203031/viewspace-700767/

你可能感兴趣的:(数据库)