為了使僱主相信資料庫管理員不會濫用權利,有必要審計所有的SYSDBA活動。對於普通使用者來說,資料庫管理員也希望跟蹤他們的違規行為。

除了SYSDBA審計之外,Oracle還提供下列3種審計技術:

  • 資料庫審計:能夠跟蹤特定許可權的使用、特定命令的執行、對特定表的訪問以及登入嘗試。
  • 基於值的審計:使用資料庫觸發器。在插入、更新或刪除記錄時,就會執行一個包括記錄事件全部細節的PL/SQL程式碼塊。
  • 細粒度審計:允許根據所訪問的記錄來跟蹤對錶的訪問。

提示:任何一種審計都會增加資料庫必須完成的工作量。為了限制這個工作量,應當進行重點審計,同時不跟蹤非重要的事件。

1、審計SYSDBA活動

一個名為AUDIT_SYS_OPERATIONS的例項引數。如果這個引數設定為TRUE(預設DEFAULT),作為SYSDBA或SYSOPER連線資料庫的使用者所釋出的每條語句都會被寫入作業系統的審計追蹤,從而能夠給出DBA所進行操作的完整記錄。顯然,審計追蹤必須受到保護。如果DBA能夠刪除審計記錄,那建立這些審計記錄就無意義了。

由此引發的問題被稱為“責任分離(separation of duties)”。需要對作業系統進行配置,從而使DBA不能訪問跟蹤DBA活動的審計記錄,這些審計記錄只能被計算機的系統管理員訪問。因此,一名優秀的計算機審計人員始終堅持這樣的觀點:DBA一定不能知道Linux系統中“root”的口令(或Windows系統中“Administrator”的口令),同時系統管理員一定不能知道Oracle中SYSDBA的口令。

SYS審計記錄的目的資料夾由所使用的平臺決定。Windows系統中,目的資料夾為Windows Application Log。在Linux系統中,目的資料夾由AUDIT_FILE_DEST引數控制。Oracle擁有者在該目錄具有寫許可權,但是DBA使用的Linux ID在該目錄上不具有寫許可權。

2、資料庫審計

設定資料庫審計之前,必須設定AUDIT_TRAIL例項引數。這個引數具有下列4個可能值:

  • NONE(或FALSE):禁用審計。
  • OS:審計記錄被寫至作業系統的審計追蹤。
  • DB(或TRUE):審計記錄會被寫入資料字典表SYS.AUD$。
  • DB_EXTENDED:與DB值的作用大體相同,不過包含與生成審計記錄的、具有繫結變數的SQL語句相關資訊。

使用AUDIT命令可以配置資料庫審記。

SQL> audit create any trigger;
 
Audit succeeded.
 
SQL> audit select any table by session;
 
Audit succeeded.

預設情況下,審計會為事件的每次出現都生成一條審計記錄,相當於為AUDIT命令新增關鍵字BY ACCESS。無論滿足審計條件的頻繁程式怎樣,為AUDIT命令新增關鍵字BY SESSION 都會將審計輸出限制為每次登入只生成一條審計記錄。

審計也可以是物件導向的。

SQL> create table abc (aid number);
 
Table created.
 
SQL> audit insert on abc whenever successful;
 
Audit succeeded.
 
SQL> audit all on abc;
 
Audit succeeded.

WHENEVER SUCCESSFUL關鍵字將審計記錄限制為操作成功的記錄,而WHENEVER NOT SUCCESSFUL關鍵字則將審計記錄限制為操作不成功的記錄。預設所有操作(無論成功)都會被審計。ALL審計所有DDL語句。

使用AUDIT SESSION命令可以審計登入。

SQL> audit session whenever not successful;
 
Audit succeeded.

NOT SUCCESSFUL關鍵字限制審計記錄只輸出失敗的連線嘗試。這個功能很有用,記錄的這些失敗指示了是否存在侵入資料庫的企圖。

DBA_AUDIT_TRAIL檢視是一個至關重要的檢視,無論哪種審計,這個檢視都顯示了所有審計追蹤條目。

