使用触发器实现对Oracle 8i/9i的细粒度审计

文/朝乐蒙

摘要


    对于Oracle 8i/9i来说,自带的审计手段只能捕获到“谁”执行此操作,而不能捕获执行了“什么”,审计的内容无法显示数据的变化情况,很难满足细粒度审计的要求。所以目前来讲,在特定的位置配置相应的触发器用来记录和跟踪数据前后的变化,成为在这两个版本的Oracle数据库中做到细粒度审计的唯一可靠的方法。


    本文介绍了使用触发器的基本的思路,以及几种典型的触发器,如对DDL,DML操作和其他的几种触发器的编写。从技术和实践的角度阐述了此种审计手段的功能和可行性。

Auditing Oracle 8i/9i in Particular by Trigger
Network Security Division    Neusoft Co., Ltd.

Summary
    In the Oracle 8i/9i, some common audit methods can only log that who have done which operation in a table. For example ,the administrator can find that a user called "hacker" had done some update in a important table "boss", but nothing was logged about what the data had been changed to. 
    So we can make some "trigger" in the system ,which works as a logger,they can record the changes in particular. This article is about what the trigger is, how to write a trigger and how it works.


关键词
    ORACLE数据库,触发器,审计;
    ORACLE ,trigger ,audit.


1.绪论

    Oracle是以高级结构化查询语言(SQL)为基础的大型关系型数据库,是目前最流行的客户/服务器体系结构的数据库之一。以其良好的性能和稳定的表现,成为市场占有率最高的大型数据库产品。

    随着Oracle广泛的应用,用户对数据库中数据保护和操作监控的意识逐渐增强,越来越多的用户提出了更高的安全方面的要求。Oracle也一直在加强数据库产品在审计和日志记录方面的能力,如在8i之后,加入了对归档日志的分析工具—logminer,在9i中加入了FGA(细粒度审计)的模块,最终在Oracle 10g产品中实现了对整体数据的详细审计功能。虽然如此,在Oracle 8i/9i的审计功能还不是很完善,本文介绍了如何在上述版本的Oracle产品中实现对数据的及时和详尽的审计跟踪和日志记录。

1.1.Oracle 8i/9i的日志和审计功能

1.1.1. logminer分析工具

    Oracle自身具有很多的日志,如监听器的日志、管理员登陆的日志、每次启动的配置日志和错误日志等等,分别存放在不同文件夹内。而对于数据的更改和数据定义等操作的记录,Oracle提供了一个强大的日志分析工具logminer。[1]

    logminer是Oracle在8i之后推出的一个对数据库的归档文件的分析器。归档文件记录了Oracle所有的数据变化的情况,只有在数据库工作在归档模式(archive)下的时候才会生成,而默认Oracle是在非归档(noarchive)模式下的。工作在归档模式的好处是,只要有相应的归档文件,就可以把数据恢复到任意时刻的状态。logminer就是对这些归档文件进行分析,就可以得到数据在过去时间的所有的更改情况。

    logminer分析之后会得到一张表v$logmnr_contents,记录了详尽信息,可以使用SQL语句进行查询。如查询某段时间里,特定的表的数据有那些变化等。使用logminer工具分析的过程比较复杂,8i与9i之间也有一些细节上的差别。对具体的配置和实现的方法,请查阅相关Oracle的管理文档。

1.1.2.审计功能

    Oracle8i/9i自带的审计(audit)功能在默认的状态下也是不被开启的。[2]可以根据需要,设置对不同的数据库操作进行审计记录。有三种类型的审计操作:登录尝试、对象存取(具体对象上的具体语句)和数据库操作(具体的系统特权和语句,不考虑对象)。

1.1.3.FGA

    在Oracle 9i之中,引入了一个新的概念——FGA(细粒度审计),从Oracle9i开始,提供了一个DBMS_FGA包,可以在线对单个的表进行审计并查询审计资料。但是这个包的审计过程要求数据库运行在CBO优化模式下,如果不是,可能会有意想不到的结果。

1.2. Oracle 8i/9i自带功能的不足

    以上提到的Oracle 8i/9i自带的日志和审计功能,似乎已经可以很好的满足需要了,其实不然,以上的功能的都存在各自的缺陷,配合使用也在一定程度上无法满足需要。

    基于logminer的分析要求数据库工作在归档模式下,而此种工作模式会记录整个数据库每次数据的变化,会很大的增加服务器负担,如果数据的变更比较频繁,归档的文件也就越大。即时在允许这种模式的情况下,每一次的分析过程都要生成新的字典文件,对归档的二进制文件进行分析,这个过程是很占系统资源的。虽然可以异地分析,但是需要复制数据字典,归档文件到另一台相同版本的Oracle服务器上再进行分析。所以说,使用logminer工具,侧重于对整个数据库变更的全面的事后分析,操作比较复杂,对服务器的负担比较重,而且很难满足对审计功能的实时性的要求。

    基于审计的方法相对来说要简单的多,系统会把需要的日志实时记录在特定的表中,管理员只要查询相应的表或视图,就可以了解审计信息。但是,在 Oracle 9i 数据库及其较低版本中,审计只能捕获“谁”执行此操作,而不能捕获执行了“什么”内容。如图1-1

