鹿鼎记有新区么:ORACLE审计
来源:百度文库 编辑:九乡新闻网 时间:2024/09/21 08:52:35
先看一下审计的分类:
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 Manager
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://field:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager
------------------------------------------------------------------
Logs are generated in directory /opt/ora
打开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 38
95031 38 39
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=
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;