Oracle Audit 審計功能的認識與使用

axman發表於2021-11-02

Oracle Audit 審計功能的認識與使用

1.Audit的概念

Audit是監視和記錄使用者對資料庫進行的操作,以供DBA進行問題分析。利用Audit功能,可以完成以下任務:

  • 監視和收集特定資料庫活動的資料。例如管理員能夠審計哪些表被更新,在某個時間點上有多少個並行使用者統計資料;
  • 保證使用者對自己的活動負責。這些活動包括在特定模式、特定表、特定行等物件上進行的操作;
  • 審計資料庫中的可疑活動。如一個未經授權的使用者正從表中刪除資料,那麼資料庫管理員必須審計所有資料庫連線,以及在資料庫中所有成功和失敗的刪除操作。

根據審計型別不同,審計記錄中的資訊也有所不同。通常,一條審計記錄中包含使用者名稱、會話標識、終端標識、所操作的模式物件名稱、執行的操作、執行的完整語句程式碼、日期和時間戳、所使用的系統許可權。


 

2.Audit的分類

在  11g中,一共有4種審計型別:

  • 語句審計(Statement Auditing):對特定的SQL語句進行審計,不指定具體物件;
  • 許可權審計(Privilege Auditing):對特定的系統許可權使用情況進行審計;
  • 物件審計(Object Auditing):對特定的模式物件上執行的特定語句進行審計;
  • 網路審計(Network Auditing):對網路協議錯誤與網路層內部錯誤進行審計。

此外,根據使用者是否成功執行,可以分為對執行成功的語句進行審計、對不成功的語句進行審計、無論成功與否都進行審計。

根據對同一個語句審計次數不同,可以分為會話審計和存取審計。會話審計是指對某個使用者或所有使用者的同一語句只審計一次,形成一條審計記錄;存取審計是指對某個使用者或所有使用者的同一語句每執行一次審計一次,形成多條審計記錄。


 

3.審計環境設定

使用審計功能,需要對資料庫初始化引數AUDIT_TRAIL進行設定,其引數值可以為:

  • none:不啟用審計功能;
  • db:啟用審計功能,審計資訊寫入sys.aud$資料字典中,審計的結果只有連線資訊(sys使用者的記錄以及強制性要求的記錄都寫入作業系統檔案中);
  • db_extended:審計結果除了有連線資訊,還有執行的具體語句。
  • 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;  
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 3741306880 bytes
Fixed Size                  2258800 bytes
Variable Size            1241516176 bytes
Database Buffers         2483027968 bytes
Redo Buffers               14503936 bytes
Database mounted.

 

 

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 tableby scottby access
audit insert tableby scottby 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#+8/24from 
  sys.aud$ a,
  sys.audit_actions aawhere
  a.obj$name = 'TEST02'and
  a.action# = aa.actionand
  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:54SCOTT   WORKGROUP\DESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 14:00:00SCOTT   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:54SCOTT   WORKGROUP\DESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 14:00:00SCOTT   WORKGROUP\DESKTOP-TKAPD8E  DESKTOP-TKAPD8E        2 INSERT                                                        SCOTT       TEST02   2017/4/15 15:27:26SCOTT   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:47LIJIAMAN         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資料。

(一)  概述

Audit的資料主要儲存在sys.aud$表中,該表預設位於system表空間中,我們根據需求,將該表移到了sysaux表空間中。由於審計資料量較大,需要經常關注sysaux表空間的使用情況,同時根據實際情況對sys.aud$表進行資料清理。

(二)  清理步驟

(1)使用sys賬號登陸資料庫,開啟計時功能,方便檢視每一個命令的執行時間

SQL> set timing on

(2)在清理資料之前先檢視資料量大小

SQL> select count(*) from sys.aud$;

(3)檢視Audit表中最早一筆資料的時間,即審計表中記錄的最早的時間

SQL> select min(ntimestamp#) from sys.aud$;MIN(NTIMESTAMP#)----------------------------------------23-11月-16 08.18.54.496893 上午

(4)檢視審計資料最後歸檔時間,只有歸檔的資料才能刪除

SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts;
AUDIT_TRAIL   RAC_INSTANCE   LAST_ARCHIVE_TS-----------   ------------   --------------------------------STANDARD AUDIT TRAIL     0   14-3月 -17 01.22.49.000000 下午 +00:00

(5)初始化清理Audit的功能,該命令 只有在第一次執行時需要執行,default_cleanup_interval =>168代表清理週期為168小時。

 
SQL> BEGIN
      sys.DBMS_AUDIT_MGMT.init_cleanup(
      audit_trail_type         => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
      default_cleanup_interval => 168);END;/

(6)確認清除Audit功能是否開啟,yes為開啟

SQL >
SET SERVEROUTPUT  ON
BEGIN
IF sys.DBMS_AUDIT_MGMT.is_cleanup_initialized(sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD)  THEN
    DBMS_OUTPUT.put_line(
' YES ' );
  
ELSE
    DBMS_OUTPUT.put_line(
' NO ' );
  
END  IF ;
 
END ;
/

(7)設定需要清理的天數,最後一個數字‘7’代表清理‘7’天前的資料(歸檔時間大於等於清除時間)

SQL > 
BEGIN
      sys.DBMS_AUDIT_MGMT.set_last_archive_timestamp(
      audit_trail_type 
=>  sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
      last_archive_time
=> SYSTIMESTAMP - 7  /*  Day */ );
END ;
/

(8) 執行清除,時間長短受資料量大小影響(經測試600萬條資料大約20分鐘)

SQL > 
BEGIN
      sys.DBMS_AUDIT_MGMT.clean_audit_trail(
      audit_trail_type       
=>  sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
      use_last_arch_timestamp
=>  TRUE);
END ;
/

(9)在清理後,sys.aud$表的大小並沒有發生改變,需要收回空間

解釋:在上面清理表sys.aud$後,實際上,資料還在磁碟上,只是資料不受保護了而已,其空間並沒有釋放,需要將其釋放回收

 
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; --檢視aud$的大小SEGMENT_NAME                                                                     BYTES/1024/1024-------------------------------------------------------------------------------- ---------------AUD$                                                                                        3456SQL> alter table sys.aud$ enable row movement;   --啟用行移動Table altered.
SQL> SQL> alter table sys.aud$ shrink space cascade;  --進行空間回收Table altered.
SQL> alter table sys.aud$ disable row movement;  --關閉行移動Table altered.
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$';  ----再次檢視aud$的大小SEGMENT_NAME                                                                     BYTES/1024/1024-------------------------------------------------------------------------------- ---------------AUD$                                                                                    666.8125

經過2次檢視空間大小,可以看到空間已經被釋放。

參考:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25498/viewspace-2840164/,如需轉載,請註明出處,否則將追究法律責任。

相關文章