Oracle引以为傲的FGA细粒度审计功能为监控系统中的异常操作提供了非常便捷的手段。本文给出使用FGA功能将审计信息记录到数据库中的方法。
1.初始化环境
1)清理环境
sys@ora10g> conn / as sysdba
Connected.
sys@ora10g> exec DBMS_FGA.DROP_POLICY ( object_schema => 'SEC', object_name => 'T', policy_name => 'audit_t');
PL/SQL procedure successfully completed.
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> drop table t purge;
Table dropped.
2)创建待审计表T
sys@ora10g> create table t (x number(10), y varchar2(10));
Table created.
2.创建FGA审计策略
1)audit_trail参数设置说明
①audit_trail参数设置为“DBMS_FGA.DB”:审计信息记录到数据库的SYS.FGA_LOG$中,但不包含SQL语句和SQL的绑定变量信息;
②audit_trail参数设置为“DBMS_FGA.DB + DBMS_FGA.EXTENDED”(默认值):审计信息记录到数据库的SYS.FGA_LOG$中,同时包含SQL语句和SQL的绑定变量信息;
③audit_trail参数设置为“DBMS_FGA.XML”:审计信息记录到AUDIT_FILE_DEST参数对应的操作系统目录下,为XML格式,但不包含SQL语句和SQL的绑定变量信息;
④audit_trail参数设置为“DBMS_FGA.XML + DBMS_FGA.EXTENDED”:审计信息记录到AUDIT_FILE_DEST参数对应的操作系统目录下,为XML格式,同时包含SQL语句和SQL的绑定变量信息;
这里重点介绍审计记录到数据库中的方法。
2)审计结果记录到数据库的创建方法
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> begin
2 DBMS_FGA.ADD_POLICY (
3 object_schema => 'SEC',
4 object_name => 'T',
5 policy_name => 'audit_t',
6 audit_condition => 'X < 100',
7 audit_column => 'X',
8 enable => TRUE,
9 statement_types => 'SELECT, INSERT, UPDATE, DELETE',
10 audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED,
11 audit_column_opts => DBMS_FGA.ANY_COLUMNS
12 );
13 end;
14 /
PL/SQL procedure successfully completed.
以上创建审计规则中audit_trail和audit_column_opts采用的是默认值,因此上面的审计策略也可以用以下命令实现。
begin
DBMS_FGA.ADD_POLICY (
object_schema => 'SEC',
object_name => 'T',
policy_name => 'audit_t',
audit_condition => 'X < 100',
audit_column => 'X',
enable => TRUE,
statement_types => 'SELECT, INSERT, UPDATE, DELETE'
);
end;
/
3.查询确认FGA审计策略
通过DBA_AUDIT_POLICIES视图可以查看数据库中的审计规则。
sys@ora10g> col OBJECT_SCHEMA for a3
sys@ora10g> col OBJECT_NAME for a2
sys@ora10g> col POLICY_NAME for a7
sys@ora10g> col POLICY_TEXT for a10
sys@ora10g> col POLICY_COLUMN for a2
sys@ora10g> col PF_SCHEMA for a2
sys@ora10g> col PF_PACKAGE for a2
sys@ora10g> col PF_FUNCTION for a2
sys@ora10g> select * from dba_audit_policies;
OBJ OB POLICY_ POLICY_TEX PO PF PF PF ENA SEL INS UPD DEL AUDIT_TRAIL POLICY_COLU
--- -- ------- ---------- -- -- -- -- --- --- --- --- --- ------------ -----------
SEC T AUDIT_T X < 100 X YES YES YES YES YES DB+EXTENDED ANY_COLUMNS
我们创建的审计规则尽收眼底。
4.触发审计规则并查看审计结果
1)触发审计规则
向表T中插入一条x列值小于100的记录。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> insert into t values (1,'secooler');
1 row created.
sec@ora10g> commit;
Commit complete.
2)查看审计结果
审计信息记录此时已经记录到了数据库中,我们可以通过检索SYS.FGA_LOG$视图获得审计信息。
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> select count(*) from SYS.FGA_LOG$;
COUNT(*)
----------
1
sys@ora10g> set FEEDBACK 1
sys@ora10g> select LSQLTEXT,LSQLBIND from SYS.FGA_LOG$;
LSQLTEXT
------------------------------------------------------
LSQLBIND
------------------------------------------------------
insert into t values (:"SYS_B_0",:"SYS_B_1")
#1(1):1 #2(8):secooler
1 row selected.
以上选取了LSQLTEXT和LSQLBIND字段,这两个字段记录了被审计表对应的SQL语句以及绑定变量具体值,这便是audit_trail参数的DBMS_FGA.EXTENDED内容在起作用。
5.测试审计规则不带DBMS_FGA.EXTENDED参数内容的审计效果
若审计规则中不带DBMS_FGA.EXTENDED参数,则触发审计规则后,SQL语句和绑定变量值将不被记录。
1)删除审计策略
sys@ora10g> exec DBMS_FGA.DROP_POLICY ( object_schema => 'SEC', object_name => 'T', policy_name => 'audit_t');
PL/SQL procedure successfully completed.
2)创建不带DBMS_FGA.EXTENDED参数仅含有DBMS_FGA.DB参数的审计规则
sys@ora10g> begin
2 DBMS_FGA.ADD_POLICY (
3 object_schema => 'SEC',
4 object_name => 'T',
5 policy_name => 'audit_t',
6 audit_condition => 'X < 100',
7 audit_column => 'X',
8 enable => TRUE,
9 statement_types => 'SELECT, INSERT, UPDATE, DELETE',
10 audit_trail => DBMS_FGA.DB,
11 audit_column_opts => DBMS_FGA.ANY_COLUMNS
12 );
13 end;
14 /
PL/SQL procedure successfully completed.
3)确认审计规则
sys@ora10g> col OBJECT_SCHEMA for a3
sys@ora10g> col OBJECT_NAME for a2
sys@ora10g> col POLICY_NAME for a7
sys@ora10g> col POLICY_TEXT for a10
sys@ora10g> col POLICY_COLUMN for a2
sys@ora10g> col PF_SCHEMA for a2
sys@ora10g> col PF_PACKAGE for a2
sys@ora10g> col PF_FUNCTION for a2
sys@ora10g> select * from dba_audit_policies;
OBJ OB POLICY_ POLICY_TEX PO PF PF PF ENA SEL INS UPD DEL AUDIT_TRAIL POLICY_COLU
--- -- ------- ---------- -- -- -- -- --- --- --- --- --- ------------ -----------
SEC T AUDIT_T X < 100 X YES YES YES YES YES DB ANY_COLUMNS
注意此时AUDIT_TRAIL字段显示的内容仅为“DB”。
4)触发审计规则
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> insert into t values (2, 'Andy');
1 row created.
sec@ora10g> commit;
Commit complete.
5)查看审计结果
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> set FEEDBACK 1
sys@ora10g> select LSQLTEXT,LSQLBIND from SYS.FGA_LOG$;
LSQLTEXT
-------------------------------------------------------
LSQLBIND
-------------------------------------------------------
insert into t values (:"SYS_B_0",:"SYS_B_1")
#1(1):1 #2(8):secooler
2 rows selected.
sys@ora10g> select count(*) from SYS.FGA_LOG$;
COUNT(*)
----------
2
1 row selected.
可见此时第二次触发的审计信息没有记录SQL和绑定变量的信息。以下是获取到的全部审计信息。
sys@ora10g> set head off
sys@ora10g> select * from SYS.FGA_LOG$;
27595 SEC
oracle
secdb
oracle
SEC
T
AUDIT_T 0
insert into t values (:"SYS_B_0",:"SYS_B_1")
2 28-MAY-11 08.11.33.914507 AM
0 5100 0700280096060000 9 1
#1(1):1 #2(8):secooler
27596 SEC
oracle
secdb
oracle
SEC
T
AUDIT_T 0
2 28-MAY-11 08.12.34.629837 AM
0 5106 07000B0097060000 9 1
2 rows selected.
这里清晰的记录两次审计触发的内容。
6.小结
本文给出了使用FGA细粒度审计功能实现将审计信息记录在数据库中的方法,这也是Oracle默认采用的方法。
与此对应的便是将审计信息以XML格式记录到文件中。下回分解。
Good luck.
secooler
11.06.02
-- The End --