不一样的天空w

暂无签名

  • 博客访问: 82457
  • 博文数量: 514
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-22 15:29
  • 认证徽章:
个人简介

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(514)

文章存档

2017年(350)

2016年(159)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
【审计】基于值审计 2016-10-21 07:46:11

分类: Oracle

进行数据库审计时会记录审计对象中发生的插入、更新和删除操作,但是不会捕获更改的实际值。
要扩展数据库审计,可使用基于值的审计,利用数据库触发器(事件驱动的PL/SQL 构造)来捕获更改的值。
用户在连接了相应触发器的表中插入、更新或删除数据时,触发器在后台将审计信息复制到包含审计信息的表中。
因为审计触发器代码在每次插入、更新或删除操作发生时都必须执行,所以与标准数据库审计相比,使用基于值的审计时,性能下降幅度比较大。
性能下降幅度取决于触发器代码的效率。只在标准数据库审计捕获的信息不足的情况下,才使用基于值的审计。
基于值的审计由用户或第三方代码实施。Oracle DB 提供了可用来构建基于值的审计系统的PL/SQL 构造。
基于值的审计的关键部分是审计触发器,这是一个单纯为了捕获审计信息而构造的PL/SQL 触发器。

基于值审计(以触发器为核心)


一、示例

create or replace trigger system.hrsalary_audit
after update of salary on hr.employees
referencing new as new old as old
for each row
begin
if :old.salary != :new.salary then
insert into system.audit_employees
values
(sys_context('userenv', 'os_user'), sysdate,
sys_context('userenv', 'ip_address'),
:new.employee_id || ' salary changed from ' || :old.salary || ' to '||:new.salary
);
end if;
end;
/

触发器是创建在 system 用户下的,针对 hr 用户的 employees 表的 salary 字段进行基于值的审计,如果对表 employees 表的 salary
字段进行了更新,那么就会触发 hrsalary_audit,如果更新后的 salary值与原来的值不同,那么就把做更新这个动作的操作系统用户名IP
地址都记录到表system.audit_employees,同时将 salary 的值也记录下来。

 

二、实际应用测试
1) 创建日志表 db_ddl_log

SYS@ORA11GR2>create table db_ddl_log(logdate date default sysdate,username varchar2(200),ddltype varchar2(200),objecttype varchar2(200),objectname varchar2(200),objectownner varchar2(200),ipaddress varchar2(18)) tablespace users;

 

Table created.

 

——解释:【

comment on column DB_DDL_LOG.LOGDATE is '记录日期';
comment on column DB_DDL_LOG.USERNAME is '
用户名';
comment on column DB_DDL_LOG.DDLTYPE is 'DDL
类型三种: alter,drop,create;
comment on column DB_DDL_LOG.OBJECTTYPE is '操作对象类型';
comment on column DB_DDL_LOG.OBJECTNAME is '
操作对象名称';
comment on column DB_DDL_LOG.OBJECTOWNNER is '
操作对象拥有者';
comment on column DB_DDL_LOG.IPADDRESS is 'IP
地址';


2) 创建日志表 eventlog

SYS@ORA11GR2>create table eventlog (

  2  oper_time date default sysdate,

  3  eventname varchar2(20),

  4  obj_type varchar2(20),

  5  obj_name varchar2(20),

  6  obj_owner varchar2(20),

  7  ip_addr  varchar2(18),

  8  os_user  varchar2(200),

  9  terminal varchar2(200),

 10  host_name varchar2(200),

 11  user_name varchar2(200),

 12  session_id number

 13  ) tablespace users;

 

Table created.

 

——解释:【

comment on column EVENTLOG.OPER_TIME is 'DDL 时间';
comment on column EVENTLOG.EVENTNAME is '
事件类型: create alter drop';
comment on column EVENTLOG.OBJ_TYPE is '
目标类型: table procedure function ';
comment on column EVENTLOG.OBJ_NAME is '
目标名称';
comment on column EVENTLOG.OBJ_OWNER is '
目标所在用户';
comment on column EVENTLOG.IP_ADDR is '
终端 IP';

