[Oracle]Audit(一)--认识Audit

前端之家收集整理的这篇文章主要介绍了[Oracle]Audit(一)--认识Audit前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

修改审计环境参数:

> alter system set audit_trail = 'DB_EXTENDED' scope = spfile; System altered sqlshutdown immediate; --
需要重启数据库
 
sql> startup;

 

4.审计详解

4.1 语句审计(Statement auditing)

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

AUDIT
 sql_statement_
shortcut | ALL |
ALL STATEMENTS
[BY user_lists] | IN SESSION CURRENT] 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用户相关的语句审计:

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

 

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

查看audit_trace参数

---------------------------------- ----------- ------------------------------ audit_trail string DB

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

audit table
by scott
 access

audit insert by access

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

> show user; User is "SCOTT" sqlcreate table test02 ( id number,name varchar(40),local 50) ); Table created sqlcommit; Commit complete sqlinto test02 values(1,lihua',1)">chengdu); sqlinto test02 2,1)">lldd); 1 row inserted sql; 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)  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

  a.ntimestamp# > to_date(20170412yyyymmdd');

结果为:

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   2017415 13:58:54
SCOTT   WORKGROUP\DESKTOP2 INSERT                                                        SCOTT       TEST02   14:00:0015:27:26

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

step4.修改audit_trail参数

spfile; System altered sqlshutdown immediate ; sqlstartup; sql show parameter audit_trail NAME TYPE VALUE ---------------------------------- ----------- ------------------------------ audit_trail string DB_EXTENDED

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

3,1)">ccvv); ; Commit complete

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

26INSERT ') SCOTT TEST02 16:31:53

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

 

4.2 权限审计

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

AUDIT
 system_privilege | 
ALL PRIVILEGESBY user_listsIN SESSION CURRENT] BY SESSION | ACCESSWHENEVER [NOT] SUCCESSFUL]

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

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

step1.查看scott的系统权限

from dba_sys_privs where grantee ; GRANTEE PRIVILEGE ADMIN_OPTION ---------------------------- ---------------------------------------- ------------ SCOTT CREATE ANY TABLE NO SCOTT UNLIMITED TABLESPACE NO SCOTT VIEW NO

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

USERID  USERHOST                   TERMINAL           ACTION# NAME         sqlTEXT                       sqlBIND  OBJ$CREATOR  OBJ$NAME  A.NTIMESTAMP#----  -------------------------  --------------- ---------- ------------ ----------------------------  -------- ------------ --------- ------------------
SCOTT   WORKGROUP\DESKTOP-TKAPD8E          TABLE table lijiaman.test03           LIJIAMAN     TEST03    19:08:20
                                                                           (                                                                               
                                                                           id )                                                                
                                                                           )

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

USERID   USERHOST                   TERMINAL            ACTION# NAME            sqlTEXT              sqlBIND   OBJ$CREATOR  OBJ$NAME   A.NTIMESTAMP#-----  -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------
SCOTT    WORKGROUP\DESKTOP-TKAPD8E           TABLE                                   SCOTT        TEST05     38:24
                                                                                 test05                                    
                                                                                (                                                      
                                                                                id 30)                                       
                                                                                )

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

 

4.3 对象审计

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

AUDIT
 sql_operation ALL ON [schema.]object]] SUCCESSFUL]

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

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

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

> audit all on scott.dept session; Audit succeeded

查看其审计信息:

USERID           USERHOST                   TERMINAL            ACTION# NAME         sqlTEXT                            sqlBIND  OBJ$CREATOR  OBJ$NAME   A.NTIMESTAMP#-------------- -------------------------- ---------------- ---------- -----------  ---------------------------------- -------- ------------ ---------- ------------------
LIJIAMAN         WORKGROUP\DESKTOP-TKAPD8E         103 SESSION REC    from scott.dept                  SCOTT        DEPT       20:47
LIJIAMAN         WORKGROUP\DESKTOP103 SESSION REC    audit by session        SCOTT        DEPT       19

 

4.4 网络审计

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

AUDIT NETWORK ] [] SUCCESSFUL]

 

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

 

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

2019年1月2日补充:

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

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

select  a.action#,b.name,1)">count(*)  counter
    sys.aud$ a,sys.audit_actions b
where   a.action#  b.action
group  a.action#,b.name
order by counter desc

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

sql> noaudit session; 

猜你在找的Oracle相关文章