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