Oracle 11g 审计跟踪管理

在Oracle11g之前,oracle数据库自带的审计功能是关闭的,考虑到性能和审计管理的复杂性,用户一般不打开审计功能。如果有审计要求,DBA会采用trigger来实现对DDL审计的方法来折中。例如类似下面代码实现:

 

create or replace trigger sys.ddl_trigger

after DDL on database

BEGIN

insert into event_table

values (ora_sysevent,

ora_login_user,

ora_instance_num,

ora_database_name,

ora_dict_obj_name,

ora_dict_obj_type,

ora_dict_obj_owner,

sysdate);

END;

/

这种trigger审计很轻便,但功能有限,只能对DDL做一些记录跟踪,并且记录信息也不全面,如用户执行的完整的语句就不能记录下来,管理上也有诸多不便,如数据清理。在Oracle11g,Oracle不仅加强了审计的功能,同时也对自身的数据库审计(区别于第三方的审计产品)有了很大信心,Oracle官方宣称默认启用的审计日志不会对绝大多数产品数据库的性能带来过大的负面影响,11g默认启用数据库审计选项,AUDIT_TRAIL参数的缺省值为DB,这意为着审计数据将记录在数据库中的AUD$审计字典基表上。

注意,因为在11g中CREATE SESSION将被作为受审计的权限来被记录,因此当SYSTEM表空间因磁盘空间而无法扩展时将导致这部分审计记录无法生成,这将最终导致普通用户的新会话将无法正常创建,普通用户将无法登陆数据库。默认情况下表空间会以AUTOEXTEND ON自动扩展选项创建SYSTEM表空间,因此系统表空间在必要情况下还是会自动增长的,我们所需注意的是磁盘上的剩余空间是否能够满足其增长需求即可,但是数据文件扩展是有上限的,对于普通的8k smallfile表空间而言单个数据文件的最大尺寸是32G。

为了便于管理Oracle审计,袋鼠云提供了集中审计管理功能,其产品设计思路如下:

1、审计的关闭和打开

2、审计数据迁移

3、自动化审计数据清理

4、审计统计分析

一、审计的关闭和打开

袋鼠云前台界面提供了Oracle标准审计的所有功能,如登录审计、语句审计、权限审计、特定对象审计等等。用户可以灵活的选择审计的打开和关闭,审计所针对的对象和权限等。

二、审计数据迁移

考虑到DB,EXTENDED审计数据默认使用SYSTEM表空间,DTOPS提供一键数据迁移功能,底层调用的代码如下:比如将标准审计表迁入USERS表空间

BEGIN

  DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(

    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,

    AUDIT_TRAIL_LOCATION_VALUE => 'USERS'

  );

END;

/

三、自动化审计数据清理

前文已经说过,数据库的审计信息一般较重,尤其在打开登录审计后,所有session的登录和退出都会在审计表中留有记录,由于表空间或者存储的限制,如果不能写入审计记录,数据库执行需要有审计的操作将被挂起,比如打开了CREATE SESSION审计,由于空间限制普通用户将不能登录数据库。需要有关办法来灵活的管理数据库的审计记录空间。

下面介绍自动清理数据的方法,针对已经分析过的老数据做自动清理,首先要初始化清理策略:

begin

  dbms_audit_mgmt.init_cleanup(

    audit_trail_type            => dbms_audit_mgmt.audit_trail_db_std,

    default_cleanup_interval    => 24 );

end;

/

这个INIT_CLEANUP过程设计到两个参数:

audit_trail_type:指要设置的清理类型,这里是audit_trail_db_std,标准的数据库审计跟踪,即aud$表。

default_cleanup_interval:这个值表示每隔多少时间执行清理任务,24即24小时。

相关审计类型:

Parameter

Description

audit_trail_aud_std

The standard AUD$ audit trail in the database

audit_trail_fga_std

The FGA_LOG$ table, for Fine Grained Auditing

audit_trail_db_std

Both standard and FGA audit trails

audit_trail_os

The OS audit trail

audit_trail_xml

The XML audit trail

audit_trail_files

Both OS and XML audit trails

