Chinaunix首页 | 论坛 | 博客
  • 博客访问: 575416
  • 博文数量: 89
  • 博客积分: 2383
  • 博客等级: 大尉
  • 技术积分: 970
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 23:02
个人简介

Scientific Linux是重新编译的Red Hat Enterprise Linux,由费米国家加速器实验室、欧洲核研究组织以及世界各地的大学和实验室共同开发。它旨在与Red Hat Enterprise Linux完全兼容,也强调自主方便的定制,用户可以根据自己的需求做相应修改,可以使用脚本或者Anaconda给自己定制最小化的安装模式。

文章分类

全部博文(89)

文章存档

2017年(1)

2016年(2)

2013年(2)

2012年(2)

2011年(16)

2010年(13)

2009年(46)

2008年(7)

我的朋友

分类: Oracle

2009-07-30 11:01:16

 
自己试验成功的例子:
sqlplus /nolog
conn /as sysdba
begin
dbms_fga.add_policy (
object_schema=>'system', ####方案名
object_name=>'nbstutb',  ####表名
policy_name=>'nbstu',    ####自定义的策略名
statement_types=> 'SELECT,DELETE,INSERT,UPDATE'
);
end;
/
 
清除试验数据:清除细粒审计的审计记录:
sqlplus /nolog
conn /as sysdba
delete sys.fga_log$;
commit;
 

ORACLE 10g细粒度审计

ORACLE 10g在细粒度审计(FGA)方面有了很大的扩展。9i的细粒度审计只支持SELECT语句,而10g提供了对DML的支持(支持InsertUpdateDeleteMerge不是一个独立的DML语句)。

10g的细粒度审计不仅仅能够对一个相关字段进行审计,可以对多个字段进行审计。在audit_column_opts中可以设置dbms_fga.all_columns或者dbms_fga.any_columns

审计日志可以把SQL文本和绑定变量写入LOB字段。如果审计的开销过大,可以关闭写入LOB的信息。