图1-1

    可见,审计跟踪到system用户在表中执行过删除和插入操作,但是无法显示出具体的数据变化情况,无法满足我们对数据的细粒度审计的要求。

    而9i中的FGA也只可以跟踪到selelct语句的数据情况,而不能用于 DML,如 update、insert 和 delete 语句。

    因此,对于 Oracle 数据库 10g 之前的版本,使用自带的功能很难满足对细粒度审计的实时性和准确性的要求。于是手动的设置触发器跟踪用户的行级的更改,成为一种在8i和9i中可靠的审计手段。

2.触发器

    触发器(trigger)是存储过程,当发生特定的动作时,就会激活它。触发器可以被编码,当针对一个表进行插入、更新、删除或三种操作的结合时,激活触发器,也可以在某行被影响或某条语句出现时被激活。触发器经常用于加强数据完整性约束和业务规则,这些业务规则对于内建的Oracle引用完整性约束来说实在是太复杂了。关于数据库触发器的信息可以在DBA_TRIGGERS 视图中找到。

2.1.触发器的功能

·安全性

    可以基于数据库的值使用户具有操作数据库的某种权利。
    可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
    可以基于数据限制用户的操作,例如不允许删除特定的表或表中的记录。

·审计

    可以跟踪用户对数据库的操作。
    审计用户操作数据库的语句。
    把用户对数据库的更新写入审计表。
 
·实现复杂的数据完整性规则

    在修改或删除时级联修改或删除其它表中的与之匹配的行。 
    在修改或删除时把其它表中的与之匹配的行设成NULL值。 
    在修改或删除时把其它表中的与之匹配的行级联设成缺省值。 
    触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。

·自动计算数据值

     如果数据的值达到了一定的要求,则进行特定的处理。

·同步实时地复制表中的数据

2.2.触发器的分类

    触发器的类型是由触发事务处理的类型和执行该触发器的级别来定义的。[3]分为:

·行级触发器(Row-Level trigger)

     对DML语句影响的每个行执行一次。

·语句级触发器(statement-Level trigger)

     触发器对每个DML语句执行一次。如果一条insert语句在表中插入了50行,那么这个表上的语句级触发器只执行一次。

·BEFORE和AFTER触发器

     由于触发器是事件驱动的,因此可以设置触发器在这些事件之前或之后立即执行。在触发器种可以引用DML语句中涉及的旧值或新值。如对update操作,可以记录下把原来的记录更改成什么样子。

·INSTEAD OF触发器

     可以指定Oracle要做的事情,而不是执行原来的操作。比如将数据重定向到其它的表中。

·模式触发器

     可以在模式级的操作上建立触发器,如create table、alter table和drop table等。甚至可以用来防止特定的表被删除。此类触发器主要提供两种功能:阻止DDL操作以及在发生DDL操作时提供额外的安全监控。

·数据库级触发器
     可以创建在数据库事件上的触发器,包括错误、注册、注销、关闭和启动。

3.Oracle中审计触发器的设计

    主要介绍在Oracle审计中最重要的两个触发器的编写

3.1.DDL操作触发器的设计

    第一步,创建存放日志的审计表


    第二步,编写触发器

在触发器创建好之后,如果执行了DDL操作,如:
CREATE USER rrt IDENTIFIED BY pass;
触发器就会把相关的记录写入到审计表中,如:

图3-1

3.2.DML操作触发器的设计

    第一步,创建相应的审计表
    DML的审计和DDL的审计不同,它的字段和需要审计的表的结构有关。

    如目标的表rrt.test有两个字段name和age,则审计表设计成:

    第二步,创建DML触发器


    完成之后,就可以记录下对目标表的所有的DML操作。如图:

图3-2

4.多种触发器的配合使用

    以上的两个触发器记录了审计工作中最重要的部分,跟踪了数据库的结构及数据的变化情况,另外还有一些事件也可以通过触发器来实现,如用户登陆的日志,对特定表的保护,以及数据库的开启和关闭的记录等。

4.1.会话记录的触发器

    下面是一个自动记录用户登陆和会话时间的触发器

    相应的审计表

图4-1

4.2.防止误操作的触发器

4.3.记录数据库开启/关闭的触发器

5.总结

    通过基于触发器的审计,可以得到一份详尽的数据库历史操作的记录,合理的使用和配置会大大的提高数据库本身的安全性,同时为管理者提供下列的功能:
·查明数据库的逻辑更改;
·侦察并更正用户的误操作;
·执行事后审计;
·执行变化分析。
 
    以上讨论了在Oracle 8i/9i中如何使用多种触发器实现对数据的细粒度的跟踪审计,填补了Oracle 8i/9i自带审计功能的不足。虽然触发器的使用会在一定的程度上影响程序的性能,但是到目前为止,这是一种较好地在上述两个版本的数据库中做到细粒度审计的方法。

6.参考文献

[1] oracle.oracle OCP book DBA1.pdf:7-33
[2] 胡欣杰.Oracle 9i数据库管理员指南,北京:北京希望电子出版社,2002:417
[3] [美]Kevin Loney,George Koch.Oracle 9i参考手册.第一版(译者:钟鸣等),机械工业出版社,2003:410


 

联系我们

欢迎致电4006556789,或通过在线方式与我们联系

close

关闭