comment on column EVENTLOG.OS_USER is '终端操作系统用户名';
comment on column EVENTLOG.TERMINAL is '
终端名称';
comment on column EVENTLOG.HOST_NAME is '
终端主机名';
comment on column EVENTLOG.USER_NAME is '
执行 DDL oracle 用户名';
comment on column EVENTLOG.SESSION_ID is '
会话 ID';

 

1)  创建写入日志的过程包

SYS@ORA11GR2>create or replace package pkg_ddl

  2  is

  3  /*

  4  * author:wangxuebing

  5  * created date:2016-09-22

  6  */

  7  procedure sp_trg_ddlcreate;

  8  procedure sp_trg_ddlalter;

  9  procedure sp_trg_ddldrop;

 10  procedure sp_ddlall;

 11  end pkg_ddl;

 12  /

 

Package created.

 

SYS@ORA11GR2>create or replace package body pkg_ddl

  2  is

  3  /*

  4  * author:wangxuebing

  5  * created date:2016-09-22

  6  */

  7  procedure sp_trg_ddlcreate

  8  is

  9  begin

 10  insert into db_ddl_log

 11  values (sysdate, user, 'create', sys.dictionary_obj_type,

 12  sys.dictionary_obj_name, sys.dictionary_obj_owner,

 13  sys_context ('userenv', 'ip_address'));

 14  end sp_trg_ddlcreate;

 15  procedure sp_trg_ddlalter

 16  is

 17  begin

 18  insert into db_ddl_log

 19  values (sysdate, user, 'alter', sys.dictionary_obj_type,

 20  sys.dictionary_obj_name, sys.dictionary_obj_owner,

 21  sys_context ('userenv', 'ip_address'));

 22  end sp_trg_ddlalter;

 23  procedure sp_trg_ddldrop

 24  is

 25  begin

 26  insert into db_ddl_log

 27  values (sysdate, user, 'drop', sys.dictionary_obj_type,

 28  sys.dictionary_obj_name, sys.dictionary_obj_owner,

 29  sys_context ('userenv', 'ip_address'));

 30  end sp_trg_ddldrop;

 31  procedure sp_ddlall

 32  is

 33  begin

 34  insert into eventlog

 35  (eventname, obj_type, obj_name, obj_owner, ip_addr,

 36  os_user, terminal, host_name, user_name, session_id)

 37  select sys.sysevent, sys.dictionary_obj_type,

 38  sys.dictionary_obj_name, sys.dictionary_obj_owner,

 39  sys_context ('userenv', 'ip_address'),

 40  sys_context ('userenv', 'os_user'),

 41  sys_context ('userenv', 'terminal'),

 42  sys_context ('userenv', 'host'), ora_login_user,

 43  sys_context ('userenv', 'sessionid')

 44  from dual;

 45  end sp_ddlall;

 46  end pkg_ddl;

 47  /

 

Package body created.

 

2)  创建基于值审计的触发器(触发器的处理动作都源于 pkg_ddl 包,请仔细阅读此包)

SYS@ORA11GR2>create or replace trigger trg_dbddl_alter_log

  2  after alter on database

  3  begin

  4  pkg_ddl.sp_trg_ddlalter;

  5  end trg_dbddl_alter_log;

  6  /

 

Trigger created.

 

SYS@ORA11GR2>create or replace trigger trg_dbddl_create_log

  2  after create on database

  3  begin

  4  pkg_ddl.sp_trg_ddlcreate;

  5  end trg_dbddl_create_log;

  6  /

 

Trigger created.

 

SYS@ORA11GR2>create or replace trigger trg_dbddl_drop_log

  2  after drop on database

  3  begin

  4  pkg_ddl.sp_trg_ddldrop;

  5  end trg_dbddl_drop_log;

  6  /

 

trigger created.

 

--注,下面这个触发器约等同于上面三个触发器

SYS@ORA11GR2>create or replace trigger trg_dbddl_log

  2  after ddl on database

  3  begin

  4  pkg_ddl.sp_ddlall;

  5  end trg_dbddl_alter_log;

  6  /

 

Trigger created.

 

3)  测试:(自行测试)
创建、修改、删除一张表,测试触发器的结果


阅读(39) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册