以下是一个10G DBMS_FGA.ADD_POLICY的例子,可以看出和9i的细粒度审计有很大的不同:

      dbms_fga.add_policy ( object_schema => 'PIET',  object_name => 'EMP', 

                            policy_name => 'MYPOLICY1', audit_condition => NULL,

                            audit_column => 'SALARY,COMMISSION_PCT',

                            audit_column_opts => DBMS_FGA.ALL_COLUMNS,

                            audit_trail => DBMS_FGA.DB_EXTENDED,

                            statement_types => 'INSERT, UPDATE');

     下面一个例子演示了对INSERT的审计过程:

 

     SQL> connect piet/piet

     Connected.

     SQL> CREATE TABLE EMP (

          EMPNO         NUMBER(4) NOT NULL,

          ENAME         VARCHAR2(10),

          JOB           VARCHAR2(9),

          MGR           NUMBER(4) CONSTRAINT EMP_SELF_KEY REFERENCES EMP (EMPNO),

          HIREDATE      DATE,

          SAL           NUMBER(7,2),

          COMM          NUMBER(7,2),

          DEPTNO        NUMBER(2) NOT NULL,

          CONSTRAINT EMP_PRIMARY_KEY PRIMARY KEY (EMPNO));

 

     Table created.

 

     SQL> INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'17-NOV-81',5000,NU;

     1 row created.

     SQL> grant all on emp to miller;

     Grant succeeded.

      SQL> conn system/manager   

      SQL> execute sys.DBMS_FGA.ADD_POLICY(-

             object_schema   => 'PIET', -

             object_name     => 'EMP', -

             policy_name     => 'mypolicy1', -

             audit_condition => 'sal < 1000', -

             audit_column    => 'comm', -

             enable          => TRUE,  -

             statement_types => 'INSERT');

 

     PL/SQL procedure successfully completed.

 

     SQL> select * from DBA_AUDIT_POLICY_COLUMNS ;

 

     OBJECT_SCHEMA                  OBJECT_NAME                                       

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

     POLICY_NAME                    POLICY_COLUMN                                    

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

     PIET                           EMP                                              

     MYPOLICY1                      COMM             

 

     SQL> select OBJECT_SCHEMA, OBJECT_NAME, POLICY_NAME, POLICY_TEXT,

                 POLICY_COLUMN, ENABLED, SEL, INS, UPD, DEL

          from DBA_AUDIT_POLICIES ;

 

     OBJECT_SCHEMA OBJECT_NAME POLICY_NAME POLICY_TEXT POLICY_COLUMN ENA SEL INS UPD DEL

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

     PIET          EMP         MYPOLICY1   sal < 1000  COMM          YES NO  YES NO  NO

 

     SQL> conn miller/miller

     Connected.

    以下的例子是一个插入一条sal小于1000的记录,符合审计的条件:

     SQL> INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

          VALUES(1000, 'SAM', 800, 15, 10);

     1 row created.

    以下的例子插入一条sal大于1000的记录,不符合审计的条件:

     SQL> INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO) 

          VALUES(3000, 'TOM', 20000, 1000, 20);

     1 row created.

 以下的插入语句不包含审计的字段,不进行审计:

     SQL> INSERT INTO PIET.EMP (EMPNO, ENAME, SAL,DEPTNO) 

          VALUES (1111, 'RAMA', 98,30);

     1 row created.

     SQL> commit;

     Commit complete.

    下面来验证一下审计的结果:

 conn system/manager

     SQL> select DB_USER,OBJECT_SCHEMA "SCHEMA",OBJECT_NAME,

                 POLICY_NAME,SQL_TEXT

          from dba_fga_audit_trail ;

 

 

     DB_USER  SCHEMA   OBJECT POLICY_NAME

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

     SQL_TEXT

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

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(1000, 'SAM', 800, 15, 10)

 以下的例子演示一个包含函数(sysdate,uid,user,round等)的审计:

         execute dbms_fga.drop_policy( object_schema => 'PIET',-

                              object_name => 'EMP',-

                              policy_name => 'mypolicy1');

      SQL> execute sys.DBMS_FGA.ADD_POLICY(-

             object_schema   => 'PIET', -

             object_name     => 'EMP', -

             policy_name     => 'mypolicy1', -

             audit_condition => 'round(sal, -2) >= 3000 ', -

             audit_column    => 'comm', -

             enable          => TRUE,  -

             statement_types => 'INSERT');

      PL/SQL procedure successfully completed.

 

     SQL> connect miller/miller

     Connected.

 

     SQL> INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

          VALUES(5000, 'RUDY', 2979, 15, 10);

     1 row created.

 

     SQL> commit;

     Commit complete.

    现在来验证一下审计结果: 

         conn system/manager

      SQL> select DB_USER,OBJECT_SCHEMA "SCHEMA",OBJECT_NAME,

                 POLICY_NAME,SQL_TEXT

          from dba_fga_audit_trail ;

      DB_USER  SCHEMA   OBJECT POLICY_NAME

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

     SQL_TEXT

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

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(1000, 'SAM', 800, 15, 10)

 

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(5000, 'RUDY', 2979, 15, 10)

 

 

以下是一个使用user函数的审计:

 

          execute dbms_fga.drop_policy( object_schema => 'PIET',-

                              object_name => 'EMP',-

                              policy_name => 'mypolicy1');

 

 

     SQL> execute sys.DBMS_FGA.ADD_POLICY(-

             object_schema   => 'PIET', -

             object_name     => 'EMP', -

             policy_name     => 'mypolicy1', -

             audit_condition => 'ename=USER ', -

             audit_column    => 'comm', -

             enable          => TRUE,  -

             statement_types => 'INSERT');

      PL/SQL procedure successfully completed.

      SQL> connect miller/miller

     Connected.

     SQL> conn piet/piet

     Connected.

     SQL> INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

          VALUES(89, 'MILLER', 800, 1000, 10);

      1 row created.

      SQL> commit;

     Commit complete.

 

     SQL> conn miller/miller

     Connected.

     SQL> INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

          VALUES(69, 'MILLER', 700, 700, 10);

     1 row created.

      SQL> commit;

     Commit complete.

    验证一下刚才的审计结果:

          con system/manager

      SQL> select DB_USER,OBJECT_SCHEMA "SCHEMA",OBJECT_NAME,

                 POLICY_NAME,SQL_TEXT

          from dba_fga_audit_trail ;

      DB_USER  SCHEMA   OBJECT POLICY_NAME

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

     SQL_TEXT

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

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(1000, 'SAM', 800, 15, 10)

 

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(5000, 'RUDY', 2979, 15, 10)

 

     MILLER   PIET     EMP    MYPOLICY1

     INSERT INTO PIET.EMP(EMPNO, ENAME, SAL, COMM, DEPTNO)

     VALUES(69, 'MILLER', 800, 1000, 10)
 
 
 
 
