Oracle数据库审计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)