Oracle12.2c统一审计(unified auditing)六问

摘要:
Oracle12.2c统一审计六个问题conghe67162018-11-2615:42:15325集合1概述统一审计系统是Oracle在12c中引入的一种新的日志系统。在新系统下,Oracle提供了更精细的管理,并将所有审计记录以统一格式_ audit_ TRAIL视图视图写入AUDSYS模式。什么是完全统一的审计模式和混合审计模式?禁用统一审核方法。以单机为例:shutdowncd$ORACLE_HOME/rdbms/libmke-fins_rdbms。mkuniaud_offoracles启动的混合审计模式,只要开放统一审计策略,就会形成统一审计和传统审计并存的局面。这是混合审计模式。通过隐式参数_统一_审计_冲洗_间隔控制。
Oracle12.2c统一审计(unified auditing)六问
conghe6716 2018-11-26 15:42:15 325 收藏 1
 
 
概述

      统一审计体系是Oracle在12c推出的新的日志体系。12.1和12.2虽然都属于该体系,但是12.1与12.2版本相比,明显给人一种半成品的感觉。包括基表,删除行为等方面存在较大差异,有兴趣的可以去了解一下,本文主要以12.2讲述。

1. 什么是统一审计?

2. 如何检查统一审计是否开启?

3. 审计数据落盘策略是什么?

4. 如何将操作系统上的审计数据写入数据库统一审计文件中?

5. 删除审计的两种方法?

6. 统一审计生产实战配置?

什么是统一审计?

审计是指监控和记录用户对数据库执行所有成功或失败的操作。

而统一审计( UNIFIED_AUDIT_TRAIL )是 Oracle 在 12c 版本推出的一种全新的审计体系。在新的体系下, Oracle 提供了更精细化的管理,并且将所有的审计记录按照统一的格式写入到 AUDSYS schema 下,可以通过 UNIFIED_AUDIT_TRAIL 视图查看。默认地,审计记录会被存放在 SYSAUX 表空间下。当然, Oracle 也建议将审计数据从 SYSAUX 中剥离出来放到新的表空间下,这一功能可以通过 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION 包实现。

统一审计的相关权限?

除了 SYS 用户外,只有被赋予 AUDIT_ADMIN 或 AUDIT_VIEWER 的用户才能看到 UNIFIED_AUDIT_TRAIL 数据字典视图。如果用户只需要查询 UNIFIED_AUDIT_TRAIL ,但是不需要创建审计策略 (audit policy) ,那么只需要赋予 AUDIT_VIEWER role 就可以了。

如何检查统一审计是否开启?

SQL> SELECT VALUE FROM V$OPTION WHERE   PARAMETER = 'Unified Auditing';

VALUE

----------------------------------------------------------------

FALSE

TRUE: 代表完全统一审计开启;

FALSE :代表传统审计和统一审计的混合模式。

什么是完全统一审计模式 (Pure unified auditing) 和混合审计模式 (Mixed Mode Auditing) ?

完全统一审计模式,顾名思义,就是摒弃了之前的传统审计模式。

禁用统一审计方法 , 以单机为例:

shutdown

cd $ORACLE_HOME/rdbms/lib

make -f ins_rdbms.mk uniaud_off ioracle

startup

混合审计模式,只要开启了统一审计策略,就会形成统一审计和传统审计并存的局面,此时就是混合审计模式。默认建库时会启用 ORA_SECURECONFIG ,一个统一审计策略,这也就意味着默认建库时,就是混合审计模式。

ORA_SECURECONFIG 详情如下:

CREATE AUDIT POLICY ORA_SECURECONFIG

 PRIVILEGES ALTER ANY TABLE, CREATE ANY   TABLE, DROP ANY TABLE,

            CREATE ANY PROCEDURE, DROP ANY   PROCEDURE, ALTER ANY PROCEDURE,

            GRANT ANY PRIVILEGE, GRANT ANY   OBJECT PRIVILEGE, GRANT ANY ROLE,

            AUDIT SYSTEM, CREATE EXTERNAL   JOB, CREATE ANY JOB,

            CREATE ANY LIBRARY,

            EXEMPT ACCESS POLICY,

            CREATE USER, DROP USER,

            ALTER DATABASE, ALTER SYSTEM,

            CREATE PUBLIC SYNONYM, DROP   PUBLIC SYNONYM,

            CREATE SQL TRANSLATION PROFILE,   CREATE ANY SQL TRANSLATION PROFILE,

            DROP ANY SQL TRANSLATION PROFILE,   ALTER ANY SQL TRANSLATION PROFILE,

            TRANSLATE ANY SQL,

            EXEMPT REDACTION POLICY, 

            PURGE DBA_RECYCLEBIN, LOGMINING,

            ADMINISTER KEY MANAGEMENT

 ACTIONS      ALTER USER, CREATE ROLE, ALTER ROLE, DROP ROLE,

            SET ROLE, CREATE PROFILE, ALTER   PROFILE,

            DROP PROFILE, CREATE DATABASE   LINK,

            ALTER DATABASE LINK, DROP   DATABASE LINK,

            CREATE DIRECTORY, DROP DIRECTORY,

            CREATE PLUGGABLE DATABASE, 

            DROP PLUGGABLE DATABASE,

            ALTER PLUGGABLE DATABASE,

            EXECUTE ON DBMS_RLS;

