仅使用权限、角色、视图甚至细粒度安全策略建立访问控制系统还不能保证数据库的安全。因此,开启审计数据库的使用能让我们知道访问控制机制是否确实像所希望的那样工作。
审计分为标准审计和细粒度审计,标准审计基于语句级、权限级和对象级。而细粒度审计涉及某种粒度的数据访问。比如某个经理应该能够看到为他工作的雇
员工资有关信息。那么,怎样才能知道这位经理是否还查看了他的顶头上司的工资信息?是否要审计这位经理的所有的select语句?这个时候利用细粒度审计
(FGA)可以只审计一个表种的某些行,还可以将FGA作为一种侵入检测装置。
1.启用审计
alter system set audit_trail = DB scope = spfile;
有些网站上写可以scope = both,但是实际修改时无法修改指定的类型,只能修改到spfile重启实例,还望达人指教。
audit_trail主要有如下几个值:
NONE:10g的默认值,表示禁用数据库审计;
OS:将审计记录写到一个操作系统文件中。写入的目录由audit_file_dest参数指定,但是注意:在Windows NT下(我是XP),审计记录不启用这个参数,而是直接写道本地管理日志,需要到管理中查看。
DB:将审计记录写入数据库审计跟踪,棵视为DBA_AUDIT_TRAIL(存储在SYS.AUD$表中)。启用这个参数后注意将相关的几张表以及索引从system表空间下改到另一个表空间。
select * from dba_tables t where t.table_name = 'AUD$';
select * from dba_tables t where t.table_name = 'AUDIT$';
select * from dba_tables t where t.table_name = 'AUDIT_ACTIONS';
alter table aud$ move tablespace TBS_PM;
alter table AUDIT$ move tablespace TBS_PM;
alter table AUDIT_ACTIONS move tablespace TBS_PM;
alter index I_aud1 rebuild tablespace TBS_Index;
alter index i_audit rebuild online tablespace TBS_Index;
alter index i_audit_actions rebuild online tablespace TBS_Index;
另有DBExtened,XML这里不做介绍了,常用的就是以上3个。
2.修改AUDIT_TRAIL后,重启实例,然后指定审计的表和活动。
create table test_audit
(
col1 varchar2(10)
);
audit update on test_audit;
audit insert on test_audit;
insert into test_audit(col1) values ('dfasd3424');
update test_audit t set t.col1 = '132rf';
commit;
select * from dba_common_audit_trail;
1 Standard Audit 19330 8 1 15-9月 -08 12.07.32.343000 上午 +08:00
PREMOBILE PAUL_XI\Administrator WORKGROUP\PAUL_XI 1416:4828 PAUL_XI
0 PREMOBILE TEST_AUDIT 103 SESSION REC 05002F009C0A0000 0
0 NONE ------S---------
2 Standard Audit 19353 33 1 15-9月 -08 10.21.02.328000 上午 +08:00
PREMOBILE PAUL_XI\Administrator WORKGROUP\PAUL_XI 1416:2348 PAUL_XI
0 PREMOBILE TEST_AUDIT 103 SESSION REC 09000F00DA0A0000 0
0 NONE ------S---S-----
3.为审计使用系统级触发器(个人认为这个已经不是Audit审计功能,而仅仅是触发器)
创建数据库启动触发器
create table logon_audit
(
user_id varchar2(30),
sess_id number(10),
logon_time date,
logoff_time date,
host varchar2(20)
);
create or replace trigger logon_audit_trig
after logon
on database
begin
insert into logon_audit values(user,sys_context('userenv','sessionid'),sysdate,null,sys_context('userenv','host'));
commit;
end;
select * from logon_audit;
1 PREMOBILE 19327 2008-9-14 23:51:22 WORKGROUP\PAUL_XI
2 PREMOBILE 19328 2008-9-14 23:51:35 WORKGROUP\PAUL_XI
3 SYSMAN 0 2008-9-14 23:49:44 PAUL_XI
4 SYSMAN 0 2008-9-14 23:50:49 PAUL_XI