。。。。。。。。。。。。。。。。。。。。
dbms_fga.add_policy (
object_schema => 'PIET', 
object_name => 'EMP', 
policy_name => 'MYPOLICY1',
audit_condition => NULL,
audit_column => 'SALARY,COMMISSION_PCT',
audit_column_opts => DBMS_FGA.ALL_COLUMNS,
audit_trail => DBMS_FGA.DB_EXTENDED,
statement_types => 'INSERT, UPDATE');
FGA 策略(细粒度审计)
FGA 策略(细粒度审计)
DBMS_FGA:审计变得更为关注某个方面,并且更为
精确。
通过它,可以知道访问了哪些列,哪些行。
程序包DBMS_FGA 具有4 个过程:
ADD_POLICY 添加使用谓词和审计列的审计策略
DROP_POLICY 删除审计策略
DISABLE_POLICY 禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY 启用策略
 
用户test 通常每天访问itmanager.perfdata 表,
因此可以建立一个FGA 策略,用于审计任何对perfdatda.value 列的任何访问:
begin
dbms_fga.add_policy(
object_schema => 'ITMANAGER',
object_name => 'PERFDATA',
policy_name => 'SAL_SELECT_PERFDATA',
audit_column => 'VALUE'
);
end;
相关的视图包括:
DBA_FGA_AUDIT_TRAIL 细粒度审计策略的审计跟踪条目
  
  增加 FGA 策略 
  
   审计表
  GRANT RESOURCE,CONNECT TO BANK IDENTIFIED BY BANK;
  
  CREATE TABLE BANK.ACCOUNTS
  ( 
   ACCT_NO NUMBER PRIMARY KEY,
   CUST_ID NUMBER NOT NULL ,
   BALANCE NUMBER(15,2) NULL
  );
  insert into bank.accounts values(1,1,10000);
  insert into bank.accounts values(2,2,20000);
  commit;
  
  Begin
  dbms_fga.drop_policy (
   object_schema=>'BANK',
   object_name=>'ACCOUNTS',
   policy_name=>'ACCOUNTS_Access');
  dbms_fga.add_policy (
   object_schema=>'BANK',
   object_name=>'ACCOUNTS',
   policy_name=>'ACCOUNTS_ACCESS');
  end;
  /
  
  select * from bank.accounts; 
  select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
  
   审计列和审计条件, 在add_policy中加入
    audit_column => 'BALANCE'
    audit_condition => 'BALANCE >= 11000'
  Begin
  dbms_fga.drop_policy (
   object_schema=>'BANK',
   object_name=>'ACCOUNTS',
   policy_name=>'ACCOUNTS_ACCESS');
  
  dbms_fga.add_policy (
   object_schema=>'BANK',
   object_name=>'ACCOUNTS',
   audit_column => 'BALANCE',
   audit_condition => 'BALANCE >= 11000',
   policy_name=>'ACCOUNTS_ACCESS');
  end;
  /
  
   这个不可用,Why?
  select BALANCE from bank.accounts; 
  select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
  
  
  治理 FGA 策略 
  要删除策略,您可以使用以下语句: 
  begin
  dbms_fga.drop_policy (

  object_schema => 'BANK',
  object_name => 'ACCOUNTS',
  policy_name => 'ACCOUNTS_ACCESS'
    );
  end;
  /
  
   对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。 
   需要临时禁用审计收集 — 例如,假如您希望将线索表移动到不同的表空间或者要删除线索表。您可以按如下方法禁用 FGA 策略: 
  begin
  dbms_fga.enable_policy (
  object_schema => 'BANK',
  object_name => 'ACCOUNTS',
  policy_name => 'ACCOUNTS_ACCESS',
  enable => FALSE
    );
  end;
  /
   重新启用很简单 enable => TRUE
  
  演示何时审计操作以及何时不审计操作的各种情况 SQL 语句 审计状态 
  
  select balance from accounts;  进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。 
  select * from accounts;     进行审计。即使用户没有明确指定列 BALANCE,* 也隐含地选择了它。
 select cust_id from accounts where balance < 10000; 进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。 
  select cust_id from accounts;  不进行审计。用户没有选择列 BALANCE。 
  select count(*) from accounts; 不进行审计。用户没有明确或隐含地选择列 BALANCE。 
  
  
  处理器模块 
   FGA 的功能不只是记录审计线索中的事件;FGA 还可以任意执行过程。
   过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的审计线索中。
   这种存储代码段可以是独立的过程或者是程序包中的过程,称为策略的处理器模块。
   实际上由于安全性原因,它不必与基表本身处于同一模式中,您可能希望特意将它放置在不同的模式中。
   由于只要 SELECT 出现时过程就会执行,非常类似于 DML 语句启动的触发器,您还可以将其看作 SELECT 语句触发器。
   以下参数指定将一个处理器模块指定给策略: 
   handler_schema 拥有数据过程的模式
   handler_module 过程名称  软件开发网
   处理器模块还可以采用程序包的名称来代替过程名称。在这种情况下,参数 handler_module 在 package.procedure 的格式中指定。 
  
  
  FGA 数据字典视图 
   FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。表 2 包含该视图中一些重要列的简短描述。 
   审计线索收集在 SYS 拥有的表 FGA_LOG$ 中。对于 SYS 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL 是该表上的一个视图。
   一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值 — 这是显著增强该工具功能的一项信息。 
   另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。
   此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。
  
  
  视图和 FGA 
   到目前为止我已经讨论了在表上应用 FGA;现在让我们来看如何在视图上使用 FGA。假定在 ACCOUNTS 表上定义视图 VW_ACCOUNTS 如下: 
  
  create view bank.vw_accounts as select * from bank.accounts;
  
  select * from bank.vw_accounts;
  select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
  
   假如您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。
   通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。
   随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。 
  
  其它用途 
   除了记录对表的选择访问,FGA 还可用于某些其它情况: 
   您可以对数据仓库使用 FGA,以捕捉特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。您不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。 
   由于 FGA 捕捉绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。 
   处理器模块可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。 
   由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。
