劉文強 鞏青歌
武警工程學院通信工程系 陜西 710086
隨著計算機和通信技術的高速發展,數據庫作為計算機信息系統的核心部件,存儲著大量的各種軍事、商業的數據,數據庫安全顯得尤為重要。其中入侵檢測作為保護計算機安全的重要手段之一也引入了數據庫安全體系之中。基于數據庫本身數據和結構的一般都認為是基于事務級的入侵檢測,但他們基本都存在著諸多不足,比如利用數據讀寫關系的,由于數據庫數據的復雜性,造成性能和效率問題;審計日志、審計信息的冗余和對審計信息分析能力不足的問題一直難以解決等。基于網絡的入侵檢測一直是研究的熱點,也是現在比較成熟的入侵檢測系統,其中代表的就是免費開源的snort。它利用預先定義好的特征碼到網絡數據包的每幀來鑒定可疑流量。如果它發現匹配特征碼,就會馬上通知管理控制臺,從而做出相應的反應。網絡級的入侵檢測有著實時監測、快速反應的優點,通過對網絡級入侵檢測Snort的研究,本文提出利用Snort來彌補事務級數據庫入侵檢測的不足,形成聯動的入侵檢測系統。
SQL注入是利用WEB應用程序中所輸入的SQL語句從對數據庫獲得未經授權的訪問和直接檢索,這是針對 WEB程序開發者在編程過程未對 SQL語句傳入的參數做出嚴格的檢查和處理所造成的。事務級數據庫入侵檢測對這種常見的SQL攻擊的檢測是通過合法事務SQL的正則表達式(“指印”)來代表用戶的正常行為從而進行檢測,通過將數據庫查詢描述為查詢結果集中元組標識符集和屬性集的集合,提出查詢的相似度計算及其聚類方法,例如,對用戶輸入的用戶名和密碼值看作是查詢結果中的元組標示值,用戶屬性和密碼屬性作為查詢結果的兩個屬性,通過對閥值的控制來控制檢測率。但對閥值的控制是個問題,容易造成誤檢率偏大的問題。
相反,Snort在防范SQL注入的攻擊方面通過編寫規則庫對網絡數據包進行檢測,設置方便,配置靈活,由于很多文獻上都已經提出過Snort在這方面的檢測,本文只略做介紹下。正則表達式:
/ w * (( %27)|(‘))((\%6F) |o|( %4F))(( %72) |r|(\%52))/ix
其中, w * :零個或多個字符或者下劃線,( %27) | ’:單引號或它的十六進制形式,(\%6 F|o|( %4 F))((\%72|r|-(\%52):or’的大小寫以及它的十六進制形式。
編寫snort規則
alert tcp $EXTERNAL_NET any - > $HTTP_SERVERS$HTTP_PORTS (msg:“SQL Injection - Paranoid”; flow:to_server, established;uricontent:”.pl”;pcre
:” / w * (( %27)|(‘))((\%6F) |o|( %4F))(( %72)|r|(\%52))/ix”;classtype:Web-
Application-attack;sid:9099;rev:5;)
這樣通過對Snort規則的編寫,對關鍵詞單引號,分號和雙重破折號重點檢查,精確的檢測出SQL注入攻擊,這樣事務級數據庫入侵檢測不需要對基本的用戶登錄信息進行數據的聚類分析,可以集中分析審計日志等數據庫的特有數據和數據結構,提高了入侵檢測效率。
數據庫審計是數據庫系統中用來監視、記錄和控制用戶行為的一種機制,它使影響系統安全的訪問或訪問企圖留下線索,以備事后分析和追查。大多數據庫安全體制采取對數據庫中所發生的事件全部進行審計的方法,這樣雖然可以實現零信息丟失,滿足安全分析和責任追蹤的需要,然而卻大大降低系統的時間效率和空間效率,記錄了大量無用的事件信息。所以說,對數據庫所有事務進行審計是不必要的,很多文獻也提出了動態審計的概念,即審計系統要具備靈活配置審計策略的能力,通過靈活、有效地審計配置,在少占用時間和空間的前提下,又能夠為安全事件分析和責任追究提供足夠必要的信息。
Snort作為外圍的入侵檢測系統,能夠檢測出絕大部分網絡攻擊,對于可疑活動也能夠給出相應的報警。對于數據庫的審計恰恰需要這樣一個閥門來控制數據庫審計系統(圖1),審計策略要求在 Snort的報警下進行更全面和詳細的審計,這樣,通過報警后加強審計策略的能力,還能夠對危及主機數據庫的行為進行實時的報警,甚至采取相應的措施。

圖1 數據庫審計
數據庫的容忍入侵技術主要考慮在入侵存在的情況下系統的生存能力,保證系統關鍵功能的安全性和健壯性。由于新的攻擊手段形式不斷出現,現有大多數防火墻和入侵檢測對已知的和定好的入侵行為監測比較高,但對這些未知攻擊手段誤報率高,為此入侵是不可避免的,所以,研究入侵的情況下系統具有自診斷、修復和重構的能力是很有必要的。
現階段,數據庫入侵容忍首先要確定惡意事務和受感染的事務,由于數據庫具有特有的數據結構,可以通過基于事務依賴和基于數據依賴來實現;其次,就是撤銷惡意事務和受感染事務,常用的方法是回滾和補償。回滾是一種后向恢復的方法,將數據庫所有的活動回滾到不存在損壞的檢測點,但是由于經常需要保存且在前一監測點到回滾階段的操作都要撤消導致系統開銷較大。
補償方法通過執行補償事務來撤消提交的事務或操作步驟,補償法并不一定將數據狀態恢復到惡意事務或步驟未發生前的狀態。補償方法分為面向動作的或面向效果的,面向動作的補償方法只補償事務或相關步驟的操作,面向效果的補償方法不僅補償事務或相關步驟的操作同時也補償被相關步驟的操作所影響的其它操作。補償方法需要數據庫能夠辨識應用的語義信息,所以在應用上存在一定的限制。
在回滾過程中,全部回滾是對于系統安全的考慮,入侵檢測不能保證檢測出全部的惡意事務和受感染事務,但對于這種普遍采用的回滾技術,我們可以通過與Snort的聯動來全部捕捉惡意事務,提高回滾效率。在第一階段確定惡意事務和受感染的事務中,我們已經通過數據庫事務級的入侵檢測確定了惡意事務,這是網絡級入侵檢測Snort所辦不到的,但是事務級入侵檢測對于檢測用戶真正身份和地址無能為力,我們可以通過Snort來辦到。
在回滾前,我們分為三步來確定回滾事務。
(1)在檢測確定惡意事務后,與 Snort進行聯動通訊,分析惡意事務和受感染事務的來源。
(2)Snort對提出的這些惡意事務的地址和主機進行分析,記錄這些攻擊者身份和主機,查詢攻擊者之前除了這些以外提交的數據包,分析攻擊者的其他行為。
(3)Snort通過查詢以外數據包后,提取攻擊者提交的未察覺的受感染事務,向數據庫備份與恢復提供事務信息,這樣在回滾中不僅要回滾已經確定的惡意事務,同時也要回滾那些攻擊者提交的未察覺的可疑事務,如圖2所示。
這樣,在 Snort的幫助下,數據庫最大限度保證回滾數據中不含有惡意事務和受感染的事務,同時也提高了系統效率,降低了系統開銷。

圖2 數據庫入侵容忍
Snort輸出引用了靈活的插件形式,它允許Snort將報警和日志送到各種目標,使得管理員可以按照單位內部環境來配置容易理解、使用和查看的報警和日志方法。輸出插件用來控制Snort探測引擎的輸出,在Snort中配置輸出模塊的命令如下:
Output<插件名>:<配置選項>
我們采用ruletype來定義動作,將報警同時發送到Syslog和數據庫:

用以下規則應用這個自定義動作:
redalert tcp $HOME_NET any->$ EXTERNAL_NET 3306 (msg:”someone is sending”;flags:A+;)
這樣我們可以通過對日志和數據庫的檢索,得到報警結果,向目標數據庫事務級入侵檢測返回相應操作,從而實現我們增強數據庫安全的目的。
現階段數據庫的安全僅以預防為主,事務級入侵檢測仍存在于理論上,數據庫安全依然任重而道遠,網絡級入侵檢測在一段時間內仍然是網絡安全防范的主要手段,單純的研究網絡級或者事務級都有不可避免的缺點,兩者有機的結合的確可以在一定程度上提高整體的安全,對兩者的聯動問題還有待深入研究。
[1] Y.Hu,B.Panda.A data mining approach for database intrusion detection.In: Procof the 2004 ACM symposium on Applied Computing.Nicosia.Cyprus.2004.
[2] W.L.Low,J.Lee,P.Teoh.DIDAFIT: Detecting Intrusions in Databases through Fingerprinting Transactions.In:Proc.of the 4th International Conference on Enterprise Information Systems(ICEIS).Paphos.Cyprus.2002.
[3] 李振勝,鞠時光.安全空間數據庫動態審計策略的研究與應用.計算機應用.2006.
[4] 鐘勇,林冬梅,秦小麟.一種基于 DBMS的無監督異常檢測算法及其應用.計算機科學.2007.
[5] 張楠,張振國.基于規則的檢測 SQL注入攻擊方法的研究.陜西科技大學學報.2007.