[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   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; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM