菜单

DBA_Oracle Audit基本概念(概念)

2019年11月26日 - 计算机数据

细粒度审计,是在Oracle
9i中引入的,能够记录SCN号和行级的更改以重建旧的数据,但是它们只能用于select语句,而不能用于DML,如update、insert和delete语句.因此,对于Oracle数据库10g之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法
而Oracle10g中FGA功能的增强使其不但能够支持select操作,同时也支持DML操作。在
Oracle 10g 中,
审计已经从一个单纯的“操作记录者”成长为一个“事实记录机制”,它能以一个非常详细的级别来捕获用户的行为,这可以消除您对手动的、基于触发器的审计的需要。它还结合了标准审计和
FGA 的跟踪,这使其更易于跟踪数据库访问,而不用考虑它是如何生成的
通过细粒度审计我们可以记录:
◆在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问
◆使用了公司网络外部的某个 IP 地址 ◆选定或更新了特定列
◆使用了该列的特定值 审计实际是某个会话的server
process在进行一些递归SQL的操作,而非依赖某些后台进程,这可以从10046事件观察到。

数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时它们会隐含执行。

2014-08-15 Created By
BaoXinjian

触发事件可以是如下任何一种:

图片 11、什么是审计

1>
处理数据库表的DML语句(如INSERT,UPDATE或者DELETE)。在触发事件发生之前或者之后,触发器会执行。


2>
特定用户在特定模式下,或者任何用户执行的DDL语句(如CREATE或者ALTER)。这种触发器经常被用于审计目的。它们可以记录各种模式修改,何时执行,以及哪个用户执行的。

(1).
简单来讲,就是把对数据库的操作记录下来。不管你是否打开数据库的审计功能,以下这些操作系统会强制记录。

3> 系统事件,如数据库启动或者关闭

4>
用户事件,如登陆和注销。即可以定义一个触发器,在用户登陆数据库时记录用户名和登陆事件。

(2).记录对数据对象的所有操作。什么时候,什么用户对对象做出了什么类型的操作。默认情况下审计是关闭的。

创建触发器的通用语法如下所示:

CREATE [OR REPLACE] TRIGGER Trigger_name
{BEFORE |AFTER} Triggering_event ON table_name
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE/DISABLE]
[WHEN condition]
DECLARE
     declaration statements
BEGIN
     executable statements
EXCEPTION 
     exception-handling statements
END;

(3). 审计的一些理解

其中,trigger_name是触发器的名称。BEFORE或者AFTER指明触发器何时执行,即在触发事件发生之前,还是之后,trigger_event是针对数据库表的DML语句。table_name是与该触发器相关的数据库表的名称。子句FOR
EACH
ROW指行触发器。FOLLOWS选项,指定触发器被触发的顺序。这个选项适用于在相同表上所定义的,并且会在相同时间点执行的触发器。ENABLE和DISABLE子句指定触发器是在启用,还是禁用状态下被创建的。默认情况下是启用的。

  1. 对于权限审计和大部分语句,by
    session无效,无论指定by session/by access还是不指定,审计都自动为by
    access。

禁用或启用触发器,可用以下命令:ALTER TRIGGER trigger_name
DISABLE/ENABLE;

2.
审计的语句级可以指定ALL,但是ALL只包括大部分语句,它不包括下面这些语句。

禁用某个表上的所有触发器,可用如下命令:ALTER TABLE table_name DISABLE
ALL TRIGGERS.

ALTER SEQUENCE,ALTER TABLE, COMMENT
TABLE, DELETE TABLE, EXECUTE PROCEDURE, GRANT DIRECTORY, GRANT
PROCEDURE, GRANT SEQUENCE, GRANT TABLE, GRANT TYPE, INSERT TABLE, LOCK
TABLE, SELECT SEQUENCE, SELECT TABLE, UPDATE TABLE

触发器按照不同的分法,有不同的分类,主要有以下两种:

3.
对于语句和权限审计,生效从执行语句后下一个登陆用户开始,当前的所有session不受影响。而对象的审计,则从审计语句开始后对当前所有的用户生效。

按触发的时间可分为:BEFORE触发器和AFTER触发器

  1. 可以使用NOAUDIT ALL、NOAUDIT ALL
    PRIVILEGE取消所有的语句、权限的审计,但是如果在审计的时候指定了用户,则NOAUDIT
    ALL或NOAUDIT ALL
    PRIVILEGE的时候,不会取消这些明确用户的审计,必须在NOAUDIT的时候也明确的指出相应的用户。

按触发的类型可分为:行触发器,语句触发器和INSTEAD OF触发器

 

下面,我们结合具体的实例来演示不同的触发器。

图片 22、和审计相关的三个主要参数

一、 BEFORE触发器


范例一:

(1). Audit_sys_operations

create or replace trigger student_i
before insert on student
for each row
BEGIN
  :NEW.student.id := student_seq.nextval;
  :NEW.created_by := USER;
  :NEW.created_date := SYSDATE;
END;

默认为false,当设置为true时,所有(注意是所有!)sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录

注意:触发器包含伪记录:NEW,使得你可以访问正被插入student表的数据行。为访问伪记录:NEW的单独成员,需要使用点符号:

audit
trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn
/as sysdba这样的连接信息,只能记录在其它地方。

        通过PL/SQL表达式访问序列是Oracle 11g的新特性。在Oracle
11g之前,只能通过以下方式获取:

如果是windows平台,audti
trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中

        select student_seq.nextval into v_student_id from dual;

(2). Audit_trail

        :NEW.student.id := v_student_id

有三个取值

范例二:

create or replace trigger emp_update
before update or delete or insert on emp
for each row
begin
   if updating or deleting or inserting then
      raise_application_error(-20001,'The table emp can not be modified');
   end if;
end;

注:这两个参数是static参数,需要重新启动数据库才能生效。

该触发器的代码部分有三个布尔函数-updating,deleting,inserting,如果对这个表执行update操作,则函数updating的值为TRUE;如果对这个表执行delete操作,则函数deleting的值为TRUE。insert操作亦然。

(3). Audit_file_dest

范例三:

存放审计日志的目录

create or replace trigger emp_update
before update of sal on emp
for each row
begin
   if updating then
       raise_application_error(-20001,'Salary can not be modofied');
   end if;
end;

 

可见,对某列也可使用触发器

图片 33、审计级别

二、 AFTER触发器


范例四:

当开启审计功能后(audit_trail=DB/OS),可在三个级别对数据库进行审计:Statement(语句)   
、Privilege(权限)、object(对象)

create or replace trigger dept_delete
after delete on dept
for each row
begin
   if deleting then
      delete from emp where deptno = :old.deptno;
   end if;
end;

(1). Statement

dept和emp表存在外键约束,即dept表的主键deptno是emp表的外键,当我们删除dept表的行记录时,如果待删除的deptno在emp表中存在对应的记录,则会报ORA-02292:
integrity constraint (SCOTT.FK_DEPTNO) violated – child record
found。构造触发器如上,当我们删除dept的行记录时,会自动删除deptno在emp表中对应的行记录。

按语句来审计,

三、 自治事务

比如audit table
会审计数据库中所有的create table,drop table,truncate table语句,alter
session by cmy会审计cmy用户所有的数据库连接。

     
 trigger语句块中不能含有事务处理语句,如commit和rollback。倘若需要需要事务处理语句,则必须用到自治事务。

(2). Privilege

四、 行触发器

按权限来审计,当用户使用了该权限则被审计,

     
 行触发器指的是触发器被触发的次数等同于触发语句所影响的数据行数量。当语句FOR
EACH ROW出现在CREATE TRIGGER子句中,该触发器就是行触发器。

如执行grant select any table to a; audit
select any table;语句后,当用户a 访问了用户b的表时(如select * from
b.t;)会用到select any
table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。

       上述范例均属于行触发器。

(3). Object

五、 语句触发器

按对象审计,只审计on关键字指定对象的相关操作,

     
 对于语句触发器而言,每执行一次触发语句,该触发器就会执行一次,也就是说,不管触发语句影响多少数据行,该触发器只会执行一次。

如aduit alter,delete,drop,insert on cmy.t
by scott;
这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计.

     
 当该触发器所执行的操作不依赖于单独记录中的数据时,就应该使用语句触发器。例如,如果希望限制只能在上班时间访问emp表,就应该使用语句触发器。

注意Oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on
default子句来实现自动审计,比如执行audit drop on default by access;后,
对于随后创建的对象的drop操作都会审计。

范例五:

但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比trigger可以对schema的DDL进行“审计”,这个功能稍显不足。

create or replace trigger emp_record
before insert or update or delete on emp
declare
   v_day varchar2(10);
begin
   v_day := rtrim(to_char(sysdate,'DAY'));
   if v_day in ('SATURDAY','SUNDAY') then 
      raise_application_error(-20000,'The table can not be modified during off hours');
   end if;
end;

 

EMP表只能在工作日修改。

图片 44、审计的一些其他选项

六、 替代触发器


     
 到目前为止,我们所涉及的触发器都是基于表的,其实,Oracle还提供了另一种触发器,这种触发器是在数据库视图上创建的,即替代触发器。替代触发器会代替基于视图的DML操作(INSERT、UPDATE、DELETE),而直接作用于底层的数据库表。我们来看看下面的实验:

by access / by session

      1> 创建视图

:by access
每一个被审计的操作都会生成一条audit trail。 by
session,一个会话里面同类型的操作只会生成一条audit trail。 默认为by
session

       SQL> create or replace view v_test as select
e.empno,e.ename,d.deptno,d.dname from emp e,dept d where
e.deptno=d.deptno;

whenever [ not ] successful

      2> 查询视图

:whenever successful
操作成功(dba_audit_trail中returncode字段为0) 才审计,whenever not
successful反之。 省略该子句的话,不管操作成功与否都会审计。

       SQL> select * from v_test;

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图