安全審計打造固若金湯的數據堡壘(五)
之前的安全審計系列文章已經出了四篇(一,二,三,四),分別介紹了各種類型的審計。本文是該系列文章的最后一篇,將為你介紹對DML的審計,并作出總結。
審計敏感數據的變更
對數據操縱語言(DML)的審計是另一種常見需求,特別是在財務信息的正確性成為主要問題時。
相關的審計需求包括,全面記錄每一次DML活動的新值和舊值。例如,你可能需要為雇員表中存儲年金的那一“列”創建審計跟蹤線索。在這種情況下,你有兩種不同的要求。第一個要求是完全記錄對這些值的任何更新,對于每次更新,要記錄每個執行更新的用戶,使用的客戶端和應用程序,以及更新時間和真實的SQL語句。第二個要求是記錄上述所有信息,以及記錄更新前和后的值。不過情況并非總是一樣的,因為通過使用下面的命令,筆者可以將50%的年金歸為己有:UPDATE EMP SET BONUS = BONUS * 1.5。
盡管DML的審計跟蹤并記錄新值和舊值是重要的審計類型。但在使用此技術時仍需小心,要有選擇地實施這種審計。有時,人們過分熱衷于這種審計,因為簡單方便,就為每一次DML操作都啟用了這種審計。這在技術上是可能的,但可能會產生巨大的數據量,應該確保你的審計基礎架構可以管理這種負荷,特別是在你的審計包括新值和舊值時。例如,單位每天發生大量業務,為了簡單起見,每筆業務都僅更新一次值,每個數據庫有多個表,每個表有若干個值需要更新,每個表有大量記錄。一年后,你會發現你的審計數據庫是超過數據庫自身的35倍。
因此,在你準備DML審計線索時,應當謹慎地選擇需要審計的對象和命令。例如,你可以決定為一個數據庫的表集來創建審計,為某些登錄名或賬戶創建審計等。更深入的選擇是,你可以選擇為哪些表及表中的哪些列來維護新值和舊值。
還可以通過三種主要方法來支持DML審計:使用數據庫自身的功能、使用一個外部的審計系統,或使用觸發器。
所有數據庫都提供了實施DML活動審計的方法。例如,在Oracle中,你可以使用基于redo日志的“日志礦工(log miner )”工具。因為redo日志會捕獲所有的DML活動(包括新值和舊值),“日志礦工(log miner )”可以析取這種信息,并使其可用。在SQL Server中,你可以使用DOP跟蹤事件:
第二種方法,即外部的數據庫審計系統,支持基于過濾標準的DML審計,包括數據庫對象、用戶、應用程序等。這種系統有助于捕獲并壓縮信息,并便于報告工具的使用,即使數據量很大也不會產生太多問題。
第三種選擇是簡單地使用自己定制的觸發器。這種選擇從技術上而言,不如其它的選擇,但是如果你從事的并不是一個大規模的審計項目的一部分,而僅僅需要為幾個對象創建一個DML審計線索,不妨增加觸發器,將信息寫到一個特定的審計表中,這種最簡單而快捷的方法也許可以幫你順利進入下一個項目。
審計關于私密問題的SELECT語句
SELECT語句過去并不是審計線索的重點,但最近對私密問題的重視已經改變了這種情況。例如,如果你需要確保客戶、合伙人、雇員的機密信息不會從數據庫中泄露,就得重視審計SELECT語句。你尤其需要顯示出SELECT語句來自哪里(IP地址、應用程序)、誰選擇了數據(用戶名)、選擇了哪些數據等。在DML的審計中,SELECT語句的審計對于整個數據庫而言并不現實,你需要重視有重要意義的必要問題。
第一步是根據SELECT線索審計區分出哪些數據重要。例如,人的姓氏不太算機密,但姓氏與身份證號結合在一起就絕對是機密。在數據分類階段,你應當定義機密信息存在哪里(對象名及列名),以及哪些信息組合是機密信息。
創建SELECT審計線索通常要比其它審計類型更為困難。很明顯,在這里,快照并不是一個可行的選擇,觸發器也不行,所以你只能使用數據庫跟蹤或外部的審計系統。你還可以選擇使用定制日志來構建視圖,但這樣做要求的工作量太大。在使用內部的數據庫特性時,你的選擇更為有限。例如,即使你可以跟蹤SELECT(例如,下圖所示:在SQL Server中使用DOP事件),這也往往是不現實的,因為你要收集太多的信息,并需要應用過濾器。
第二種方法,即外部的數據庫審計系統,支持基于過濾標準的DML審計,包括數據庫對象、用戶、應用程序等。這種系統有助于捕獲并壓縮信息,并便于報告工具的使用,即使數據量很大也不會產生太多問題。
第三種選擇是簡單地使用自己定制的觸發器。這種選擇從技術上而言,不如其它的選擇,但是如果你從事的并不是一個大規模的審計項目的一部分,而僅僅需要為幾個對象創建一個DML審計線索,不妨增加觸發器,將信息寫到一個特定的審計表中,這種最簡單而快捷的方法也許可以幫你順利進入下一個項目。
審計關于私密問題的SELECT語句
SELECT語句過去并不是審計線索的重點,但最近對私密問題的重視已經改變了這種情況。例如,如果你需要確保客戶、合伙人、雇員的機密信息不會從數據庫中泄露,就得重視審計SELECT語句。你尤其需要顯示出SELECT語句來自哪里(IP地址、應用程序)、誰選擇了數據(用戶名)、選擇了哪些數據等。在DML的審計中,SELECT語句的審計對于整個數據庫而言并不現實,你需要重視有重要意義的必要問題。
第一步是根據SELECT線索審計區分出哪些數據重要。例如,人的姓氏不太算機密,但姓氏與身份證號結合在一起就絕對是機密。在數據分類階段,你應當定義機密信息存在哪里(對象名及列名),以及哪些信息組合是機密信息。
創建SELECT審計線索通常要比其它審計類型更為困難。很明顯,在這里,快照并不是一個可行的選擇,觸發器也不行,所以你只能使用數據庫跟蹤或外部的審計系統。你還可以選擇使用定制日志來構建視圖,但這樣做要求的工作量太大。在使用內部的數據庫特性時,你的選擇更為有限。例如,即使你可以跟蹤SELECT(例如,下圖所示:在SQL Server中使用DOP事件),這也往往是不現實的,因為你要收集太多的信息,并需要應用過濾器。
如果你選擇使用外部的審計系統,務必確保它能夠自動完成全部的審計功能。
總結
本系列文章介紹了多種不同的審計線索。為了確保自己的數據庫環境的安全,也為了遵循規范或內部要求,你需要實施這些審計。雖然不同的單位有不同需求,但都能夠映射到一系列數據庫審計功能上。這正是文章的重點所在。
為了選擇適合自己需要的審計類型,你需要選擇用于實施審計線索的方法和系統,并做出關于架構的決定。這一點很重要,因為審計并非權宜之計,你的部署應當經得起時間的考驗。
【編輯推薦】