zoukankan      html  css  js  c++  java
  • [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

    修改审计环境参数:

    复制代码
    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('20170412','yyyymmdd');
    复制代码

    结果为:

    复制代码
    USERID  USERHOST                   TERMINAL         ACTION# NAME          SQLTEXT                                SQLBIND  OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
    ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
    SCOTT   WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E        1 CREATE TABLE                                                  SCOTT       TEST02   2017/4/15 13:58:54
    SCOTT   WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 14:00:00
    SCOTT   WORKGROUPDESKTOP-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   WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E        1 CREATE TABLE                                                  SCOTT       TEST02   2017/4/15 13:58:54
    SCOTT   WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 14:00:00
    SCOTT   WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 15:27:26
    SCOTT   WORKGROUPDESKTOP-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   WORKGROUPDESKTOP-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    WORKGROUPDESKTOP-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         WORKGROUPDESKTOP-TKAPD8E  DESKTOP-TKAPD8E         103 SESSION REC    select * from scott.dept                  SCOTT        DEPT       2017/4/15 20:13:47
    LIJIAMAN         WORKGROUPDESKTOP-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; 
  • 相关阅读:
    max_element( )
    dp
    dfs
    dp
    区间dp
    树形dp
    dp-最长回文串
    go 结构体函数
    go 结构体初始化
    Golang数组和切片的区别
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/12297784.html
Copyright © 2011-2022 走看看