鹿鼎记有新区么:ORACLE审计

来源:百度文库 编辑:九乡新闻网 时间:2024/07/07 09:34:15
        审计简单一点讲就是监视数据库的可疑活动。监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件或者数据库。

先看一下审计的分类:

1.强制性审计:不管其它审计选项或参数为何,所有Oracle数据库都会审计特定的操作。由于数据库需要记录系统启动和关闭等数据库活动,所以存在强制性审计日志。

2.标准数据库审计:这是通过使用AUDIT_TRAIL初始化参数在系统级别设置的。启用审计后,可选择要审计的对象和权限。

3.基于值审计:这种审计扩展了标准数据库审计的功能,不仅会捕获已发生的审计事件,还会捕获插入、更新或删除的实际值。基于值审计是通过数据库触发器实施的。

4.细粒度审计(FGA):FGA扩展了标准数据库审计的功能,这种审计可捕获已发出的实际SQL语句,而不仅仅是发生了事件的SQL语句。

5. DBA审计:在DBA与审计者或安全管理员之间划分审计责任,审计者或安全管理员在操作系统审计线索中负责监视DBA的活动。

还有一种分类:

1.      特权用户审计

默认情况下,Oracle会自动审计特权用户所执行的特权操作(例如启动和关闭数据库等),并将特权操作的相关信息记载道操作系统的审计跟踪记录中。为了审计特权用户所执行的其他数据库操作,必须设置初始化参数audit_sys_operations.

2.      数据库审计

默认情况下,Oracle不会审计数据库用户的任何操作。为了审计数据库用户所执行的操作,必须设置初始化参数AUDIT_TRAIL,并且指定要审计的数据库操作。当设置该参数为OS时,Oracle会将审计结果存放到OS审计跟踪记录在UNIX或Linux环境下,审计记录存储在文件中。该文件的位置是AUDIT_FILE_DEST参数指定的位置。    当设置该参数为DB时,Oracle会将审计结果存放到数据字典$AUD中,则可复查DBA_AUDIT_TRAIL视图中的审计记录,这个视图是SYS方案的一部分。

3.      应用审计

当使用数据库审计时,Oracle只会记载执行审计操作的用户名,数据库操作、操作对象以及操作时间等信息,而不会记载数据的变化。为了审计数据变化(例如UPDATE操作前后的数据),必须使用应用审计。

 

随着时间的推移,审计跟踪记录会越来越多,从而会占用更多空间,所以DBA用户应该定期删除不再需要的审计更总记录。

通过EM来使用审计

1. 启动em

在oracle用户下输入emctl start dbconsole,

[oracle@field ~]$ emctl start dbconsole

TZ set to PRC

Oracle Enterprise Manager10gDatabase Control Release10.2.0.1.0 

Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.

http://field:1158/em/console/aboutApplication

Starting Oracle Enterprise Manager10gDatabase Control ........ started.

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

Logs are generated in directory /opt/ora10g/product/10.2.0/db_1/field_inomc/sysman/log

打开IE输入http://192.168.1.253:1158/em/console

这里有一点,看

登陆的地方时乱码,解决办法

打开你的ie浏览器,选择工具"-->"internet选项"-->"常规",选择"语言",默认只有"中文",选择"添加",加入"英语(美国)" ,调整顺序,把“英语(美国)”移动到最上面。

成功了

2. 通过单击“Administration(管理)”标签,然后单击“Users & Privileges(用户和权限)”区域中的“Audit Settings(审计设置)”链接,可访问“Database Control Home(数据库控制主页)”中的“Audit(审计)”页。

3. 审计页

      

可以看到在该页可以修改Audit Trail、Audit SYS User Operations等参数,我们在这里做普通用户审计的操作并把操作结果放在数据库中

修改成功,这里注意一点,audit_sys_operations和Audit Trail这两个参数都是静态参数,也就是说修改之后需要重新启动才可以生效。

4. 审计用户lsy的操作

A.权限审计

不多说了,就是点点鼠标,我自己做的结果

B.对象审计

饼干在这添加了select、insert、delete三个操作,强调一下这里有个by session和by access,by session就是一个会话里面如果有两个相同操作只显示一个,by access是每一次操作都会记录,选by session

可以清楚的看到,在一个会话中如果对该表有select、insert、delete三个操作,就会有一条记录,但是也只会有一条记录。

 

5. 审计用户lsy的基于值的审计

这个EM据我观察好像没法做,通过建立触发器实现

进行数据库审计时会记录审计对象中发生的插入、更新和删除操作,但是不会捕获   更改的实际值。基于值审计扩展了数据库审计的功能,它能够捕获更改的实际值。   基于值审计利用了数据库触发器(事件驱动的PL/SQL构造)。

      create table audit_emp_change(

      asno     NUMERIC (6, 0),oldage NUMERIC(3,0),

      newage NUMERIC(3,0),time date

     );

        

 create or replace trigger tr_stu_change
   after update of age on students
   for each row
   
declare
    v_tmp int;
   begin
      select count(*) into v_tmp from audit_emp_change
       where asno=:old.sno;

      if v_tmp=0 then
      insert into audit_emp_change
       values(:old.sno,:old.age,:new.age,SYSDATE);
       else
       update audit_emp_change
       set ldage=:old.age ,newage=:new.age ,time=sysdate
       where asno=:old.sno;
       end if;
       end;

这个触发器有个缺点,他只能记录最后一次修改的记录,如果你在期间对该表的age字段有多次修改,他也只能记录最后一次

SQL> select * from audit_emp_change;

 

  ASNO OLDAGE NEWAGE TIME

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

 95029    22    382010-11-21

 95031    38    392010-11-21

6. FGA精细审计

这个EM据我观察好像也没法做,该种审计是为了审计用户在特定数据行或特定列上的SQL操作,FGA是使用包DBMS_FGA来实现的。

Exec dbms_fga.add_policy

(object_schema=>’lsy’,-

 object_name=>’students’,policy_name=>’chk_students’,-

 audit_condition => ‘sno=95029’,audit_column =>’sex,age’,-

 statement_types => ‘update,select’)

object_schema:方案名

object_name:数据库对象名

policy_name:FGA策略名

audit_condition:审计条件

audit_column:指定审计的列

statement_types:审计的类型

我解释一下,我是在方案lsy上审计表students上的学号为95029的性别和年龄,针对update和select操作。

 

SQL> exec dbms_fga.add_policy(object_schema =>'lsy',object_name => 'students' ,policy_name => 'chk_students', audit_condition => 'sno=95029', audit_column => 'sex,age' ,statement_types => 'update,select')

 

PL/SQL procedure successfully completed

 

执行相关select和update的操作,

SQL> select db_user ,USERHOST, scn ,SQL_TEXT from dba_fga_audit_trail;

 

DB_USER                       USERHOST                                                                               SCN SQL_TEXT

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

LSY                           WORKGROUP\PC-200911241118                                                           488822 select * from students

 

LSY                           WORKGROUP\PC-200911241118                                                           488993 select * from students

 

LSY                           WORKGROUP\PC-200911241118                                                           489026 select * from students where sno='95029'

 

LSY                           WORKGROUP\PC-200911241118                                                           489138 update students set age=21 where sno=95029

 

LSY                           WORKGROUP\PC-200911241118                                                           489147 update students set age=22 where sno=95029

 

LSY                           WORKGROUP\PC-200911241118                                                           489173 update students set sex='女' where sno=95029

 

看非常成功。

 

禁止FGA审计

SQL> exec dbms_fga.disable_policy( object_schema => 'lsy' , object_name =>'students' ,policy_name => 'chk_students')

 

PL/SQL procedure successfully completed

激活FGA审计

SQL>   exec dbms_fga.enable_policy( object_schema => 'lsy' , object_name =>'students' ,policy_name => 'chk_students')

 

PL/SQL procedure successfully completed

删除FGA策略

SQL>   exec dbms_fga.drop_policy( object_schema => 'lsy' , object_name =>'students' ,policy_name => 'chk_students')

 

PL/SQL procedure successfully completed

删除FGA审计结果

当使用FGA策略实现精细审计时,不需要激活数据库审计,并且oracle会自动将审计结果存放到数据字典表FGA_LOG$中。通过删除该表内容,可以删除精细神结果。

Delete from sys.fga_log$;

Commit;