Oracle 資料庫 10g 審計以一種非常詳細的層級捕獲使用者行為,它可以消除手動的、基於觸發器的審計。假定使用者 Joe 具有更新那張表的許可權,並按如下所示的方式更新了表中的一行資料。
update SCOTT.EMP set salary = 12000 where empno = 123456; |
您如何在資料庫中跟蹤這種行為呢?在 Oracle 9i 資料庫及其較低版本中,審計只能捕獲“誰”執行此操作,而不能捕獲執行了“什麼”內容。例如,它讓您知道 Joe 更新了 SCOTT 所有的表 EMP,但它不會顯示他更新了該表中員工號為 123456 的薪水列。它不會顯示更改前的薪水列的值—要捕獲如此詳細的更改,您將不得不編寫您自己的觸發器來捕獲更改前的值,或使用 Log Miner 將它們從存檔日誌中檢索出來。
這兩種方法都能讓您跟蹤更改的內容並記錄更改前的值,但其成本非常高。使用觸發器編寫審計資料可能會對效能產生主要的影響;鑒於此,在某些情況下(如在第三方應用中)禁止使用使用者定義的觸發器。Log Miner 不會影響效能,但它是依賴於存檔日誌的可用性來跟蹤更改的。
細粒度審計 (FGA),是在 Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的資料,但是它們只能用於 select 語句,而不能用於 DML,如 update、insert 和 delete 語句。因此,對於 Oracle 資料庫 10g 之前的版本,使用觸發器雖然對於以行級跟蹤使用者初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。
隨著 Oracle 10g 的到來,由於審計能力的兩個重大的改變,這些限制也隨之而去。由於兩種審計類型涉及到—標準審計(在所有版本中均可用)和細粒度審計(在 Oracle 9i 及其以上版本中可用)—我們將分別對它們進行處理,然後看看它們是如何相互補充以提供一個單一的、強大的跟蹤功能。
新特性
首先,FGA 現在除了支援 select 語句外,還支援 DMA 語句。這些更改都記錄在同一個位置,即表 FGA_LOG$ 中,並通過 DBA_FGA_AUDIT_TRAIL 視圖顯示出來。除了 DML 外,您現在可以選擇只有在訪問了所有或者甚至很少的相關的列後,才可以觸發一個線索。(有關 FGA 在 Oracle 10g 中是如何工作的詳細資料,請參閱該主題的我的技術文章的內容。)
標準審計,是由 SQL 命令 AUDIT 執行的,可用於為特定的對象快速、容易地設定跟蹤。例如,如果您想跟蹤對 Scott 所擁有的表 EMP 的所有更新,您可以發出如下命令:
audit UPDATE on SCOTT.EMP by access; |
任何使用者每一次更新表 SCOTT.EMP 時,該命令都會把所有的更新記錄到審計跟蹤表 AUD$ 中,可以通過 DBA_AUDIT_TRAIL 視圖來查看。
這個功能對於 Oracle 10g 之前的版本也是可用的。但是,在那些版本中,寫到跟蹤中的資訊僅限於少數相關的項,如:發出該語句的使用者、時間、終端標識號等等;它缺少某些重要的資訊,如綁定變數的值。在 Oracle 10g 中,除了以前的版本中所收集到的內容之外,審計操作還捕獲了許多這些重要的資訊片斷。用於審計的原始表 AUD$,包含若干個用於記錄它們的新列,相應地,DBA_AUDIT_TRAIL 視圖也包含這些列。讓我們詳細地研究一下。
EXTENDED_TIMESTAMP。 該列以 TIMESTAMP (6) 格式記錄了審計記錄的時間戳記,它是用格林尼治標準時間(也稱為全球統一時間)來記錄時間的,其小數點後的秒數到 9 為止,並且帶有時區資訊。以這種格式儲存的時間的一個例子如下所示。2004-3-13 18.10.13.123456000 -5:0日期表示為 2004 年 3 月 13 日,是美國的東部標準時間,它比全球統一時間晚 5 小時(用 -5.0 來表示)。這種以擴充格式顯示的時間有助於把審計跟蹤精確定位到一個更窄的時間間隔中,從而增強了它們的用途,特別是在資料庫橫跨多個時區時更是如此。
GLOBAL_UID 和 PROXY_SESSIONID。 當使用某種身份管理組件如 Oracle Internet Directory 進行身分識別驗證時,使用者對資料庫的存取權限稍有不同。例如,當將他們訪問資料庫時,可能將他們視為企業使用者。審計這些使用者不會在 DBA_AUDIT_TRAIL 視圖的 USERNAME 列中記錄他們的企業使用者標識號,以使該資訊無用。在 Oracle 資料庫 10g 中,全域(或企業)使用者唯一的標識號記錄在 GLOBAL_UID 列中,並且沒有作進一步的處理或設定。該列可用於查詢目錄伺服器,以尋找有關該企業使用者的完整的詳細資料。
有時企業使用者也許是通過一個代理使用者串連到資料庫,特別是在多層應用中。可以通過命令為使用者提供Proxy 驗證:
alter user scott grant connect to appuser; |
該命令將允許使用者 SCOTT 以 APPUSER 的身份,作為代理使用者串連到資料庫。在那種情況下,COMMENT_TEXT 列將通過儲存值 PROXY 來記錄事實;但是對於 Oracle 9i 而言,代理使用者的會話標識號將不會進行記錄。在 Oracle 10g 中,PROXY_SESSIONID 列記錄了它,用於精確標識代理會話。
INSTANCE_NUMBER。 在 Oracle 真正應用叢集 (RAC) 環境中,它可能有助於知道在變更時使用者串連的是哪一個特定的常式。在 Oracle 10g 中,該列記錄了常式號,它是由該常式的初始化參數檔案指定的。
OS_PROCESS。 在 Oracle 9i 及其較低的版本中,只會在審計跟蹤中記錄 SID 值;而不會記錄作業系統進程標識號。但是,伺服器處理序的作業系統進程標識號隨後可能是必要的,例如,用於交叉引用一個線索檔案。在 Oracle 10g 中,該值也記錄在該列中。
TRANSACTIONID。 在此就產生了最關鍵的資訊價格。假定使用者發出下面的命令:
update CLASS set size = 10 where class_id = 123; commit; |
該命令擷取一個事務項,並且產生一個審計記錄。但是,您怎樣知道該審計記錄真正記錄的是什麼內容呢?如果記錄是一個事務,該事務標識號就會儲存在該列中。您可以使用它把審計跟蹤與 FLASHBACK_TRANSACTION_QUERY 視圖聯結起來。下面是該視圖中的列的一個小樣本:
select start_scn, start_timestamp, commit_scn, commit_timestamp, undo_change#, row_id, undo_sql from flashback_transaction_query where xid = ''; |
除了記錄對該事務所做的通常的統計外,如 undo change#、rowid 等等,Oracle 10g 還可以在 UNDO_SQL 列中記錄撤消對事務所作更改 SQL 命令,以及在 ROW_ID 列顯示的受影響行的 rowid。
系統更改號。 最終,它記錄更改前的值。您怎樣執行該操作呢?按 Oracle 9i 中的 FGA 所指出的那樣,更改前的值可以通過閃回查詢來擷取。但是您需要知道該更改的系統更改號 (SCN),它可以在審計跟蹤的該列中捕獲到。您可以發出下面的命令:
select size from class as of SCN 123456 where where class_id = 123; |
這將顯示使用者所看到的內容或更改前的值。
擴充的 DB 審計
記住我們最初的興趣:為了捕獲使用者發出的 SQL 陳述式,以及在標準審計中無法捕獲的綁定變數。在 Oracle 資料庫 10g 中進入增強型審計,其中這些任務變得如同更改一個簡單的初始化參數一樣微不足道。只需把下列程式碼放入參數檔案中。
audit_trail = db_extended |
如果使用該參數,該參數將在各列中記錄 SQL 文本和綁定變數值。該值在早期的版本中不可用。
觸發器何時是必要的
避免誤檢。 審計跟蹤是通過來自於原始事務的自治事務產生的。因此,即使原始交易回復,它們也會提交。
有一個簡單例子示範了這一點。假定我們已在表 CLASS 上為 UPDATE 設定了審計。使用者發出一條語句以將資料值從 20 更新為 10,然後將其復原,如下所示:
update class set size = 10 where class_id = 123; rollback |
現在該列的 SIZE 值將變成 20,而不是 10,好像使用者從未做過任何事情。但是,即使復原,審計跟蹤也將捕獲該更改。在某些情況下這可能不是人們所想要的,尤其是使用者執行了許多復原時。在這種情況下,您也許不得不使用觸發器僅捕獲已提交的更改。如果表 CLASS 上有一個觸發器用於將記錄插入到使用者定義的審計線索中,在復原的基礎上審計線索也被復原。
捕獲之前更改的值。 Oracle 提供的審計跟蹤不會顯示更改前後的值。例如,上述的更改將建立一個審計記錄,它顯示了語句和更改的 SCN 號,但沒有顯示更改前的值 (20)。可以使用閃回查詢通過 SCN 號擷取該值,但是它依賴於在撤消段中可用的資訊。如果該資訊無法在由 undo_retention 時間段指定的期限內捕獲到,就永遠不能檢索出先前的值來。使用觸發器保證了無需依賴於 undo_retention 時間段即可捕獲到該值,並且有時很有用。在這兩種環境下,您可以決定繼續使用觸發器以細粒度的層級來記錄審計跟蹤。
統一的審計跟蹤
由於 FGA 和標準審計捕獲的是相同類型的資訊,當把它們結合起來使用時可以提供許多重要的資訊。Oracle 資料庫 10g 把這些跟蹤合并到一個稱為 DBA_COMMON_AUDIT_TRAIL 的通用跟蹤中,它是 DBA_AUDIT_TRAIL 視圖和 DBA_FGA_AUDIT_TRAIL 視圖的一個 UNION ALL 視圖。但是,在這兩種審計類型之間有一些重大的區別。
結論
在 Oracle 10g 中,審計已經從一個單純的“操作記錄者”成長為一個“事實記錄機制”,它能以一個非常詳細的層級來捕獲使用者的行為,這可以消除您對手動的、基於觸發器的審計的需要。它還結合了標準審計和 FGA 的跟蹤,這使其更易於追蹤資料庫訪問,而不用考慮它是如何產生的。
(