结论 
   FGA 使您在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,答应进行非常简单的设置。 
   下一次我将讨论高级 FGA 技术以及 Oracle Database 10g 中的新特性,这些特性使 FGA 的功能极为强大,适用于所有类型的审计情况。 
  
  
  数据字典视图 DBA_AUDIT_POLICIES 中重要的列 
  
  OBJECT_SCHEMA  对其定义了 FGA 策略的表或视图的所有者 
  OBJECT_NAME   表或视图的名称 
  POLICY_NAME   策略的名称 — 例如,ACCOUNTS_ACCESS 
  POLICY_TEXT   在添加策略时指定的审计条件 — 例如,BALANCE >= 11000 
  POLICY_COLUMN  审计列 — 例如,BALANCE 
  ENABLED     假如启用则为 YES,否则为 NO 
  PF_SCHEMA    拥有策略处理器模块的模式(假如存在) 
  PF_PACKAGE   处理器模块的程序包名称(假如存在) 
  PF_FUNCTION   处理器模块的过程名称(假如存在) 
  
  
  数据字典视图 DBA_FGA_AUDIT_TRAIL 中重要的列
  
  SESSION_ID   审计会话标识符;与 V$SESSION 视图中的会话标识符不同 
  TIMESTAMP    审计记录生成时的时间标记 
  DB_USER     发出查询的数据库用户 
  OS_USER     操作系统用户 
  USERHOST    用户连接的机器的主机名 
  CLIENT_ID    客户标识符(假如由对打包过程 dbms_session.set_identifier 的调用所设置) 
  EXT_NAME    外部认证的客户名称,如 LDAP 用户 
  OBJECT_SCHEMA  对该表的访问触发了审计的表所有者 
  OBJECT_NAME   对该表的 SELECT 操作触发了审计的表名称 
  POLICY_NAME   触发审计的策略名称(假如对表定义了多个策略,则每个策略将插入一条记录。
在此情况下,该列显示哪些行是由哪个策略插入的。) 
  SCN       记录了审计的 Oracle 系统更改号 
  SQL_TEXT    由用户提交的 SQL 语句 
  SQL_BIND    由 SQL 语句使用的绑定变量(假如存在)
 
阅读(1272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~