Oracle推出的标准Standard审计机制,提供了对于数据库对象DDL、特定User特定安全行为的审计Audit。标准审计可以帮助DBA和信息审计人员掌握生产系统各种重要变化信息,并且跟踪其行为。
但是很多时候,我们常常会遇到下列情况的需求:
ü 记录向用户user表插入记录detpno=10的操作日志信息;
ü 记录更改用户姓名字段取值的操作日志信息;
ü 记录删除日志记录的操作信息;
ü 记录每天下班之后,对信用卡字段进行检索的操作信息;
相对于标准审计机制,此类的审计需求灵活性强。很多时候,都是通过应用层面专门书写审计模块或者书写触发器来实现。这种方法可能出现审计遗漏或者带来性能问题。实际中,我们可以使用Oracle的细粒度审计FGA(Fine-grained Audit)来实现。
1、 FGA概述
Oracle Fine-Grained Audit(细粒度审计)是相对于传统Oracle审计功能而言的。我们可以借助FGA指定复杂的审计条件,根据条件的发生来引发审计动作。FGA是我们可以对访问数据的操作进行控制审计,使数据设计的层次达到最下层的数据层面。
FGA集中功能在数据表的DML操作审计上,对特定数据表的select、update、insert和delete操作。数据库用户的权限设置只能控制到是否允许进行操作的层面,而没有对一些更复杂的需求进行考量。
使用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的所有操作;
ü 删除数据表T中DT列为当前天之前日期记录的操作;
ü 在周末(周日、周六),检索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 |
审计操作动作,包括select、update、delete和insert; |
select |
audit_trail |
设置审计内容层次和审计记录存放位置;Oracle目前支持DB和XML文件两种方式,可以设置详细的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
思路难点:只针对数据列vid的update操作时,才会进行审计动作。
ü 删除数据表T中DT列为当前天之前日期记录的操作;
创建审计策略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/