1.Audit的概念

Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析。利用Audit功能,可以完成以下任务:

  • 监视和收集特定数据库活动的数据。例如管理员能够审计哪些表被更新,在某个时间点上有多少个并行用户统计数据;
  • 保证用户对自己的活动负责。这些活动包括在特定模式、特定表、特定行等对象上进行的操作;
  • 审计数据库中的可疑活动。如一个未经授权的用户正从表中删除数据,那么数据库管理员必须审计所有数据库连接,以及在数据库中所有成功和失败的删除操作。

根据审计类型不同,审计记录中的信息也有所不同。通常,一条审计记录中包含用户名、会话标识、终端标识、所操作的模式对象名称、执行的操作、执行的完整语句代码、日期和时间戳、所使用的系统权限。

2.Audit的分类

在oracle 11g中,一共有4种审计类型:

  • 语句审计(Statement Auditing):对特定的SQL语句进行审计,不指定具体对象;
  • 权限审计(Privilege Auditing):对特定的系统权限使用情况进行审计;
  • 对象审计(Object Auditing):对特定的模式对象上执行的特定语句进行审计;
  • 网络审计(Network Auditing):对网络协议错误与网络层内部错误进行审计。

此外,根据用户是否成功执行,可以分为对执行成功的语句进行审计、对不成功的语句进行审计、无论成功与否都进行审计。

根据对同一个语句审计次数不同,可以分为会话审计和存取审计。会话审计是指对某个用户或所有用户的同一语句只审计一次,形成一条审计记录;存取审计是指对某个用户或所有用户的同一语句每执行一次审计一次,形成多条审计记录。

3.审计环境设置

使用审计功能,需要对数据库初始化参数AUDIT_TRAIL进行设置,其参数值可以为:

  • none:不启用审计功能;
  • db:启用审计功能,审计信息写入sys.aud$数据字典中,审计的结果只有连接信息(sys用户的记录以及强制性要求的记录都写入操作系统文件中);
  • db_extended:审计结果除了有连接信息,还有执行的具体语句。关于db与db_extended的区别,见例子1;
  • os:启用审计功能,审计信息写入操作系统文件;
  • xml:启用审计功能,审计信息写入xml格式的操作系统文件中;

查看是否启用了审计功能:

SQL> show parameter audit_trail

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB

修改审计环境参数:

SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile;  

System altered

SQL> shutdown immediate;  

--

需要重启数据库

SQL> startup;

4.审计详解

4.1 语句审计(Statement auditing)

(1)语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。创建语句审计的基本语法为:

AUDIT

 sql_statement_

shortcut | ALL |

ALL STATEMENTS

[BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

解释:

- sql_statement_shortcut:被审计的SQL语句的快捷方式;

- ALL:审计大部分SQL语句,这里不在列出;

- ALL STATEMENT:对最高级别的SQL语句进行审计,即对直接执行的SQL语句进行审计,而不对包含在PL/SQL程序中的SQL语句进行审计;

- BY user_lists:指定审计的用户,如果不指定,则审计全部用户;

- IN SESSION CURRENT:只对当前会话进行审计;

- BY SESSION:会话审计,同一个SQL语句只审计一次;

- BY ACCESS:存取审计,同一个SQL语句执行几次就审计几次;

- WHENEVER SUCCESSFUL:只审计执行成功的SQL语句;

- WHENEVER NOT SUCCESS:只审计执行不成功的SQL语句;

(2)如果要取消对某个语句的审计,只需将AUDIT命令改为NOAUDIT命令即可,其语法与创建AUDIT相同。

(3)通过数据字典DBA_STMT_AUDIT_OPTS可以了解当前数据库哪些用户进行了语句审计及审计设置信息。例如,查看与scott用户相关的语句审计:

SQL> select * from dba_stmt_audit_opts where user_name='SCOTT';

USER_NAME PROXY_NAME  AUDIT_OPTION    SUCCESS    FAILURE
--------- ----------- --------------- ---------- ----------
SCOTT TABLE BY ACCESS BY ACCESS
SCOTT INSERT TABLE BY ACCESS BY ACCESS

例子1.在scott模式下创建表test02,查看其审计信息。

查看audit_trace参数

SQL> show parameter audit_trail

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB

step1.对scott用户创建语句审计

audit table
by scott
by access audit insert table
by scott
by access

step2.创建表test02,插入2行数据:

SQL> show user;
User is "SCOTT" SQL> create table test02
(
id number,
name varchar(40),
local varchar(50)
); Table created SQL> commit; Commit complete SQL> insert into test02
values(1,'lihua','chengdu'); SQL> insert into test02 values(2,'ll','dd'); 1 row inserted SQL> commit; Commit complete

step3.查看sys.aud$和sys.audit_actions视图

select
a.userid,
a.userhost,
a.terminal,
a.action#,
aa.name,
dbms_lob.substr(a.sqltext) as sqltext,
dbms_lob.substr(a.sqlbind) as sqlbind,
a.obj$creator,
a.obj$name,
a.ntimestamp#
from
sys.aud$ a,
sys.audit_actions aa
where
a.obj$name = 'TEST02'
and
a.action# = aa.action
and
a.ntimestamp# > to_date('','yyyymmdd');

结果为:

USERID  USERHOST                   TERMINAL         ACTION# NAME          SQLTEXT                                SQLBIND  OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26

结合sys.aud$和sys.audit.actions,我们可与看到对数据库进行了create table和2次insert操作,但是我们还是不知道具体信息。接下来,我们将audit_trail参数改为:audit_trail = db_extended。

step4.修改audit_trail参数

SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile;
System altered SQL> shutdown immediate ;
SQL>startup; SQL> show parameter audit_trail NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB_EXTENDED

此时,再向test02表插入1行数据

SQL> insert into test02 values(3,'cc','vv');
1 row inserted SQL> commit;
Commit complete

step5.再次查看sys.aud$和sys.audit_actions视图

USERID  USERHOST                   TERMINAL         ACTION# NAME          SQLTEXT                                SQLBIND  OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT insert into test02 values(3,'cc','vv') SCOTT TEST02 2017/4/15 16:31:53

可以看到,在SQLTEXT栏位有了具体的执行SQL语句。

4.2 权限审计

(1)权限审计是对特定的系统权限进行审计,语法为:

AUDIT

 system_privilege | 

[ALL PRIVILEGES] [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

(2)如果要了解当前数据库中对哪些用户使用了什么权限审计,可以通过数据字典DBA_PRIV_AUDIT_OPTS来查看。

例子2.对scott用户的select any table权限进行审计

step1.查看scott的系统权限

SQL> select * from dba_sys_privs where grantee = 'SCOTT';

GRANTEE                        PRIVILEGE                                ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
SCOTT CREATE ANY TABLE NO
SCOTT UNLIMITED TABLESPACE NO
SCOTT CREATE ANY VIEW NO

step2.使用scott用户,在模式‘LIJIAMAN’下创建表test03,查询其审计信息:

USERID  USERHOST                   TERMINAL           ACTION# NAME         SQLTEXT                       SQLBIND  OBJ$CREATOR  OBJ$NAME  A.NTIMESTAMP#+8/24
------ ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE create table lijiaman.test03 LIJIAMAN TEST03 2017/4/15 19:08:20
(
id number,
name varchar(20)
)

step3.使用scott用户,在scott下创建表test05,查询其审计信息:

USERID   USERHOST                   TERMINAL            ACTION# NAME            SQLTEXT              SQLBIND   OBJ$CREATOR  OBJ$NAME   A.NTIMESTAMP#+8/24
------- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------
SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST05 2017/4/15 19:38:24
create table test05
(
id number,
name varchar(30)
)

通过这个这个例子,我们可以看到,只要scott用户使用select any table权限,我们就可以通过审计得到其操作信息。

4.3 对象审计

(1)对象审计是指对特定模式对象的操作进行审计,与用户无关,语法为:

AUDIT

 sql_operation | 

ALL ON [schema.]object] [BY user_lists] | [IN SESSION CURRENT][BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

其中,sql_operation指定了特定对象上要审计的SQL语句。

(2)如果要查看当前数据库哪些模式对象进行了对象审计,可以通过查询DBA_OBJ_AUDIT_OPTS获得。

例子3.对模式scott下的表dept进行对象审计

SQL> audit all on scott.dept by session;

Audit succeeded

查看其审计信息:

USERID           USERHOST                   TERMINAL            ACTION# NAME         SQLTEXT                            SQLBIND  OBJ$CREATOR  OBJ$NAME   A.NTIMESTAMP#+8/24
---------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------
LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC select * from scott.dept SCOTT DEPT 2017/4/15 20:13:47
LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC audit all on scott.dept by session SCOTT DEPT 2017/4/15 20:13:19

4.4 网络审计

网络审计对协议错误与网络层内部错误进行审计,网络审计捕获客户端与服务器通信过程中发生的错误,这些错误由SQL*NET网络服务抛出。网络审计的语法为:

AUDIT NETWORK
[BY SESSION | ACCESS]
[WHENEVER [NOT] SUCCESSFUL]

下一篇介绍如何去清理Audit数据

================================================================

2019年1月2日补充:

(1)如何关闭默认的login、logoff审计

在11g默认审计中,Oracle会去审计用户的登入登出操作。如果用户登入登出操作很多,那么sys.aud$表会非常的大。我的1个生产数据库由于没有关闭对登入登出的审计,导致积累了16GB的审计数据。在一个平时不怎么使用的测试库里面,登入登出的审计信息也非常的多。

select  a.action#,b.name,count(*) as counter
from sys.aud$ a,
sys.audit_actions b
where a.action# = b.action
group by a.action#,b.name
order by counter desc

如何关闭呢,可以使用sql语句来关闭

SQL> noaudit session; 

[Oracle]Audit(一)--认识Audit的更多相关文章

  1. Oracle 12C -- 预定义audit policies

    在12C中,预定义了三种审计策略:ora_secureconfig,ora_database_parameter,ora_account_mgmt可以通过脚本$ORACLE_HOME/rdbms/ad ...

  2. linux audit (9)--生成audit报表

    aureport这个命令可以生成一个总结性的柱状图报表,默认情况下,在/var/log/audit目录下的所有日志文件都会生成一个报表,也可以使用如下命令来指定一个不同的文件,aureport opt ...

  3. 转- Oracle Audit 功能的使用和说明

    http://blog.itpub.net/9399028/viewspace-712457/审计(Audit) 用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:存储在syst ...

  4. [Oracle]审计Audit

    1.Audit的概念 Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析.利用Audit功能,可以完成以下任务: 监视和收集特定数据库活动的数据.例如管理员能够审计哪些表被更新,在某 ...

  5. Oracle Audit 审计功能的认识与使用

    1.Audit的概念 Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析.利用Audit功能,可以完成以下任务: 监视和收集特定数据库活动的数据.例如管理员能够审计哪些表被更新,在某 ...

  6. Oracle Audit 功能的使用和说明

    http://blog.itpub.net/9399028/viewspace-712457/审计(Audit) 用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:存储在syst ...

  7. data object audit

    客户提出了一个需求.想对一个表做audit. 本来这是非常简单的一个case,因为oracle自带的 audit功能就可以非常方便的实现.  实现的方式如下: BEGIN DBMS_FGA.ADD_P ...

  8. 第一篇 Entity Framework Plus 之 Audit

    一般系统会有登陆日志,操作日志,异常日志,已经满足大部分的需求了.但是有时候,还是需要Audit 审计日志,审计日志,主要针对数据增,改,删操作数据变化的记录,主要是对数据变化的一个追踪过程.其中主要 ...

  9. 使用SQL Server Audit记录数据库变更

        最近工作中有一个需求,就是某一个比较重要的业务表经常被莫名其妙的变更.在SQL Server中这类工作如果不事前捕获记录的话,无法做到.对于捕获变更来说,可以考虑的选择包括Trace,CDC. ...

随机推荐

  1. C# this关键字的四种用法(转)

    用法一  this代表当前类的实例对象 namespace Demo { public class Test { private string scope = "全局变量"; pu ...

  2. mybatis一对多映射

    场景: A:SecControlRulePojo.java B:SecControlSubRulePojo C:SecControlSubRuleManyPojo 实体A中包含List<B> ...

  3. 1229:密码截获----java

    题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比 ...

  4. PHP环境配置解释

    PHP中注释:#,//,/* */ 一.修改Apache配置 DocumentRoot  "G:\PHP"        //修改完需要重启Apache //以下二选一 ----- ...

  5. HttpComponents

    一 概述 1.HttpComponents的作用 HttpComponents的作用是模拟浏览器获取网页内容. 二 使用 1.使用HttpComponents需要先导入架包. 2.使用 Closeab ...

  6. Internet Of Things

  7. JSP初学者5

    JSP中include指令和include动作的区别 include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,  JSP引擎在判断JSP页面未被修改,否则 ...

  8. SpannableString与SpannableStringBuilder使用

    转自:http://blog.it985.com/14433.html1.SpannableString.SpannableStringBuilder与String的关系 首先SpannableStr ...

  9. Shader Example

    //测试viewDir对顶点的影响Shader "Example/TestViewDir" { Properties{ _RimColor("Rim Color" ...

  10. 私网IP访问Internet

    公网.内网是两种Internet的接入方式. 内网接入方式:上网的计算机得到的IP地址是Internet上的保留地址,保留地址有3种形式: A类地址:10.0.0.0~10.255.255.255 B ...