审计数据落盘策略是什么?

审计数据写入数据文件有两种方式:

1. immediate-write mode 立即写

2. queued-write mode 队列写

立即写是将产生的审计数据马上写入硬盘,这样可以保证不丢失审计数据,但是对系统系统会有些许影响。

队列写是先将审计数据写入 SGA ,而不是直接写入数据文件,根据一定的策略再将审计数据写入数据文件。一般有两种策略:

l   时间策略:每隔三秒钟,视系统繁忙程度,也可能三秒钟了也没有写入。由隐含参数 _unified_audit_flush_interval 控制。

l   空间策略:存放在 SGA 中的审计数据容量达到 85% 。该区域默认是 1M ,由参数 unified_audit_sga_queue_size 控制,比例由隐含参数 _unified_audit_flush_threshold 控制

SQL> col name for a30;

SQL> col value for a10;

SQL> select * from

    2  (select

    3  x.ksppinm name,

    4  y.ksppstvl value,

    5  y.ksppstdf isdefault,

    6    decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')   ismod,

    7    decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj

    8  from

    9  sys.x$ksppi x,

 10    sys.x$ksppcv y

 11    where

 12    x.inst_id = userenv('Instance') and

 13    y.inst_id = userenv('Instance') and

 14    x.indx = y.indx

 15    order by

 16    translate(x.ksppinm, ' _', ' ')) T where T.name like   '%unified_audit%';

NAME                           VALUE      ISDEFAULT ISMOD      ISADJ

------------------------------ ----------   --------- ---------- -----

_unified_audit_flush_interval  3            TRUE      FALSE      FALSE

_unified_audit_flush_threshold 85         TRUE      FALSE      FALSE

_unified_audit_policy_disabled FALSE      TRUE      FALSE      FALSE

unified_audit_sga_queue_size   1048576      TRUE      FALSE      FALSE

当前落盘方式

SQL> SELECT PARAMETER_VALUE

    2  FROM   DBA_AUDIT_MGMT_CONFIG_PARAMS

    3  WHERE PARAMETER_NAME = 'AUDIT   WRITE MODE';

PARAMETER_VALUE

-----------------------------------------------------------------

QUEUED WRITE MODE

修改为 immediate-write mode

BEGIN

 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE,

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_IMMEDIATE_WRITE);

END;

/

修改为

BEGIN

 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE,

    DBMS_AUDIT_MGMT.AUDIT_TRAIL_QUEUED_WRITE);

END;

/

队列写模式下如何手动 flush 审计数据?

手动刷新当前实例,适用于单机和 rac 单实例

EXEC   DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL;

EXEC DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(DBMS_AUDIT_MGMT.FLUSH_CURRENT_INSTANCE);

Flush RAC 所有实例

EXEC   DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(DBMS_AUDIT_MGMT.FLUSH_ALL_INSTANCES);

   

对于多租户环境

当前 PDB

BEGIN   

 DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(

    CONTAINER  =>   DBMS_AUDIT_MGMT.CONTAINER_CURRENT);

END;

/

所有的 PDB 环境

BEGIN   

 DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL(

    CONTAINER  =>   DBMS_AUDIT_MGMT.CONTAINER_ALL);

END;

/

如何将操作系统上的审计数据写入数据库统一审计文件中?

当数据库 mount 状态,或者 read only ,或者关闭时, Oracle 会将审计数据存放在操作系统的 $ORACLE_BASE/audit/$ORACLE_SID 目录下。

查看当前操作系统下

