人的修炼似乎应该像大海一样沉稳和宽容,却也应有自己的波澜。 瓜娃警世录:永远不要做沙僧!

9i与10g的细粒度审计(网文摘录)

上一篇 / 下一篇  2007-12-31 21:41:44 / 个人分类:网文摘录

9i的细粒度审计

表的查询语句用普通触发器是检测不到的,除非开启数据库审计,但是从ORACLE9i开始,提供了一个DBMS_FGA包,可以在线对单个的表进行审计并查询审计资料,这就是细粒度审计。但是这个包的审计过程要求数据库运行在CBO优化模式下,如果不是,可能会有意想不到的结果,这就要求对审计的表进行分析。
CHU&_?uB1sC0下面将就这个包的使用做简单的介绍,这个包共有四个过程,先介绍一下该包中的第一个过程:
:n1Hu+VP @C:?0
PROCEDURE add_policy(object_schema IN VARCHAR2 := NULL,ITPUB个人空间9L(YyQ#]qH2Kt
object_name IN VARCHAR2,
H~8AN%P\!j;l] }0policy_name IN VARCHAR2,
KlK:H)i C x0audit_condition IN VARCHAR2 := '1=1',
}h|$]@.wq0audit_column IN VARCHAR2 := NULL,
"_&A:Sb9mb3]-X*|&i0handler_schema IN VARCHAR2 := NULL,
'p/@1H8cwZ6i[+z0handler_module IN VARCHAR2 := NULL,
f/C#T(@7k)B e0enable IN BOOLEAN := TRUE);
0xyA0u3ig0
object_schema:要审计的用户的名称,默认是本用户ITPUB个人空间#IE$K3k:k:g q0~
object_name:要审计的对象的名称
| TR`MG!\P0policy_name:这次审计的策略名称,每次审计都有一个名称,区别于别的审计策略
z*F}xfvZaF9j0audit_condition:审计条件(谓语动词),默认全部,如规定a=1,那么当返回的结果集中显式包含(指定该字段)或隐式包含(不指定该字段)a=1的行的时候,该查询语句将被审计。
3S n"m5ee y`P0audit_column:表示审计那些列,默认全部,如果指定列,那么只有select或者是where指定该列的时候才被审计,如果是select * 也算是隐式的指定了该列,因为*本身是包含任意列。
M|p{D!m |$l N0注:如果同时指定了audit_column与audit_condition,那么必须都满足的情况下,才能被审计,也就是说,这两个条件是一个并的关系而不是或的关系。
3L}O C?I_"S&I0handler_schema:我们还可以规定在策略执行的时候,执行一个指定用户的存储过程,这里是存储过程的所有者
'iG,a$K sh0handler_module:指定这个策略执行的时候,执行的存储过程的名称
(wV H2@Nr n?t4Y0enable:确定审计策略是否马上生效。
,o)oJLfL`/{2X0很明显,该包的作用就是增加一个审计策略,object_schema、object_name与policy_name唯一确定一个审计策略,光看policy_name不能唯一确定一个策略名,不同的对象,策略名可以一样。ITPUB个人空间Bpu XZGU0mN
我们再来看第二个过程
eTZ.Rdf@0
PROCEDURE drop_policy(object_schema IN VARCHAR2 := NULL,ITPUB个人空间!Aw*zji7OI
object_name IN VARCHAR2,
S CGJ*P$x ~4B glhw0policy_name IN VARCHAR2);

9@5E$pH!oF0object_schema、object_name与policy_name的含义和第一个包一样,只要指定这三个参数,就可以唯一的删除一个指定的审计策略。
0qJ.yU(Q9UZ&|E0第三、四个过程enable_policy、disable_policy第二个过程相似,就是根据object_schema、object_name与policy_name来禁止或者开启审计策略,这样对于需要多次使用同样的审计策略是很有用的,没有必要删除后重新创建,不用的时候,只需要disable就可以了,用的时候,只要enable就可以了
{+s!jP6d*] @)I0如果开启了handler_schema与handler_module,则需要一个handler_schema用户下的存储过程,假定名称是sp_chk_mytable,这个过程可以类似为:
T3E!t9m"n;j0
CREATE PROCEDURE sp_chk_mytable (
cGb V0S0Wb x0p_object_schema VARCHAR2,
;L5}$E gDD"}0p_object_name VARCHAR2,
T!_}p?A {0p_policy_name VARCHAR2) ASITPUB个人空间#k^A#UC!b+s&AE
BEGINITPUB个人空间 OZ5w_k!{
    INSERT INTO audit$proc (login_user,audit_time,ip_address,audsid,ITPUB个人空间m``#Qld7JE
    object_schema, object_name, policy_name )
k)F1v!K9}Y0    VALUES (ora_login_user,sysdate,sys_context('USERENV','IP_ADDRESS'),
M.eBr[;jiSR0    userenv('SESSIONID'),p_object_schema,ITPUB个人空间.D!s~q p O
    p_object_name, p_policy_name );ITPUB个人空间C4xwSpV5f
EXCEPTION
E7H3KoB0WHEN OTHERS THENITPUB个人空间}jVd$H8i
sp_write_log('Audit Exception:'||SQLERRM);
!X$Z0W*N$_^x5q ?0END sp_chk_mytable;
S-H,\"Y9H m0
当然,在创建该过程之前还需要建立一个audit$proc的表,因为并不是我们讨论的重点,这个就不多说了,存储过程可以根据自己的要求来改写,以便获取信息。ITPUB个人空间Ol,s)HGL&I
以下我们将用一个例子来说明DBMS_FGA包的使用,在这个例子里面,并不包含执行指定的存储过程,也就是说,仅仅对表的审计做一个示例。
&f(J8]~.Q A`0首先,我们假定我们存在表Test,包含记录为
*T'r8CP#h5EX0
SQL> select * from manager.test;
)y1r;Q%~[y0A B
YEFbtJ4~0-- --
&h/g4A-n:F01 2ITPUB个人空间0ULf$_z5JC.k P"u
2 3ITPUB个人空间'W'V&E+_;la
3 4ITPUB个人空间&t!|J{zt
4 5
0q9gO;P1p4D&J05 6ITPUB个人空间0]9T#k0b H2a'f@
6 7
8N&M'y%jT+m06 rows selected
B{Y%Z5]Z[ {0
分析该表,让其使用CBO优化模式
#L l q%fkg7y0
SQL> analyze table test compute statistics;
8Ti0M`4u"O6Ua0Table analyzedITPUB个人空间v aW^M4\l
检查以前的审计策略与审计日志ITPUB个人空间U iD+ht;CFE
SQL> select t.object_schema,t.object_name,t.policy_name from dba_audit_policies t;ITPUB个人空间C9^5_H{8L
OBJECT_SCHEMA OBJECT_NAME POLICY_NAME
4`2p|;MXcO'A0------------------------------ ------------------------------ ------------------------------ITPUB个人空间DiU*{3|I1S

q,U;M#S;}'a2Ta0SQL>select t.object_schema,t.object_name,t.policy_name,t.sql_text from Dba_Fga_Audit_Trail t;
/v9C8@E1[+fa*^bF0OBJECT_SCHEMA OBJECT_NAME POLICY_NAME SQL_TEXT
a(`)A|&I(I xl#u{0------------------------- --------------------- --------------------- --------------------------------------ITPUB个人空间ph3C9u6Jw
dba_audit_policies用来存放审计策略,其基表是sys.fga$,而Dba_Fga_Audit_Trail则用来存放审计日志,即执行了那些SQL语句,其基表是sys. fga_log$,其日志可以手工删除。通过以上的查询,我们也可以看到,以前没有审计策略,也没有审计日志ITPUB个人空间k`4^I:NS*[*y^
现在,我们在manager.Test表增加一个审计策略ITPUB个人空间'A.n0c}q+{qR#A
SQL> BEGIN
QX'iK%F!v02 dbms_fga.add_policy( object_schema => 'MANAGER',
Q5CV\)Y([03 object_name => 'test',
sG#CcljY0R$G#Z04 policy_name => 'chk_test',ITPUB个人空间h0w8dAIT$Y3w&\
5 audit_condition => 'a = 1',ITPUB个人空间K|)J+i ]
6 audit_column => 'b',ITPUB个人空间3DT?!m p f!x:a*PcD
7 enable => TRUE );
/^3h }hin u,c08 END;
y+jO_J09 /
1C]'VKs~M1kE0PL/SQL procedure successfully completed
ITPUB个人空间~ {@Q1F8h"`
我们再查询dba_audit_policies,就可以发现这条审计策略了。ITPUB个人空间JK T{"a
SQL> select t.object_schema,t.object_name,t.policy_name,t.enabled from dba_audit_policies t;ITPUB个人空间 z,I dNci6h
OBJECT_SCHEMA OBJECT_NAME POLICY_NAME ENABLED
bc-V F`PT3f0------------------------------ ------------------------------ ------------------------------ -------
dH,aO'`Y c0MANAGER TEST CHK_TEST YES
)o$QEe Q/]x0M0
那么就让我们看看该审计策略怎么生效,假定我们执行如下的一些语句,这些语句都有很普遍的代表性:ITPUB个人空间.{e@ lgE$W~
SQL> select count(*) from test where a=2;ITPUB个人空间 T*zX1R2{U)M;]V
COUNT(*)
s"M l |F`k2}s0------------ITPUB个人空间^([)y"d1Fq7d
1ITPUB个人空间V*[D7s-_^ i_
可以看到,该查询返回的结果集中显然没有a=1的行,所以,该查询不能被审计。ITPUB个人空间,Q8G+lTvH-N S
SQL> select count(*) from test where a=1;
w9Q0s#Ho!X8O0COUNT(*)
M5GSub#L$l0----------
"x$N2kOH4D,a!U K01
wQ7l&C UP%A-X"oMD;O0
有人说这个语句包含了a=1,该被审计了吧,其实不然,我们的审计条件中还有一个是审计列必须要有b,count(*)不是说是包含了b,所以该语句还是没有被审计。ITPUB个人空间*uI`1`Sl
SQL> select count(*) from test where b=2;
O S8]+E'Q:p9T3du4y;] o^0COUNT(*)
:S$b,Q?h6V0----------ITPUB个人空间W5u.d zD]&q{F ^8JS)I
1
xz8b:PK0
这个语句被审计了,因为已经包含了列b在where中,而b=2正好是a=1的行,所以a=1是被隐式包含的。ITPUB个人空间 tT/^/c5L1`o#j#? Q
SQL> select * from test where a=1;ITPUB个人空间3W8dt]+dn[?
A BITPUB个人空间R#aC&`8a
-- --ITPUB个人空间 z!q9rg9x| N6J(T4|H
1 2ITPUB个人空间H7[MJ@,]%J1}H D
该语句肯定被审计,所有列肯定包含审计列b,谓语条件正好是a=1。
v,r4g:SU0
SQL> select a from test where a=2;ITPUB个人空间$Yk1M#[ {3Xb$I
AITPUB个人空间u4R&z-h;JX`s2x5JJ
--
X-k#q,j ^O\}2s'aD$V02
/N^M%Q0p6KS+@)o0
这个语句肯定就不被审计了,典型的什么都不满足ITPUB个人空间?4a`/m!o$Y#r ?
SQL> select b from test where b=2;ITPUB个人空间 qfa2JwE
B
ZM Q q"ka'S0--
PN%`d!~+s2ze02ITPUB个人空间K"g#GY9g!~?!O
这个语句也被审计,为什么呢?这个语句包含审计列,而且隐式包含了a=1(因为a=1与b=2是同一行)ITPUB个人空间#}&?i4]s
SQL> select b from test where b=4;
z.k/O L|&EQD0BITPUB个人空间X9gRO FW_@^
--ITPUB个人空间8H+] D1{E!l(`y
4ITPUB个人空间 eB8joGY8l
这个语句没有被审计,因为虽然满足了审计列的条件,但是没有显式或隐式包含a=1,但是如果在您的环境中,这个语句如果被审计了,就请您确信是否分析过表,该查询是否是使用的CBO优化计划。
+N v _+m6~]-`?T0综合以上结果,以上被审计的语句应当是3个,检查一下了
4S wz$],E%^Xy0
SQL>select t.object_schema,t.object_name,t.policy_name,t.sql_text from Dba_Fga_Audit_Trail t;ITPUB个人空间8z9ut6@d0m
OBJECT_SCHEMA OBJECT_NAME POLICY_NAME SQL_TEXT
^)UY:d.q:\:BQ0------------------------- --------------------- ------------------ -------------------------------------ITPUB个人空间{:Mo;o^b [l
MANAGER TEST CHK_TEST select * from test where a=1
Y.Q4q a-PGEp"jjv+Q0MANAGER TEST CHK_TEST select b from test where b=2ITPUB个人空间 d N+a:m }%y lK
MANAGER TEST CHK_TEST select count(*) from test where b=2ITPUB个人空间(I4`d x!s
对于越来越多的审计记录,我们必须手工维护,删除没有参考价值的记录,我们可以运行如下查询来删除审计记录(需要delete any table的权限或在sys下执行):
9BD\&D'J q?,xe@0
delete from sys.fga_log$
1vm@-ToZF)HJl0orITPUB个人空间2a:O?$A`;NY
delete from Dba_Fga_Audit_Trail

5DB$v.V%tF4D|6|0Z\0
到这里,大家总该明白了怎么样审计表的Select语句,同普通审计与DML触发器一样,对过多的表进行审计,将会严重影响性能。但是,在特定的情况下,如果想跟踪一个表的Select语句已便于优化,也还是可以的。

 

10g的细粒度审计

    在 Oracle 9i Database 下,这个策略只能审计 SELECT 语句。然而,在 Oracle Database 10g 中,您可以扩展它,使它包含 INSERT、UPDATE 和 DELETE。您可以通过指定一个新的参数来实现这个目的:

statement_types => 'INSERT, UPDATE, DELETE, SELECT'

这个参数将在所有包括的语句类型上启用审计。您甚至可能考虑为每种语句类型创建单独的策略,这将允许您随意地启用和禁用策略 — 尤其是,控制审计线索的创建,以管理它们占用的空间。

 

参考

http://otn.oracle.com/global/cn/oramag/webcolumns/2003/techarticles/nanda_fga.html

http://otn.oracle.com/global/cn/pub/articles/nanda_fga_pt2.html

http://otn.oracle.com/global/cn/pub/articles/nanda_fga_pt3.html

原文链接:http://blog.csdn.net/penitent/archive/2004/07/06/35573.aspx


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar