Oracle数据库审计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 数据库专题

---------

数据库安全性

------

数据库审计

XMOUG MEMBER

编写人: Empoli Liu 2010年9月

背景:

数据库审计,顾名思义,就是捕捉和存储发生在数据库内部的事件信息。本文档重点关注,

1:标准的数据库审计(Standard database auditing)通过初始化参数AUDIT_TRAIL控制实例级别的审计。

2:基于值的审计 (Value-based auditing)

它拓展了标准数据库审计,不仅捕捉审计事件,还捕捉那些被insert,update和delete的值。

基于值的审计通过触发器来实现。

3: 细粒度审计 (Fine-grained auditing)

它拓展了标准数据库审计,捕捉准确的SQL语句。

接下来具体分析,每种审计都有相对应的介绍与实验。

操作系统版本:Redhat Enterprise Linux 5.1

数据库版本: Oracle 10g

数据库审计介绍与实验一(标准的数据库审计)

Audit_trail 相当于是一个开关,默认不打开。

那么,如何打开呢?由于audit_trail参数值有多种,这里只列举两种。如下是第一种,audit_trail=db

标准数据库审计的数据放于基表aud$上,而aud$位于system表空间上,众所周知,system 表空间是存放数据字典表的地方,为避免因审计而较大的影响数据库的性能,应将此表移到其它表空间上。生产环境建议建一个单独的表空间存放审计表,本文将审计表移动到users 表空间上,如下图

底层表是AUD$,那么如何知道上层该查询哪些表呢?

Select * from dict d where d.table_name like ‘%AUD%’;

参数audit_trail=db后,就可以开始审计了,如下图

凡是有谁查询hr用户的employees表,就将它记录进aud$ 表。

而此时,我再以hr用户登录,然后再次查询,发现底层aud$表又记了一条记录,

而后,我又想,如果是同一个session查多次会怎么样?

同一个hr我让它查两次

发现,同一个session查多次只会记录一次。

总结:默认情况下,同一session查多次只会记录一次,不同session不论用户是否相同,查几次就会记录几次。

继续往下思考

如果我要让它哪怕是同一个session,查一次就要它记录一次怎么做?OK,如下(默认是by session,所依此处改成by access)

再看,同一session差了两次

数据也就跟着记录了两次

缺点:对数据库的影响极大,会造成最多50%性能的下降。

接下来,将audit_trail改为另一个值db_extended

审计都是大动作,所以都要经历一次数据库的重启。

Db_extended的审计程度可以细化到用户执行了哪条SQL语句。这个是audit_trail=db所做不到的。

如下

数据库审计介绍与实验二(基于值的审计)

创建一个表sys_log,此表用来记录sys以sysdba角色登录数据库的情况。

创建一个触发器,在sys登录数据库时就往sys_log表中插入此sys在何时,何地,以何种操作系统用户的方式登录数据库中。

Conn / as sysdba与conn sys/oracle 由于都是以本地方式登录,所以IP不会记录。通过tnsname网络方式登录就会记录IP。

数据库审计介绍与实验三(细粒度审计)

首先,创建一张表。

其次,创建一个存储过程。细粒度审计需要fire a procedure意译为触发一个存储过程。

之后,加上一个规则,这个规则就是你想审计的内容。

本例的意思是,凡是有人查了employee_id=100的salary就将包含它查询所用SQL语句的相关信息记录下来。(图中department_id=100应该为employee_id=100,policy_name应为policyhr)

相关文档
最新文档