Fine-Grianed Auditing

一、概述
     Fine-grained auditing精细审计是一种特殊的审计,比普通审计提供了更加精细的审计粒度。 它可以创建一个policy策略来定义促发审计的条件,这就使得可以监视满足某种条件的数据访问。
     一般来说,精细审计的策略是基于用户定义在表对象上的条件来决定审计的。在取数据时,当满足定义的条件时,这个查询就被审计(记录)

    精细审计创建一个更有意义的审计记录,其中只包含了你指定行为操作的审计。这也就排除了记录访问表时发生的所有没必要的信息,和普通审计相比有如下特点:
    1). It performs a Boolean condition check
          满足条件的语句才会被记录
     2).
It captures the SQL that triggered the audit
           可以同时捕获导致审计的SQL语句和相关的绑定变量(bind variables).
           注:只能从scalar类型的列里捕获数据,而不能从object类型的列里捕获数据,如:LOBs, user-defined column types.
     3).
It adds extra protection to sensitive columns
           可以审计敏感数据相关的特殊列,如工资。
     4).
It provides an event handler feature
           如:可以编写一个function来发送警告信息给安全管理员,由于被审计的列在深夜被更新了。
     5).
You do not need to set initialization parameters to enable fine-grained auditing
           并不需要初始化参数来开始或关闭精细审计。只要有DBMS_FGA包的执行权限就可以用ADD_POLICY, DELETE_POLICY, ENABLE_POLICY来管理精细审计策略。
    
    
注:
     1). 精细审计只支CBO(Cost-based optimization)。当使用基于RBO(rule-based optimization)的查询时,
精细审计在执行行过滤前会执行精细审计检查,这导致了没必要的触发器触发。
     2). 当前涉及到flashback query闪回查询的对象审计来自于闪回快照(flashback snapshot).

二 、 关于DBMS_FGA系统包
      1. 视图
       精细审计的记录被存储在SYS.FGA_LOG$表。可以查询DBA_FGA_AUDIT_TRAIL视图来查看精细审计的策略policy。
       DBA_COMMON_AUDIT_TRAIL视图包括标准的审计记录和精细审计的记录。除此外,可以查看V$XML_AUDIT_TRAIL来查看存储在XML文件里的审计记录。

       2. 包操作
       2.1 添加策略ADD_POLICY
                 DBMS_FGA.ADD_POLICY(
                 object_schema      VARCHAR2,
                 object_name        VARCHAR2,
                 policy_name        VARCHAR2,
                 audit_condition    VARCHAR2,
                 audit_column       VARCHAR2,
                 handler_schema     VARCHAR2,
                 handler_module     VARCHAR2,
                 enable             BOOLEAN,
                 statement_types    VARCHAR2,
                 audit_trail        BINARY_INTEGER IN DEFAULT,
                 audit_column_opts  BINARY_INTEGER IN DEFAULT);
              以下是各个参数选项的说明:
             
              object_schema: 指定审计对象,如表名,视图名.
             
              object_name: 指定要审计的对象名.
             
              policy_name: 指定要创建的策略名.
             
              audit_condition: 指定一个boolean条件. 可以为NULL:如果想保证针对某列(audit_column)的行为(statement_types)一定生效,可以指定audit_condition为NULL,也相当于条件为TRUE。
             
              audit_column: 指定要审计的一列或多列(包括隐含列),如果为NULL或缺省的则审计所有列,可以通过audit_column_opts参数来控制是只审计指定的列还是所有列.
             
              handler_schema: 如果定义了当审计条件满足时发送一个警告, 指定包含event handler对象的名字.
             
              handler_module: 指定event handler的名字.
             
              enable: Enables 或 disables策略(true | false).缺省为enabled.
             
              statement_types: 指定要审计的SQL语句的类型(INSERT,UPDATE,DELETE). MERGE是由INSERT,UPDATE组合而来的,当执行MERGE时将分别插入满足条件的语句INSERT或UPDATE。
             
              audit_trail: 指定存储审计记录的位置(DB or XML). 也指定是否要产生 LSQLTEXT and LSQLBIND 在 FGA_LOG$表里.
             
              audit_column_opts: 如果在audit_column参数里指定了多列, 决定是审计多列还是指定的列。
              实例:
              audit_condition    => 'department_id = 50',
              audit_column       => 'salary,commission_pct',
              audit_column_opts   => DBMS_FGA.ANY_COLUMNS,
              audit_column_opts   => DBMS_FGA.ALL_COLUMNS,
     
     2.2  Enable & Disable精细审计策略:
               DBMS_FGA.DISABLE_POLICY(
                object_schema  VARCHAR2,
                object_name    VARCHAR2,
                policy_name    VARCHAR2 );
             例如:
             DBMS_FGA.DISABLE_POLICY(
               object_schema        => 'hr',
               object_name          => 'employees'
               policy_name          => 'chk_hr_employees');
            
             DBMS_FGA.ENABLE_POLICY(
               object_schema        => 'hr',
               object_name          => 'employees',
               policy_name          => 'chk_hr_employees'
               enable               => 'true');
       2.3 删除精细审计策略:
             例如:     
             DBMS_FGA.DROP_POLICY(
               object_schema      => 'hr',
               object_name        => 'employees',
               policy_name        => 'chk_hr_employees');

           如果要修改一个策略,必须先把它删除再创建新的。

