基于網絡引擎入侵檢測系統的研究與實現
3)數據分析 數據分析模塊的功能是分析某一特定協議數據。一個數據分析函數檢查一種協議類型的入侵,這樣可以方便地進行配置。一個協議數據可能有多個數據分析函數來處理它,這些函數地被放到一個鏈表中。一般情況下,數據分析盡可能地放到樹結構的葉子節點上或盡可能地靠近葉子節點,因為樹根部分調用次數最多,過多的數據分析函數聚集在此會嚴重影響系統的性能。同時葉子節點上的協議明確,分析程序可以少做一些冗余的工作,也由此提高了系統的處理速度。數據分析函數不僅僅由數據包觸發,也可以是系統定義的某一個事件來觸發。如時間、特定的數據包到來、管理員啟動、某種數據分析的結果等都可以觸發一個數據分析函數的啟動檢測。這些靈活的觸發方式提供了良好的可配置性,也提供了一個開放的、分布的平臺使各種分析技術在一個系統中工作。
數據分析的方法是入侵檢測系統的核心。使用了快速的模式匹配算法,所有的攻擊方法被表示為模式信號,存放在入侵特征數據庫中,當前的數據如果和數據庫中某種特征匹配,就指出這是這種入侵行為。如發現一個HTTP請求某個服務器上的“/cgi—bin/phf”,這很可能是一個攻擊者正在尋找系統的CGI漏洞。
本文設計這個體系結構時充分考慮了系統的開放性,可以向系統中添加任何一種分析方法,也可以把多種分析方法同時運用到系統中,甚至在不關閉系統的狀態下向系統動態地添加新的數據分析功能。這充分保證了系統的可靠安全服務。動態添加數據分析功能是通過添加新的動態連接庫中的數據分析函數來實現的。對于已經有的分析功能,可以在入侵特征數據庫中添加新的入侵特征,以增強現有模式匹配分析方法的檢測能力。
2 檢測規則和匹配算法
網絡引擎的實現中,最為關鍵的部分是數據分析模塊。該模塊中涉及到兩個問題:如何描述入侵行為;使用什么算法來快速檢測入侵行為的存在。
在實現中,本文使用了與SNORT兼容的檢測規則來描述入侵行為,使用一種改進的Boyer-Moore-Horspool算法來進行匹配。模式匹配是第一代和第二代入侵檢測系統所使用的基于攻擊特征的網絡數據包分析技術。它的分析速度快、誤報率小等優點是其他分析方法不可比擬的。協議分析有效利用了網絡協議的層次性和相關協議的知識,快速地判斷攻擊特征是否存在。它的高效使得匹配的計算量大幅度減小。
本文在網絡引擎的數據分析模塊中使用協議分析和模式匹配結合的方法來分析網絡數據包。首先使用協議分析來判斷要進行哪種類型的特征檢測,然后使用檢測規則來進行匹配。
2.1 檢測規則
每一個基于模式匹配的人檢測方法都需要一個已定的入侵模式。這就需要一種對入侵行為的描述方法。現在的各種入侵檢測系統中的描述方法各有不同,每個廠商定義自己的描述方法,每種方法各有優缺點。在網安入侵檢測系統中,采用了Snort的入侵行為描述方法。Snort是一個開放源代碼的輕量級的基于網絡的入侵檢測系統。這種描述方法簡單、易于實現,能夠描述絕大多數的入侵行為。由于其簡單,因此檢測速度比較快。每條規則分為邏輯上的兩部分:規則頭部和規則選項。規則頭部包含規則的操作、協議、源IP地址和目標IP地址及其網絡掩碼和端口。規則選項包括報警信息及需要檢測模式信息。以下是一個例子:
alert tcp any any->192.168.1.0/24 111(content:“|00 01 86 a5|”;msg:“mounted access”;)
以上規則描述了:任何使用TCP協議連接網絡IP地址192.168.1.1到192.168.1.255的任何主機的111端口的數據包中,如果出現了二進制數據00 01 86 a5,便發出警告信息mounted access。在圓括號前的部分是規則頭部,在圓括號中的部分是規則選項。規則選項部分中冒號前面的詞組稱為選項關鍵字。規則選項不是規則的必需部分,它只是用來定義收集特定數據包的特定特征。一條規則中不同部分必須同時滿足才能執行,相當于“與”操作。而同一個規則數據庫文件中的所有規則之間相當于一個“或”操作。規則頭部包含了定義數據包“從哪里來,到什么地方去、干什么”以及發現滿足這個規則所有條件的數據包時應該干什么的信息。規則的第一項是規則操作,第二項是協議,第三項是IP地址和端口。規則操作說明當發現適合條件的數據包時應該做些什么。有3種操作:alert、log和pass。
alert:使用選定的告警方法產生警報,并記錄這個數據包。
log:記錄該數據包。
pass:忽略該數據包。
規則頭部的第二部分是協議。
規則頭部的第三部分是IP地址和端口。關鍵字“any”可以用來定義任何IP地址。網絡引擎不提供從主機名稱到IP地址的轉換,所以IP地址規定為點分十進制的IP地址格式,在IP地址后指定網絡掩碼。例如任何由外部網絡發起的連接可以表示為:
alert tcp ! 192.168.1.0/24 any->192.168.1.0/24 111
端口號可以用幾種方法指定:用“any”、數字、范圍以及用“非”操作符。“any”指定任意端口。靜態數值指定一個單一端口,如80為HTYP,23為TELNET等。指定端口范圍用“:”,它可以指定一個范圍內的所有端口。如:
log udp any any->192.168.1.0/24 1:1024
記錄從任意主機發起的到目標網絡的任何主機上的1~1 024端口的UDP協議數據包。
log tcp any any->192.168.1.0/24:6000
記錄從任意主機發起的到目標網絡的任何主機上的端口號小于等于6 000的TCP協議數據。
log top any:1024->192.168.1.0/24 500:
2.2 匹配算法
匹配算法是檢測引擎的關鍵,它直接影響系統的實時性能。在網絡數據包搜索入侵特征時,需要一個有效的字符串搜索算法。字符串搜索算法中,最著名的兩個是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。兩個算法在最壞情況下均具有線性的搜索時間。在實用上,KMP算法并不比最簡單的c庫函數strstr()快多少,而BM算法則往往比KMP算法快上3~5倍。但是BM算法還不是最快的算法,還有很多改進的BM算法存在。
第一次匹配結果是在第二個字符處發現不匹配,于是要把子串往后移動。但是該移動多少呢?最簡單的做法是移動一個字符位置;KMP是利用已經匹配部分的信息來移動;BM算法是做反向比較,并根據已經匹配的部分來確定移動量。Boyer-Moore-Hompool算法根據被比較串對齊的最后一個字符(r)來決定位移量的多少。本文的方法是根據緊跟在當前子串之后的那個字符(例子中的i)獲得位移量。
顯然,由于上一次匹配的失敗,移動是必然的,因此,設移動步數為N,則N≥1。但N的最大值是多少?如果這個字符在模式串中,顯然應該根據模式串的位置來決定。如果它在模式串中就沒有出現,顯然連它自己也不用比較了,因此可以移動到該字符的下一個字符開始比較。以上面的例子,子串“search”中并不存在“i”,則說明可以直接跳過一大片,從“i”之后的那個字符開始作下一步的比較,如下:
substring searching procedure
search^
比較的結果,第1個字符又不匹配,再看子串后面的那個字符,是“r”,它在子串中出現在倒數第3位,于是把子串向前移動3位,使2個“r”對齊,如下:
substring searching procedure
search
這次匹配成功了。回顧整個過程,只移動了兩次子串就找到了匹配位置,可以看出,用這個算法,每一步的移動量都比BMH算法要大,所以比BMH算法更快。
以下是用類封裝的搜索算法:
c++相關文章:c++教程







評論