周 琰,馬 強
(國家氣象信息中心,北京 100081)
隨著計算機網(wǎng)絡入侵技術的快速發(fā)展,防火墻、用戶身份驗證和數(shù)據(jù)加密等傳統(tǒng)安全技術已無法充分保障網(wǎng)絡安全[1]。網(wǎng)絡入侵檢測系統(tǒng)(NIDS)作為對網(wǎng)絡傳輸進行即時監(jiān)視的防御機制,可以有效提高網(wǎng)絡系統(tǒng)的安全性[2]。NIDS可分為兩類[3]:基于異常的檢測和基于模式的檢測。其中,基于異常的檢測將入侵者不同于正常網(wǎng)絡的異常行為識別為惡性攻擊,從而可以檢測到未知和已知攻擊,但檢測結果假陽性率高[4];基于模式的檢測通過匹配預定義的攻擊模式來檢測異常,具有操作簡單、誤報率低的優(yōu)點,但無法檢測新型入侵攻擊模式[5]。
通常,當數(shù)據(jù)包有效載荷中識別出任何異常模式,NIDS將發(fā)出警告并攔截該數(shù)據(jù)包,從而保護網(wǎng)絡中的正常資源[6]。當采用基于模式的檢測設計NIDS時,模式匹配過程占NIDS執(zhí)行時間約70%[7],設計出高效的模式匹配算法對模式識別至關重要。模式匹配消耗系統(tǒng)執(zhí)行時間的70%,是影響NIDDS系統(tǒng)整體性能的關鍵因素。模式匹配算法可以分為單模式匹配和多模式匹配。其中,單模式匹配是在一個字符串內(nèi)找到單一模式,例如,字符串查找(KMP)算法[8]和字符串匹配(BM)算法[9];多模式匹配可以同時識別一個字符串中的多個模式,例如,Wu-Manber(WM)算法[10]和Aho-Corasick匹配(AC)算法[22]。
利用硬件處理的模式匹配算法主要通過可編程門陣列(FPGA)[11]、內(nèi)容可尋址存儲器(CAM)[12]和特定應用集成電路(ASIC)[13],從而實現(xiàn)高效匹配速度。然而相比硬件實現(xiàn)算法相比,在通用處理器(GPP)[14]上通過軟件實現(xiàn)算法具有成本低、可擴展性強的優(yōu)點。目前,單獨利用中央處理器(CPU)運算能力無法滿足高速網(wǎng)絡條件下模式識別速度,現(xiàn)有研究側重于在軟件平臺部署具有更高并行處理能力的圖形處理單元(GPU)來實現(xiàn)模式匹配算法[15]。盡管GPU比CPU具有更強的處理能力,但基于GPU的模式匹配算法在內(nèi)核啟動和數(shù)據(jù)傳輸方面具有延遲,導致整體性能受到限制[16]。此外,CPU所支持的單指令多數(shù)據(jù)(SIMD)操作可用于加速模式匹配。因此,在CPU和GPU之間設計高效的協(xié)同模式匹配算法已成為研究熱點。文獻[17]提出了基于拋物線Radon變換的CPU/GPU協(xié)同模式匹配算法,通過CPU多線程與多個GPU協(xié)同并行提高網(wǎng)絡流量檢測的吞吐量。文獻[18]利用基于隊列的混合調(diào)度策略設計了CPU/GPU協(xié)同模式匹配算法,縮短了CPU與GPU完成各自計算任務后的等待時間,加快了網(wǎng)絡流量檢測的整體延遲。文獻[19]和文獻[20]根據(jù)CPU處理后的數(shù)據(jù)包加載到GPU平臺的移植過程,分別設計了非確定性有窮自動機(NFA)和確定性有窮自動機(DFA),優(yōu)化了網(wǎng)絡接口與CPU和GPU的并行性,從而提高了僵尸網(wǎng)絡檢測處理性能。文獻[21]設計了基于CPU/GPU混合模式匹配算法(HPMA)的NIDS,實現(xiàn)CPU與GPU任務分配平衡,但具有不同長度的輸入流量數(shù)據(jù)包會導致GPU并行處理多線程執(zhí)行時間的增加,從而導致網(wǎng)絡流量檢測的吞吐量下降。
本文提出了一種具有長度約束的CPU/GPU混合模式匹配算法(LHPMA)來設計NIDS。當傳入數(shù)據(jù)包加載到CPU時,LHPMA根據(jù)預先設定的有效載荷長度約束對數(shù)據(jù)包進行提前分類。長度超過約束的數(shù)據(jù)包直接分配給CPU進行快速預過濾;否則,數(shù)據(jù)包直接分配給GPU進行全模式匹配。通過減少有效載荷長度的多樣性,提升了CPU/GPU協(xié)同檢測網(wǎng)絡入侵的性能。
文獻[21]提出的HPMA將網(wǎng)絡入侵檢測任務分為兩部分:數(shù)據(jù)包預過濾和全模式匹配。利用CPU執(zhí)行預過濾對“正?!焙汀翱梢伞睌?shù)據(jù)包進行分類,結合GPU對可疑數(shù)據(jù)包進行全模式匹配。HPMA的整體架構,如圖1所示。
圖1 HPMA的整體架構
首先,傳入數(shù)據(jù)包發(fā)送至CPU的主存儲器中,CPU訪問數(shù)據(jù)包并根據(jù)查找表(表名、基本信息表、間接尋址表和字段說明)對數(shù)據(jù)包進行預過濾。當表的大小足夠小時,可以降低內(nèi)存訪問延遲并減少預過濾時間,從而提高過濾率并降低數(shù)據(jù)傳輸延遲。然后,將預過濾后的可疑數(shù)據(jù)包發(fā)送至GPU進行全模式匹配。由于GPU紋理內(nèi)存的訪問延遲比設備內(nèi)存的訪問延遲低得多,采用AC算法[22]對GPU紋理內(nèi)存中存儲的可疑數(shù)據(jù)包進行全模式匹配,并將查找表(狀態(tài)轉換表、接受狀態(tài)表和失敗狀態(tài)表)復制到GPU紋理內(nèi)存中,從而加快檢測速度。最后,當全模式匹配完成后,將數(shù)據(jù)包匹配結果復制并返回CPU主存儲器。
通過在HPMA中使用預過濾方法,CPU可以進行快速的預過濾并達到較高的過濾率,從而減少GPU的延遲,提升網(wǎng)絡流量檢測效率。然而,在以下條件下,HPMA性能會受到限制:①所有傳入數(shù)據(jù)包最終都傳送至GPU,造成多余操作[23];②網(wǎng)絡流量由不同長度的數(shù)據(jù)包組成,造成GPU并行處理中每個線程的執(zhí)行時間不一致[24]。針對限制①,文獻[25]提出了基于性能的CPU/GPU混合模式匹配算法(CHPMA),CHPMA首先估計系統(tǒng)的CPU和GPU處理能力,在運行期間,CHPMA根據(jù)CPU的歷史過濾率和GPU處理能力自動進行處理選擇。針對限制②,本文提出了LHPMA來提升CPU/GPU協(xié)同檢測網(wǎng)絡入侵的性能。
與文獻[21]中的HPMA不同,本文提出的LHPMA在CPU對數(shù)據(jù)包進行預過濾期間,增加了長度約束分離算法(LBSA),即傳入數(shù)據(jù)包發(fā)送至CPU主存儲器之前,通過LBSA處理后進入預過濾緩沖區(qū)。LBSA主要用于檢查數(shù)據(jù)包有效載荷長度并對數(shù)據(jù)包進行分類。在經(jīng)過LBSA處理后,部分數(shù)據(jù)包存儲在CPU主存儲器中的預過濾緩沖區(qū)中,從而直接交付給CPU作預過濾的準備;剩余數(shù)據(jù)包則直接發(fā)送至CPU主存儲器中的全匹配緩沖區(qū),用于存儲要由GPU處理的全模式匹配數(shù)據(jù)包。LHPMA的整體架構,如圖2所示。
圖2 LHPMA的整體架構
當CPU主存儲器中的預過濾緩沖區(qū)變滿時,則由CPU訪問數(shù)據(jù)包并根據(jù)查找表(表名、基本信息表、間接尋址表和字段說明)對數(shù)據(jù)包進行預過濾,預過濾的數(shù)據(jù)包也發(fā)送至全匹配緩沖區(qū);當全匹配緩沖區(qū)變滿時,緩沖區(qū)內(nèi)的數(shù)據(jù)包就會轉移到GPU設備內(nèi)存中,采用AC算法[22]對GPU紋理內(nèi)存中存儲的可疑數(shù)據(jù)包進行全模式匹配,并將查找表(狀態(tài)轉換表、接受狀態(tài)表和失敗狀態(tài)表)復制到GPU紋理內(nèi)存中,從而加快檢測速度。最后,當全模式匹配完成后,將數(shù)據(jù)包匹配結果復制并返回CPU主存儲器。LHPMA的整體過程,如圖3所示。
圖3 LHPMA整體過程
LBSA的偽代碼,如算法1所示。LBSA算法根據(jù)預先設定的有效載荷長度約束對傳入數(shù)據(jù)包進行分類,從而減少GPU并行處理的有效載荷長度多樣性。給定數(shù)據(jù)包有效載荷集P和長度約束Lb,LBSA算法可以用Lb確定P中的有效載荷。
算法1:長度約束分離算法(LBSA)
輸入:數(shù)據(jù)包有效載荷集P和長度約束Lb
輸出:數(shù)據(jù)包有效載荷匹配結果
1)TPB←空;//預過濾緩沖區(qū)
2)TFB←空;//全匹配緩沖區(qū)
3)Pf←空;//預過濾有效載荷
4)idxPB←0;//預過濾緩沖區(qū)的索引
5)for每個Pido
6)Li←Pi的有效載荷長度
7)ifLi>Lbthen
8)TPB[idxPB]←Pi;//將Pi存儲在預過濾緩沖區(qū)中
9)idxPB←idxPB+1;
10)else
11)TFB←TFB∪Pi;//將Pi存儲在全匹配緩沖區(qū)中
12)end
13)
14)ifTPB變滿時then
15)Pf←預過濾的TPB;//執(zhí)行預過濾算法
16)TFB←TFB∪Pf;//將Pf存儲在全匹配緩沖區(qū)中
17)Pf←空;
18)TPB←空;
19)idxPB←0;
20)end
21)
22)ifTFB變滿時then
23) 結果←全匹配的TFB;//執(zhí)行全匹配算法
24)TFB←空;//匹配結果復制并返回
25)end
26)end
最初,預過濾緩沖區(qū)TPB和全匹配緩沖區(qū)TFB為空。同時,設置有效載荷集Pf用于臨時存儲預過濾結果,也是空(第1~3行)。預過濾緩沖區(qū)的索引idxPB設置為0(第4行)。對于P中的每個有效載荷,LBSA測量數(shù)據(jù)包Pi的有效載荷長度Li,從而與長度約束Lb進行比較(第5~6行)。如果有效載荷長度Li超過長度約束Lb,則系統(tǒng)將數(shù)據(jù)包Pi存儲在預過濾緩沖區(qū)TPB中,并等待CPU執(zhí)行預過濾過程(第7~8行)。在數(shù)據(jù)包Pi存儲在TPB后,預過濾緩沖區(qū)的索引idxPB將增加 (第9行)。否則,數(shù)據(jù)包Pi將存儲在全匹配緩沖區(qū)TFB中,并等待GPU執(zhí)行全模式匹配(第10~11行)。
當預過濾緩沖區(qū)TPB變滿時,則緩沖區(qū)中的所有數(shù)據(jù)包由CPU執(zhí)行預過濾得到有效載荷集Pf,并將其存儲在全匹配緩沖區(qū)TFB中(第14~16行),系統(tǒng)清除存儲在Pf、TPB和idxPB中的數(shù)據(jù)并繼續(xù)處理下一批傳入數(shù)據(jù)包(第17~19行)。同時,當全匹配緩沖區(qū)TFB變滿時,緩沖區(qū)中的所有數(shù)據(jù)包將復制到GPU設備內(nèi)存中并由GPU執(zhí)行全模式匹配過程。最后,將數(shù)據(jù)包匹配結果復制并返回CPU主存儲器,系統(tǒng)會清除存儲在TFB的數(shù)據(jù)(第22~24行)。
在本文設計的LBSA算法中,較短的數(shù)據(jù)包有效載荷由GPU處理,從而提高整體效率。由于使用較短數(shù)據(jù)包是一種典型的攻擊方式,大量的數(shù)據(jù)包可以在較短的時間內(nèi)生成并發(fā)送,如果將此類數(shù)據(jù)包直接發(fā)送至GPU,則可以減少由此類數(shù)據(jù)包引起的CPU預過濾的冗余操作。此外,GPU可以對較短數(shù)據(jù)包進行較強的并行處理。同時,較長數(shù)據(jù)包由CPU進行預過濾而不發(fā)送至GPU進行全模式匹配檢測,從而減輕了GPU處理負擔并減少數(shù)據(jù)傳輸延遲。
本文設計的預過濾和全模式匹配分別基于CPU和GPU組成的通用并行計算架構(CUDA)平臺實現(xiàn)多線程并行處理。實驗的硬件規(guī)格,如表1所示。
表1 實驗的硬件規(guī)格
CUDA平臺中配置的GPU塊數(shù)和每塊的線程數(shù)分別為128和64。同時,設置的預過濾緩沖區(qū)和全匹配緩沖區(qū)分別為1 MB和256 MB。利用文獻[21]中的HPMA算法的源代碼創(chuàng)建LHPMA算法的源代碼,結合算法1創(chuàng)建LBSA算法的源代碼,所有源代碼采用GCC4.8.4進行編譯,操作系統(tǒng)利用64位的Ubuntu14.04(內(nèi)核版本3.13)。
本文從Snort入侵檢測系統(tǒng)提取并生成實驗所需的模式集。Snort構成的模式集包含的模式數(shù)量最多,但字符數(shù)最少。模式集中的數(shù)據(jù)包長度從1到208 bytes不等,平均為13.8 bytes。如果輸入數(shù)據(jù)流中的字符串是模式集中任何模式的重要前綴字符串,則視為惡意攻擊。如果前綴字符串覆蓋了整個字符串的80%以上,則視為正常流量。對于每個輸入數(shù)據(jù)流量,根據(jù)匹配率,從模式集中隨機選擇適當?shù)那熬Y,并嵌入正常流量中。對于Snort構成的模式集采用HTML格式,并在Linux服務器中的/usr/bin下的所有文件連接起來作為正常數(shù)據(jù)流。同時,利用模式集生成預過濾和全模式匹配的查詢表,并加載到檢測系統(tǒng)中。從谷歌、亞馬遜和雅虎的門戶網(wǎng)站提取的網(wǎng)絡流量中選取真實的數(shù)據(jù)包檢測作為傳入數(shù)據(jù)包的輸入。輸入流量中的數(shù)據(jù)包有效載荷長度信息,如表2所示。
表2 輸入流量的數(shù)據(jù)包有效載荷長度信息
在分析LHPMA的結果之前,還需分析影響GPU處理性能的因素。不同全匹配緩沖區(qū)中CPU和GPU之間的數(shù)據(jù)平均傳輸速率,如圖4所示。其中,x軸表示全匹配緩沖區(qū)的大小,y軸表示以Gbps為單位的數(shù)據(jù)平均傳輸速率,AC-GPU表示利用GPU通過AC算法檢測數(shù)據(jù)包的匹配方法。
圖4 全匹配緩沖區(qū)中CPU和GPU之間的數(shù)據(jù)平均傳輸速率
由圖4可以看出,當全匹配緩沖區(qū)較小時,數(shù)據(jù)傳輸率非常低,即傳輸?shù)臄?shù)據(jù)包有效載荷很少。例如,當全匹配緩沖區(qū)為0.25 MB時,數(shù)據(jù)傳輸速率為1.95 Gbps。當全匹配緩沖區(qū)較大時,更多的數(shù)據(jù)包有效載荷在同一時間被傳輸,GPU執(zhí)行的數(shù)據(jù)傳輸速率會更高。例如,當全匹配緩沖區(qū)為256 MB時,數(shù)據(jù)傳輸速率為35.1 Gbps。最佳方案的并不是將全匹配的緩沖區(qū)大小設置的越大越好,這是由于過大的緩沖區(qū)會導致數(shù)據(jù)包有效載荷等待時間過長,從而影響整體性能。因此,選擇位于數(shù)據(jù)傳輸速率收斂的轉折點作為全匹配緩沖區(qū)的臨界值,本文選取全匹配緩沖區(qū)為256 MB。
不同全匹配緩沖區(qū)中GPU性能,如圖5所示。其中,x軸表示全匹配緩沖區(qū)的大小,y軸表示以Gbps為單位的平均吞吐量,AC-GPU-100和AC-GPU-1460分別表示較短(100 bytes)和較長(1 460 bytes)數(shù)據(jù)包有效載荷集。
圖5 全匹配緩沖區(qū)中GPU性能
由圖5可以看出,在全匹配緩沖區(qū)中,AC-GPU-1460比AC-GPU-100的吞吐量低,較長的數(shù)據(jù)包有效載荷集在全匹配緩沖區(qū)的吞吐量較小,這是由于LBSA算法將較長的數(shù)據(jù)包過濾后直接發(fā)送至全匹配緩沖區(qū),等待GPU的處理,造成了GPU性能降低。當全匹配緩沖區(qū)較小時,GPU性能較低,尤其是在全匹配緩沖區(qū)為2 MB的AC-GPU-1460情況下。數(shù)據(jù)包有效載荷的數(shù)量很少,導致GPU線程利用率低,從而降低了整體性能。即輸入有效載荷集的長度也會影響GPU效率。較短的數(shù)據(jù)包可收集成更多的數(shù)據(jù)包,有利于GPU的并行處理能力。因此,AC-GPU-100的效率表現(xiàn)為5.37 Gbps到9.03 Gbps,高于 AC-GPU-1460從2.71 Gbps到6.10 Gbps的效率。
不同有效載荷長度中GPU性能,如圖6所示。
圖6 有效載荷長度中GPU性能
由圖6可以看出,較短的數(shù)據(jù)包有利于GPU效率。這是由于GPU具有較強的并行處理能力,可將較短的數(shù)據(jù)包中的有效載荷集在GPU紋理內(nèi)存中集中收集狀態(tài)轉換表并做統(tǒng)一識別處理,加速了并行處理較短的數(shù)據(jù)包的能力。當有效載荷集長度為250 bytes時,GPU最多可以完成高達8.0 Gbps的吞吐量。隨著有效載荷長度的增加,GPU的吞吐量逐漸下降。這是由于GPU設備內(nèi)存中較短的有效載荷數(shù)量多于較長的有效載荷數(shù)量,同時,GPU內(nèi)核的數(shù)量遠大于CPU內(nèi)核的數(shù)量,從而GPU利用多線程并行處理提高檢測流量的吞吐量。
不同有效載荷長度約束中LHPMA性能,如圖7所示。其中,x軸表示有效載荷長度約束Lb,y軸表示以Gbps為單位的平均吞吐量,LHPMA-AC表示LHPMA通過AC算法檢測數(shù)據(jù)包的匹配方法。
圖7 有效載荷長度約束中LHPMA性能
由圖7可以看出,當Lb=0時,所有傳入數(shù)據(jù)包都以12.7 Gbps的吞吐量通過預過濾緩沖區(qū),即數(shù)據(jù)包通過LBSA算法后所有數(shù)據(jù)包都沒有通過預過濾緩沖區(qū)就被發(fā)送至CPU。隨著Lb的增加,吞吐量提升至14.0 Gbps。當Lb=750時,這與圖6的結果相對應。即通過LBSA算法將較長的數(shù)據(jù)包存儲在CPU主存儲器中的預過濾緩沖區(qū)中,CPU訪問較長的數(shù)據(jù)包并根據(jù)查找表(表名、基本信息表、間接尋址表和字段說明)對數(shù)據(jù)包進行預過濾,降低內(nèi)存訪問延遲并減少預過濾時間,同時,較短的數(shù)據(jù)包存儲在CPU主存儲器中的全匹配緩沖區(qū)中,當全匹配緩沖區(qū)變滿時,全匹配緩沖區(qū)內(nèi)的數(shù)據(jù)包就會轉移到GPU設備內(nèi)存中,采用AC算法對GPU紋理內(nèi)存中存儲的可疑數(shù)據(jù)包進行全模式匹配,AC算法通過插入許多模式,從前往后遍歷數(shù)據(jù)包的整個字符串,要插入的字符其節(jié)點再先前已經(jīng)建成,直接去考慮下一個字符即可,當發(fā)現(xiàn)當前要插入的字符沒有再其前一個字符所形成的樹下沒有節(jié)點,就要創(chuàng)建一個新節(jié)點來表示這個字符,接下往下遍歷其他的字符。并將查找表(狀態(tài)轉換表、接受狀態(tài)表和失敗狀態(tài)表)復制到GPU紋理內(nèi)存中,使得有效載荷長度的多樣性減少,從而提高過濾率并降低數(shù)據(jù)傳輸延遲。LHPMA提高了檢測流量的吞吐量。當Lb=1 460時,吞吐量下降至5.9 Gbps,這是由于AC算法從數(shù)據(jù)包的根節(jié)點開始,每次根據(jù)讀入的字符沿著自動機向下移動。當讀入的字符,在分支中不存在時,遞歸走失敗路徑。如果走失敗路徑走到了根節(jié)點,則跳過該字符,處理下一個字符。因為AC自動機是沿著輸入文本的最長后綴移動的,所以在讀取完所有輸入文本后,最后遞歸走失敗路徑,直到到達根節(jié)點,這樣可以檢測出所有的模式。所有傳入數(shù)據(jù)包都沒有通過預過濾緩沖區(qū)就被發(fā)送至GPU,從而數(shù)據(jù)傳輸延遲和有效載荷長度多樣性導致LHPMA性能的下降。
將本文提出的LHPMA與HPMA[21]、僅使用CPU[26]、僅使用GPU[27]的性能進行對比,如圖8所示。其中,HPMA-AC和AC-CPU分別表示HPMA和CPU通過AC算法檢測數(shù)據(jù)包的匹配方法,同時,LHPMA-AC選擇的長度約束Lb=750。
圖8 LHPMA與其他方法的性能對比
由圖8可以看出,LHPMA-AC、HPMA-AC、AC-GPU和AC-CPU的吞吐量分別為13.8、12.7、5.9和4.6 Gbps,表明LHPMA-AC比HPMA-AC增強了性能。這是由于LHPMA-AC比HPMA-AC增加了LBSA算法,根據(jù)預先設定的有效載荷長度約束對傳入數(shù)據(jù)包進行分類,較長的數(shù)據(jù)包分配至CPU主存儲器中的預過濾緩沖區(qū)中,憑借CPU更強的處理能力可以對較長的數(shù)據(jù)包進行檢測,而較短的數(shù)據(jù)包分配至CPU主存儲器中的全匹配緩沖區(qū)中,憑借GPU更強的多線程并行處理能力可以對較短的數(shù)據(jù)包進行檢測,從而減少GPU并行處理的有效載荷長度多樣性。同時,LHPMA-AC分別比僅適用GPU-AC和僅適用CPU-AC方法高出了2.3和3.0倍。這是由于LHPMA-AC綜合了CPU較強的處理能力和GPU并行處理能力,提升了CPU/GPU協(xié)同檢測網(wǎng)絡入侵的性能。
本文提出了一種具有數(shù)據(jù)包有效載荷長度約束的CPU/GPU混合模式匹配算法(LHPMA)來設計NIDS,提高了輸入流量中各種有效載荷長度情況下的入侵檢測效率。通過預先設定長度約束分離算法(LBSA)對傳入數(shù)據(jù)包進行分類,減少有效載荷長度的多樣性。將較長的數(shù)據(jù)包分配給CPU主存儲器的預過濾緩沖區(qū)中,直接由CPU訪問數(shù)據(jù)包并根據(jù)查找表對數(shù)據(jù)包進行預過濾,并將預過濾的數(shù)據(jù)包也發(fā)送至全匹配緩沖區(qū)。同時,將較短的數(shù)據(jù)包分配給CPU主存儲器的全匹配緩沖區(qū)中,并發(fā)送至GPU設備內(nèi)存中,結合AC算法對GPU紋理內(nèi)存中存儲的可疑數(shù)據(jù)包進行全模式匹配,提升了CPU/GPU協(xié)同檢測網(wǎng)絡入侵的性能。實驗結果表明,在LBSA算法中選擇適當?shù)拈L度約束,可以有效提升LHPMA的性能,并且LHPMA的性能優(yōu)于HPMA以及CPU和GPU的單獨處理方法。未來的研究中,將致力于分析輸入流量中不同有效載荷長度分布情況,改進 LHPMA方法對CPU/GPU協(xié)同處理網(wǎng)絡入侵的性能。