3. Tutorial 实战演习
   
     第一步:
     创建用户并检查实例用户HR有效。
     1). sqlplus / as sysdba
    
     2). SQL> GRANT CREATE SESSION, DBA TO sysadmin_fga IDENTIFIED BY oracle;
           SQL> GRANT SELECT ON hr.employees TO sysadmin_fga;
           SQL> GRANT EXECUTE ON DBMS_FGA TO sysadmin_fga;
   
     3). 检查用户HR存在并可用
           SQL> SELECT username, account_status FROM DBA_USERS WHERE username='HR';
           SQL> ALTER USER hr account unlock identified by oracle;

     第二步: 创建一个表来存储警告信息和一个procedure来产生警告信息
           1). SQL> CONN sysadmin_fga/oracle
       
           2). 创建表emp_violations
             SQL>
             CREATE TABLE emp_violations (
              username VARCHAR(20),
              userhost VARCHAR(20),
              time TIMESTAMP);
            
             3). 创建存储过程
emp_violations_alert
             SQL>
             CREATE OR REPLACE PROCEDURE emp_violations_alert (
              hr_schema VARCHAR2,
              employees_table VARCHAR2,
              hr_policy VARCHAR2)
             AS
             BEGIN
              INSERT INTO sysadmin_fga.emp_violations (
              username, userhost, time)
              SELECT user, sys_context('userenv','terminal'), sysdate FROM DUAL;
             END emp_violations_alert;
             /

     第三步: 创建精细审计策略
     SQL>
           BEGIN
             DBMS_FGA.ADD_POLICY (
              object_schema      =>  'hr',
              object_name        =>  'employees',
              policy_name        =>  'chk_hr_emp',
              audit_condition    =>  'department_id = 50',
              audit_column       =>  'salary,commission_pct',
              handler_schema     =>  'sysadmin_fga',
              handler_module     =>  'emp_violations_alert',
              enable             =>   TRUE,
              statement_types    =>  'INSERT, UPDATE, SELECT, DELETE',
              audit_trail        =>   DBMS_FGA.XML + DBMS_FGA.EXTENDED,
              audit_column_opts  =>   DBMS_FGA.ANY_COLUMNS);
            END;
            /
      第四步: 测试警告信息
       1). 以HR用户登录并执行某些操作
            SQL> CONN HR/oracle
            SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;
           
        2). 以SYSTEM用户登录执行同样的操作
             
SQL> CONN SYSTEM/oracle
              SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;

      
        3). 以SYSADMIN_FGA用户登录查询emp_violations表
           
SQL> CONN SYSADMIN_FGA /oracle
            SQL> SELECT * FROM
emp_violations ;
      
        4). 由于指定的audit_trail => DBMS_FGA.XML + DBMS_FGA.EXTENDED, 所有可以在v$xml_audit_trail表里查到记录,而不能在DBA_FGA_AUDIT_TRAIL表里查到记录。
         SQL> select AUDIT_TYPE,OBJECT_SCHEMA, OBJECT_NAME, policy_name from v$xml_audit_trail;
         AUDIT_TYPE OBJECT_SCHEMA   OBJECT_NAME     POLICY_NAME
         ---------- --------------- --------------- ---------------
         2 HR              EMPLOYEES       CHK_HR_EMP
         2 HR              EMPLOYEES       CHK_HR_EMP

         SQL> SELECT * FROM
DBA_FGA_AUDIT_TRAIL WHERE policy_name='CHK_HR_EMP';
          no rows selected

         如果把
audit_trail改为 DBMS_FGA.DB + DBMS_FGA.EXTENDED,则可以在DBA_FGA_AUDIT_TRAIL和FGA_LOG$上查到记录。
         但DBA_COMMON_AUDIT_TRAIL 视图里包含了DB, XML存储的标准审计和精细审计记录。
        SQL> select OBJECT_SCHEMA, OBJECT_NAME, policy_name from dba_common_audit_trail where policy_name='CHK_HR_EMP';
       OBJECT_SCHEMA   OBJECT_NAME     POLICY_NAME
        --------------- --------------- ---------------
       HR              EMPLOYEES       CHK_HR_EMP
       HR              EMPLOYEES       CHK_HR_EMP

       第五步: 恢复环境
        删除SYSADMIN_FGA用户,LOCK HR用户。

fj.pngaudit_trail_type01.jpg

fj.pngaudit_trail_type02.jpg

fj.pngaudit_trail_type03.jpg

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

转载于:http://blog.itpub.net/9466564/viewspace-609570/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值