oracle@bd-dev-mingshuo-183:/opt/app/oracle/audit/mingdb/70A2182C94E1412DE053B7D91FAC647A$ll

total 32

-rw------- 1 oracle oinstall 30720 Jul 10   16:57 ora_audit_0786.bin

登入数据库执行

EXEC DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES;

命令完成之后,操作系统那个文件就消失了。

每个 PDB 会有一个同名的 uuid 目录,如果要将 pdb 的数据导入数据库,那么需要在 pdb 中执行上述命令。

删除审计的两种方法?

1. 自动清理任务

设置清理时间点

BEGIN

    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(

     AUDIT_TRAIL_TYPE     =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

     LAST_ARCHIVE_TIME    =>  '12-OCT-2013 06:30:00.00',

     RAC_INSTANCE_NUMBER  =>  1,

     CONTAINER            =>   DBMS_AUDIT_MGMT.CONTAINER_CURRENT);

END;

/

AUDIT_TRAIL_TYPE :指定审计数据类型

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED :统一审计数据

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD : AUD$ 表

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD : FGA_LOG$ 表

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS :操作系统上 .aud 结尾的文件

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_XML : XML 文件

LAST_ARCHIVE_TIME :指定时间,设置后该时间可以从 DBA_AUDIT_MGMT_LAST_ARCH_TS 中查出,设置时间点的意义在于,会清理这个时间点之前的归档过的数据。

RAC_INSTANCE_NUMBER : RAC 数据库相关参数。单实例不需要设置。默认值是 null 。因为 RAC 数据库也只有一个 AUD$ 表和 FGA_LOG$ 表

,那么即使是 RAC 数据库,对应的审计类型 DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD 和 DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD ,那么也不用设置这个值。

CONTAINER :适用于多租户环境

l   DBMS_AUDIT_MGMT.CONTAINER_CURRENT :指定当前 PDB

l   DBMS_AUDIT_MGMT.CONTAINER_ALL :所有 PDB

当上述设置完成后,就可以用 DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 包清理设置的时间点之前的审计数据。

BEGIN

DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(

     audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

     use_last_arch_timestamp => TRUE);

END;

/

创建清理 job

BEGIN

    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (

     AUDIT_TRAIL_TYPE              => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

     AUDIT_TRAIL_PURGE_INTERVAL    => 12,

     AUDIT_TRAIL_PURGE_NAME        => 'Audit_Trail_PJ',

     USE_LAST_ARCH_TIMESTAMP       => TRUE,

     CONTAINER                     => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);

END;

/

AUDIT_TRAIL_TYPE: 指定审计数据类型

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED :统一审计数据

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD :针对 AUD$ 表

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD :针对 FGA_LOG$ 表

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD :针对 AUD$ 表和 FGA_LOG$ 表

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS :操作系统上 .aud 结尾的文件

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_XML : XML 文件

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_FILES :操作系统上 .aud 结尾的文件和 XML 文件

l   DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL :上述所有类型的审计数据

AUDIT_TRAIL_PURGE_INTERVAL : job 每隔多久就运行一次,单位是小时。如果后面想要更改这个值,那么可以用 DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL 包。

USE_LAST_ARCH_TIMESTAMP :清理数据的时间选项

l   TRUE: 清理截止到上次归档的时间点

l   FLASE: 删除所有的数据

CONTAINER :多租户环境适用

l   DBMS_AUDIT_MGMT.CONTAINER_CURRENT : PDB 级别

l   DBMS_AUDIT_MGMT.CONTAINER_ALL : CDB 和 PDB 级别

设置好 job 后,启动

BEGIN

 DBMS_AUDIT_MGMT.SET_PURGE_JOB_STATUS(

    AUDIT_TRAIL_PURGE_NAME        => 'Audit_Trail_PJ',

    AUDIT_TRAIL_STATUS_VALUE      => DBMS_AUDIT_MGMT.PURGE_JOB_ENABLE);

END;

/

AUDIT_TRAIL_PURGE_NAME : purge job 策略的名字,就是上面 CREATE_PURGE_JOB 里指定的。

AUDIT_TRAIL_STATUS_VALUE :

l   DBMS_AUDIT_MGMT.PURGE_JOB_ENABLE :开启

l   DBMS_AUDIT_MGMT.PURGE_JOB_DISABLE :停止

修改 job 运行间隔

BEGIN

 DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL(

    AUDIT_TRAIL_PURGE_NAME         => 'Audit_Trail_PJ',

    AUDIT_TRAIL_INTERVAL_VALUE     => 24);