Oracle Database 10G Reference 中DBA_AUDIT_TRAIL檢視的列

說明
OS_USERNAME其動作被審計的使用者的作業系統登入使用者名稱
USERNAME其動作被審計的使用者的名稱(不是ID號)
USERHOST客戶主機名
TERMINAL使用者終端的識別符號
TIMESTAMP本地資料庫會話時區中審計追蹤條目的建立日期與時間(用於使用AUDIT SESSION所建立條目的使用者登入日期與時間)
OWNER指定動作所影響物件的建立者
OBJ_NAME指定動作所影響物件的名稱
ACTION動作型別的數字程式碼。動作型別的相應名稱位於ACTION_NAME列中
ACTION_NAME與ACTION列中的數字程式碼相對應的動作型別的名稱
NEW_OWNERNEW_NAME列中指定物件的擁有者
NEW_NAME執行RENAME命令後指定物件的新名稱或是底層物件的名稱
OBJ_PRIVILEGE使用GRANT或REVOKE語句授予或取消的物件許可權
SYS_PRIVILEGE使用GRANT或REVOKE語句授予或取消的系統許可權
ADMIN_OPTION指示使用ADMIN選項授予的角色還是系統許可權
GRANTEEGRANT或REVOKE語句中指定的被授權者的名稱
AUDIT_OPTION使用AUDIT命令設定的審計選項
SES_ACTIONS會話概述。這是一個具有16個字元的串。第1個至第13個字元分別用於動作型別ALTER、AUDIT、COMMENT、DELETE、GRANT、INDEX、INSERT、LOCK、RENAME、SELECT、UPDATE、REFERENCES以及EXECUTE。位置14、15和16則保留以備今後使用。字元可以為下列值:
-(None,無)
S(Success,成功)
F(Failure,失敗)
B(Both,既有成功也有失敗)
LOGOFF_TIME使用者登出的日期與時間
LOGOFF_LREAD用於指定會話的邏輯讀取
LOGOFF_PREAD用於指定會話的物理讀取
LOGOFF_LWRITE用於指定會話的邏輯寫
LOGOFF_DLOCK指定會話期間檢測到的死鎖
COMMENT_TEXT對審計追蹤條目的文字註釋,提供了與被審計語句相關的更多資訊。此外還指示了驗證使用者身份的方法,這些方法包括:
DATABASE—使用口令的身份驗證
NETWORK—使用Oracle Net Services或Advanced Security選項的身份驗證
PROXY—通過另一個使用者來驗證客戶的身份,代理使用者的名字跟隨在方法型別之後
SESSIONID用於每個Oracle會話的數值ID
ENTRYID用於指定會話中每個審計追蹤條目的數值ID
STATEMENTID用於執行的每條語句的數值ID
RETURNCODE指定動作生成的Oracle錯誤程式碼,包括下列一些十分有用的值:
0—動作成功
2004—安全違背
PRIV_USED用於執行指定動作的系統許可權
CLIENT_ID每個Oracle會話中的客戶識別符號
SESSION_CPU每個Oracle會話所使用的CPU時間量
EXTENDED_TIMESTAMPUTC(Coordinated Universal Time,協調世界時)時區中審計追蹤條目的建立時間標記(用於使用AUDIT SESSION命令所建立條目的使用者登入時間標記)
PROXY_SESSIONID在企業使用者通過代理機制進行登入時,這個列指定了代理會話序號
GLOBAL_UID在指定使用者作為企業使用者進行登入時,這個列給出了用於該使用者的全域性使用者識別符號
INSTANCE_NUMBER在指定使用者作為企業使用者進行登入時,這個列給出了用於該使用者的全域性使用者識別符號
OS_PROCESSOracle程式的作業系統程式識別符號
TRANSACTIONID對物件進行訪問或修改的事務的事務識別符號
SCN查詢的系統改變號(System Change Number,簡寫為SCN)
SQL_BIND查詢的繫結變數資料
SQL_TEXT SQL查詢的文字