audit_trail_all

All of the above

设置完初始化清理参数后,实际上在调用清理任务时,会发现并没有达到你的预期,可能数据一条都没有清理掉,我们还需要设置另一个过程参数SET_LAST_ARCHIVE_TIMESTAMP,它的作用是告诉清理进程一个审计归档时间戳,这个过程接收三个参数:

audit_trail_type:要清理的审计类型,如audit_trail_aud_std

last_archive_time:最后一次归档时间,可以手工设置

rac_instance_number:RAC的话可以指定实例号

具体示例如下:

begin

   dbms_audit_mgmt.set_last_archive_timestamp(

     audit_trail_type  => dbms_audit_mgmt.audit_trail_aud_std,

     last_archive_time =>

        to_timestamp('2016-03-30 10:00:00','YYYY-MM-DD HH24:MI:SS'),

     rac_instance_number  => null

   );

end;

/

执行上段程序后,你可以在DBA_AUDIT_MGMT_LAST_ARCH_TS视图中查到相关信息。

有了归档时间后,就可以执行真正的清理程序了。

begin

  dbms_audit_mgmt.clean_audit_trail(

   audit_trail_type        =>  dbms_audit_mgmt.audit_trail_aud_std,

   use_last_arch_timestamp => TRUE

  );

end;

/

同样,audit_trail_type表示清理的审计类型,use_last_arch_timestamp => TRUE,表示用最后的归档时间,如果为false,将会清理掉audit_trail_aud_std类型的所有审计信息。上面是手工清理的方法,设置了清理时间点后运行清理过程。下一步看自动清理怎么做:

将采用数据库的自动任务来实现,第一个任务,自动产生清理时间点:

BEGIN

  DBMS_SCHEDULER.CREATE_JOB (

    job_name   => 'DAILY_AUDIT_ARCHIVE_TIMESTAMP',

    job_type   => 'PLSQL_BLOCK',

    job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE =>

                   DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,LAST_ARCHIVE_TIME => sysdate-10); END;',

    start_date => sysdate,

    repeat_interval => 'FREQ=HOURLY;INTERVAL=24',

    enabled    =>  TRUE,

    comments   => 'Create an archive timestamp'

  );

END;

/

第二个任务,根据时间点自动清理:

BEGIN

  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(

    AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,

    AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,

    AUDIT_TRAIL_PURGE_NAME     => 'Daily_Audit_Purge_Job',

    USE_LAST_ARCH_TIMESTAMP    => TRUE

  );

END;

/

完成以上两步后,可以在DBA_AUDIT_MGMT_CLEANUP_JOBS数据字典视图中查看到这两个任务的相关信息。

到此数据库审计自动清理就可以实现了,但是从数据库的性能考虑,如果您的数据库很大,几个T或者几十T,您的审计数据也很庞大,一天的数据量上G,我们就得考虑数据的审计清理的性能,因为以上的审计清理时delete操作,不是truncate操作,oracle11g也提供了一个很好的解决方法,设置清理批处理时commit行数。如下:

begin

 dbms_audit_mgmt.set_audit_trail_property(

  audit_trail_type            => dbms_audit_mgmt.audit_trail_aud_std,

  audit_trail_property        => dbms_audit_mgmt.db_delete_batch_size,

  audit_trail_property_value  => 100000);

end;

/

三个参数,一看就懂,audit_trail_type清理类型,audit_trail_property设置删除批处理,audit_trail_property_value表示每次commit行数100000。

这篇文档主要介绍了Oracle11g审计跟踪管理相关的知识点,如审计表迁移,Oracle审计不同的类型,审计的定时自动清理等。这里仅仅介绍袋鼠云相关审计功能实现原理,至于针对审计数据的集中收集,展现方法已不属于审计跟踪管理的范畴。袋鼠云目前主要支持的数据库有MySQL、Oracle,比如对基于阿里云上或云下Oracle数据库提供一系列解决方案,如数据库自动部署、备份管理、容灾管理、恢复管理、容灾切换管理、性能监控等等。

原文地址:https://www.cnblogs.com/dtstack/p/9760508.html