END;

/

删除清理 job

BEGIN

 DBMS_AUDIT_MGMT.DROP_PURGE_JOB(

    AUDIT_TRAIL_PURGE_NAME  =>   'Audit_Trail_PJ');

END;

/

2. 手动清理审计

BEGIN

    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(

     AUDIT_TRAIL_TYPE             =>    DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

     USE_LAST_ARCH_TIMESTAMP    =>  TRUE,

     CONTAINER                    =>    DBMS_AUDIT_MGMT.CONTAINER_CURRENT );

END;

/

各参数含义同上。

统一审计生产实战配置?

为了防止审计数据过多,需要定期对审计数据进行清理。

移动审计表空间

BEGIN

    DBMS_AUDIT_MGMT.set_audit_trail_location(

      audit_trail_type           =>   DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,

      audit_trail_location_value => 'TBS_MING');

END;

/

设置 purge job

BEGIN

    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (

     AUDIT_TRAIL_TYPE              => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,

     AUDIT_TRAIL_PURGE_INTERVAL    => 24,

     AUDIT_TRAIL_PURGE_NAME        => 'Unified_Audit_Trail_PURGEJOB',

     USE_LAST_ARCH_TIMESTAMP       => TRUE);

END;

/

上面的 job 在运行时,要根据 SET_LAST_ARCHIVE_TIMESTAMP 的时间,下面的 job 可以手动刷新这个时间,不然上面的 job 最多只运行一次。

BEGIN

    DBMS_SCHEDULER.create_job (

      job_name        => 'audit_last_archive_time',

      job_type        =>   'PLSQL_BLOCK',

      job_action      => 'BEGIN

                         DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,   TRUNC(SYSTIMESTAMP)-60);

                        END;',

      start_date      =>   SYSTIMESTAMP,

      repeat_interval => 'freq=daily; byhour=0; byminute=0; bysecond=0;',

      end_date        => NULL,

      enabled         => TRUE,

      comments        =>   'Automatically set audit last archive time.');

END;

/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31480688/viewspace-2221638/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31480688/viewspace-2221638/

免责声明:文章转载自《Oracle12.2c统一审计(unified auditing)六问》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pytest文档40-pytest.ini配置用例查找规则(面试题)Springboot21 整合redis、利用redis实现消息队列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle查询连接数、并发数、共享池大小

1、查看当前数据库建立的会话情况: select sid,serial#,username,program,machine,status from v$session; 2、查询数据库当前进程的连接数: select count(*) from v$process; 3、查看数据库当前会话的连接数: select count(*) from v$sessi...

20万DBA都在关注的12个问题 [转载]

引言 近期我们在DBASK小程序新关联了韩锋频道、互联网侦察、数据库SQL、SQL数据库开发、跨界架构师、石杉的架构笔记等数据领域的公众号,聚合更新展示,欢迎大家阅读分享。 问答集萃 接下来,我们分享本期整理出的问题和诊断总结,供大家参考学习,详细的诊断分析过程可以通过标题链接跳转到小程序中查看。 问题一、Windows 系统是否需要设置filesyste...

Oracle中动态SQL详解

1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序...

64/32位oracle客户端安装配置详细教程

如何连接远程oracle数据库? 之前的文章我们讲过linux程序员第一天需要配置scrt工具和ue工具,如果公司使用数据库产品的话,我们还需要了解如何去连接远程数据,接下来我们来介绍如何连接远程服务器上的oracle数据,以linux主机上的数据库为例. 首先来了解一下连接数据库具备的条件: 远程主机有oracle,并且已经启动. 本机装有oracle...

MyBatis(四)映射文件 之 参数获取详解#{} 与 ${}

一、#{} 与${} 的取值 相同点: #{}:可以获取map中的值或者pojo对象属性的值; ${}:可以获取map中的值或者pojo对象属性的值; 区别: #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入; ${}:取出的值直接拼装在sql语句中;会有安全问题; 大多情况下,我们去参数的值都应该去使...

Oracle 表空间

表空间(table space)是Oracle数据库中最大的逻辑结构。从逻辑上说,Oracle数据库是由若干个表空间组成的。表空间与数据库的物理结构有着十分密切的关系,它与磁盘上若干个数据文件相对应。从物理上说数据库的数据被存放在数据文件中,从逻辑上说数据是被存放在表空间中。 表空间是个重要的概念,因为它提供了一套有效组织数据的方法。数据库的逻辑配置实际上...