其他審計檢視(DBA_AUDIT_OBJECT、DBA_AUDIT_STATEMENT以及DBA_AUDIT_SESSION)分別說明了DBA_AUDIT_TRAIL檢視的一個子集,並且只顯示特定的審計記錄以及與其相關的列。

3、基於值的審計
前面所描述的資料庫審計可以捕獲到針對某個表執行一條命令的事實,但要跟蹤受影響的記錄我們就要通過資料庫觸發器了。

4、細粒度審計

細粒度審計(Fine-grained auditing,簡寫FGA)可以被配置為只在訪問特定記錄或特定記錄的特定列時生成審計記錄。配置FGA會涉及程式包DBMS_FGA。為了建立一個FGA審計策略,需要使用ADD_POLICY過程,過程接受下面實參。

ADD_POLICY過程的實參

實參說明
OBJECT_SCHEMA擁有待審計物件的使用者的名稱,預設為建立FGA審計策略的使用者
OBJECT_NAME待審計物件的名稱
POLICY_NAME建立的每個FGA審計策略都必須有唯一的名稱
AUDIT_CONDITION一個確定哪條記錄生成審計記錄的表示式。如果為NULL,對任何記錄的訪問都會被審計
AUDIT_COLUMN一個待審計列的列表。如果為NULL,對任何列的訪問都會被審計
HANDLER_SCHEMA擁有在達到審計條件時所執行過程的使用者的名稱,預設為建立FGA審計策略的使用者
HANDLER_MODULE達到審計條件時所執行的PL/SQL過程
ENABLE在預設情況情況下為TRUE,也就是說FGA審計策略有效,此時使用DISABLE_POLICY可以禁用該策略。如果被設定為FALSE,必須使用ENABLE_POLICY過程才能啟用FGA審計策略
STATEMENT_TYPES審計的語句型別,包括SELECT、INSERT、UPDATE或DELETE中的一種或多種型別。預設只涉及SELECT型別。
AUDIT_TRAIL控制是否將實際的SQL語句及其繫結變數寫入FGA審計追蹤。預設寫入
AUDIT_COLUMN_OPTS在某條語句涉及AUDIT_COLUMNS實參中列出的任何列或所有列的情況下,確定是否進行審計。選項包括DBMS_FGA_ANY_COLUMNS(預設)以及DBMS_FGA_ALL_COLUMNS

其他的DBMS_FGA過程用於啟用、禁用或刪除FGA策略。

檢視細粒度審計的結果,可以查DBA_FGA_AUDIT_TRAIL檢視。

SQL> desc dba_fga_audit_trail;
 Name                       Null?    Type
 -------------------------- -------- ----------------------------
 SESSION_ID                 NOT NULL NUMBER
 TIMESTAMP                           DATE
 DB_USER                             VARCHAR2(30)
 OS_USER                             VARCHAR2(255)
 USERHOST                            VARCHAR2(128)
 CLIENT_ID                           VARCHAR2(64)
 ECONTEXT_ID                         VARCHAR2(64)
 EXT_NAME                            VARCHAR2(4000)
 OBJECT_SCHEMA                       VARCHAR2(30)
 OBJECT_NAME                         VARCHAR2(128)
 POLICY_NAME                         VARCHAR2(30)
 SCN                                 NUMBER
 SQL_TEXT                            NVARCHAR2(2000)
 SQL_BIND                            NVARCHAR2(2000)
 COMMENT$TEXT                        VARCHAR2(4000)
 STATEMENT_TYPE                      VARCHAR2(7)
 EXTENDED_TIMESTAMP                  TIMESTAMP(6) WITH TIME ZONE
 PROXY_SESSIONID                     NUMBER
 GLOBAL_UID                          VARCHAR2(32)
 INSTANCE_NUMBER                     NUMBER
 OS_PROCESS                          VARCHAR2(16)
 TRANSACTIONID                       RAW(8)
 STATEMENTID                         NUMBER
 ENTRYID                             NUMBER