◆郭成華
(杭州電子科技大學網絡空間安全學院 浙江 310018)
基于KDDCUP99數據集的入侵檢測系統的設計與實現
◆郭成華
(杭州電子科技大學網絡空間安全學院 浙江 310018)
KDDCUP99數據集中網絡連接特征屬性種類多,提取難度大,給研究人員將數據集應用到真實網絡環境中造成很大困難。同時因為數據集產生年代久遠,其中的攻擊手段和特征屬性對于當下復雜的網絡環境已經過時,因此迫切需要提取新的網絡連接特征,應用新型攻擊手段,制作出更符合真實網絡環境的數據集。通過對數據集制作方法的深入研究,給出了提取網絡連接特征的具體方法,進而設計出一套基于此數據集的入侵檢測系統。同時也為今后的研究中,制作新的入侵檢測數據集提供了參考。
KDDCUP99數據集;特征提取;入侵檢測 IDS
近年來,隨著網絡安全研究人員對入侵檢測技術的不斷探索,一批能夠在時間空間復雜度與漏檢誤檢率之間達到平衡的新型入侵檢測方法被提出。得益于人工智能的快速發展,基于新型機器學習算法的入侵檢測也逐漸成為人們研究的熱點。KDDCUP99數據集自從誕生以來,就被當做評估各種入侵檢測算法在性能和漏檢誤檢率方面優劣的標準。
然而,目前對于 KDDCUP99數據集的應用與研究,還僅限于對分類器效能的評估與離線入侵檢測,并沒有給出基于此數據集在實際網絡環境中應用的具體方法。KDDCUP99數據集針對每一條網絡連接都有41個特征屬性,而這些屬性中的一部分提取難度較大。官方描述文檔中并沒有提供相關的特征提取方法,給本數據集在實際網絡環境中的應用造成了一定的困難。
本文的創新點在于給出了一整套基于 KDDCUP99數據集的入侵檢測系統的設計與實現方案,解決了在實際網絡環境中特征提取困難的問題,為以后在真實網絡環境中運用 KDDCUP99數據集實現在線入侵檢測奠定基礎。
KDDCUP99數據集的原始數據是從美國國防部高級規劃署(DARPA)進行的一項入侵檢測評估項目中產生的,后經 Wenke Lee等人對原始數據進行特征提取,最終形成了這套數據集。訓練與測試數據集中每條記錄擁有41個特征屬性和一個攻擊類型標簽。特征屬性可以分為四大類:網絡連接基本特征(1-9號)、網絡連接內容特征(10-22號)、基于時間的網絡流量統計特征(23-31)、基于主機的網絡流量統計特征(32-41)。攻擊類型共計39種,可以分為四類:拒絕服務攻擊、來自遠程主機的未授權訪問、未授權的本地超級用戶特權訪問、端口監視或掃描。除攻擊類型外,還有一部分網絡連接是被標識為’normal’的正常類型。
入侵檢測系統首先需要單獨開啟一個進程用來捕捉網絡數據包,為以后的分析檢測不斷提供源數據。捕捉數據包的方法與原數據集采集的方法保持一致,使用tcpdump。為了實現對網絡入侵的實時檢測,必須使用循環的方式捕捉網絡數據包,也就是提前設定單個文件最大容納數據包的數量,到達此數量后輸出該文件并開始新一輪的數據包捕獲。只有通過這種方式才能為分析程序不斷提供最新截獲的數據包,達到實時檢測的目的。例如運用tcpdump監聽編號為1的接口并且達到50個數據包就輸出到data.pcap,在linux平臺上可以使用命令:

特征屬性中有兩大類與統計特征相關,而這類特征需要對時間連續且數量較多的數據包進行分析才能得出有效結論。因此在單個文件所含數據包數量較小的情況下,要想得到基于統計特征的有效結論,需要將多個小的數據包文件拼接成為一個較大的數據包文件。拼接數據包文件可以使用 wireshark下的命令行工具mergecap,例如將data1.pcap與date2.pcap拼接為all.pcap,可以使用命令:

通過對拼接后數據包文件的特征提取與分析,更容易檢測出統計特征明顯的攻擊。
每當一次循環抓包結束后,都需要對剛剛捕獲的文件進行特征提取與分析,這是實現入侵檢測系統的第二個重要步驟,需要單獨開啟一個進程執行。由于數據集的描述文檔中沒有對從原始數據中提取特征的方法進行說明,導致了提取特征困難。通過文獻[1-3]中與特征屬性相關的描述,本文提出了針對每一種特征的詳細提取方法。基于提取到的特征和事先訓練好的入侵檢測判斷模型,最終實現實時檢測。
一種較為簡單的方法是使用 Bro網絡安全監控系統[4]對原始數據分析并提取出原數據集中前22項特征屬性。Bro是一個提供BSD授權的開源軟件項目,它包含一種事件驅動型的腳本語言,可以應用這種語言重寫與特征屬性相關的事件處理函數。每當事件被觸發時,重寫后的事件處理函數都會對網絡連接的特征屬性做出相應調整,從而實現對原始數據的特征提取。
(1)提取特征之前的準備工作
在提取特征之前,首先要建立一個存儲特征屬性的數據結構。Bro腳本語言中的record類型類似于c語言中的結構體,可以用它存儲單條網絡連接的前22項特征屬性。然后需要再建立一個用來存儲所有網絡連接的容器table,便于最終的輸出。table類似于數組,這里把它設為擁有六個維度的用來存放record的容器。六個維度分別是:連接開始時間、連接持續時間、連接發起方地址與端口、連接應答方地址與端口,通過這六個維度能夠唯一確認一條網絡連接,保證不會與其他連接重復。
為了以后更方便的提取基于時間與主機的流量統計特征,record中除了前 22項特征外還需再添加連接序號、連接開始時間、連接發起方地址與端口、連接應答方地址與端口這幾項屬性,位置應該在22條特征屬性之前。其中連接序號是一個全局變量,每新增一條網絡連接,都會觸發bro中的”new_connection”事件。重寫該事件的處理函數,使其每次觸發時連接序號加1。最終輸出效果如下:
1 1502357627.511197 49154 921 192.168.1.103 192.168.1.107 0.000000 udp 921 OTH 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(2)duration、src_bytes、dst_bytes、protocol_type、land 特征的提取
這五種屬性的共同點是可以直接的從任何一種包含c:connection參數的事件中獲得。例如,在 bro腳本語言的new_connection事件中,可以用 c$duration,c$orig$size,c$resp$size分別獲得前三種屬性的值。使用 bro的內建函數get_port_transport_proto并將c$id$resp_p,也就是目標主機端口號作為參數傳入就可以得到協議類型的值。land屬性是判斷連接發起方與應答方的地址與端口是否完全相同的,使用c$id$orig_h、c$id$resp_h、c$id$orig_p、c$id$resp_p獲得四項特征并判斷雙方地址與端口是否相同即可。
(3)service特征提取
首先需要查閱數據集中所包含的70種服務類型所對應的端口號,然后建立一個將端口號作為輸入,服務類型名稱作為輸出的函數。最后在提取特征時,可以在包含 c:connection參數的事件中使用 c$id$resp_p得到目標主機的端口號,傳入函數中得到服務類型。
(4)flag特征的提取
此特征代表了一條網絡連接中,正常或錯誤的類型。共有13種類型,分別為S0、S1、S2、S3、REJ、RSTRH、RSTR、RSTOS0、RSTO、SF、SH、SHR、OTH。目前為止的資料中還缺乏對這些錯誤類型具體含義的詳細描述,本文中將通過框圖的形式具體給出判斷所有錯誤類型的方法。
如圖1,在任何一個包含c:connection參數的事件中,分別使用c$orig$state、c$resp$state、c$orig$size、c$resp$size再加上當前連接的協議類型,即可獲得判斷錯誤類型所需的信息。其中形如TCP_SYN_SENT為bro腳本語言內置的常量,用來表示連接發起方或應答方的狀態。Bro中TCP狀態共有7種,UDP狀態共2種,通過對連接發起方與應答方的狀態進行如圖所示的分析,就能得到一條網絡連接正確或錯誤的類型。

圖1 網絡連接flag特征提取方法
(5)8-22號特征提取
8-22號特征的提取需要重寫與特征本身相關的事件處理函數,每當這些事件被觸發時,就能通過對事件中相關參數的分析,對特征值做出調整。表1中給出與這些特征相關的事件及對事件參數的處理方法,其中一些方法在實際應用中還需要靈活運用正則表達式進行匹配。

表1 8-22特征的提取方法

?

?
提取這兩類特征需要對一段較長時間內所有的網絡連接進行整體分析,因此需要對3.1中提取出的特征進行輸出和整理。
bro_done事件會在bro分析結束后觸發,重寫這個事件的處理函數,使其在結束時將所有 table中保存的結果輸出到指定文件中,再使用sort -n命令將此文件中各條網絡連接按連接序號排序后輸出到最終的文件中,就可以開始對 23-41號特征進行提取。
根據文獻[2-3]中對這兩類特征的描述,本文提出了以下的方法實現特征提取:
以3.2最后輸出文件中m條連接的一部分屬性作為輸入,通過算法1、2,即可提取到這兩類特征屬性的所有值。
算法 1:提取基于時間的網絡流量統計特征算法
輸入: 網絡連接開始時間集D={d1,d2,...,dm}
網絡連接應答方地址集E={e1,e2,...,em}
網絡連接應答方端口集F={f1,f2,...,fm}
網絡連接正確或錯誤狀態集G={g1,g2,...,gm}
輸出:基于時間的網絡流量統計特征集
K={(k23_1,k24_1,...,k31_1),(k23_2,k24_2,...,k31_2),...,(k23_m,k24_m,...,k31_m)}
步驟:
1: K’={(k’23_1,k’24_1,...,k’31_1),(k’23_2,k’24_2,...,k’31_2),...,(k’23_m,k’24_m,...,k’31_m);
//最終輸出特征是百分比的形式,K’集合用于事先統計數量
2: 將K,K’集合中每一個元組的所有變量值初始化為0;
3: for i=1,2,...,m do
4: for j=1,2,...i-1 do
5: if (di-2≤dj≤di) //當前連接開始時間的前 2s內
6: if (ei==ej) //與當前連接具有相同目標主機
7: k’23_i=k’23_i+1;
8: if (gj==S0 or gj==S1 or gj==S2 or gj==S3)k’25_i=k’25_i+1;
9: if (gj==REJ) k’27_i=k’27_i+1;
10: if (fi==fj) then k’29_i=k’29_i+1;
11: else k’30_i=k’30_i+1;
12: if (fi==fj) //與當前連接具有相同服務
13: k’24_i=k’24_i+1;
14: if (gj==S0 or gj==S1 or gj==S2 or gj==S3)k’26_i=k’26_i+1;
15: if (gj==REJ) k’28_i=k’28_i+1;
16: if (ej≠ei) k’31_i=k’31_i+1;
17: end for
18: if (k’23_i≠0)
19:
k23_i=k’23_i;k25_i=k’25_i/k23_i;k27_i=k’27_i/k23_i;k29_i=k’29_i/k23_i;k30_i=k’30_i/k23_i;
20: if (k’24_i≠0)
21:
k24_i=k’24_i;k26_i=k’26_i/k24_i;k28_i=k’28_i/k24_i;k31_i=k’31_i/k24_i;
22:end for
算法 2:提取基于主機的網絡流量統計特征算法
輸入: 網絡連接發起方地址集C={c1,c2,...,cm}
網絡連接發起方端口D={d1,d2,...,dm}
網絡連接應答方地址集E={e1,e2,...,em}
網絡連接應答方端口集F={f1,f2,...,fm}
網絡連接正確或錯誤狀態集G={g1,g2,...,gm}
輸出: 基于主機的網絡流量統計特征集
K={(k32_1,k33_1,...,k41_1),(k32_2,k33_2,...,k41_2),...,(k32_m,k33_m,...,k41_m)}
步驟:
1: K’={(k’32_1,k’33_1,...,k’41_1),(k’32_2,k’33_2,...,k’41_2),...,(k’32_m,k’33_m,...,k’41_m)};
//最終輸出特征是百分比的形式,K’集合用于事先統計數量
2: 將K,K’集合中每一個元組的所有變量值初始化為0;
3: for i=1,2,...,m do
4: if (i<=100) then j=1;
5: else j=i-100;
6: for h=j,j+1,...,i-1 do
7: if (eh==ei)
8: k’32_i=k’32_i+1;
9: if (dh==di) k’36_i=k’36_i+1;
10: if (gh==S0 or gh==S1 or gh==S2 or gh==S3)k’38_i=k’38_i+1;
11: if (gh==REJ) k’40_i=k’40_i+1;
12: if (fh==fi) then
13: k’33_i=k’33_i+1;
14: if (ch≠ci) k’37_i=k’37_i+1;
15: if (gh==S0 or gh==S1 or gh==S2 or gh==S3) k’39_i=k’39_i+1;
16: if (gh==REJ) k’41_i=k’41_i+1;
17: else k’35_i=k’35_i+1;
18: end for
19: k32_i=k’32_i;k33_i=k’33_i;
20: if (k32_i≠0)
21:
k34_i=k33_i/k32_i;k35_i=k’35_i/k32_i;k36_i=k’36_i/k32_i;k38_i=k’38_i/k32_i;k40_i=k’40_i/k32_i;
22: if (k33_i≠0)
23:
k37_i=k’37_i/k33_i;k39_i=k’39_i/k33_i;k41_i=k’41_i/k33_i;
24:end for
提取特征完畢后,需要先對提取后的數據進行數字化和歸一化處理[6],其中處理的方法必須與訓練模型時預處理數據的方法保持一致。最后將處理后的數據輸入事先訓練好的模型中,從輸出中得到入侵類型判斷結果,實現在線實時入侵檢測。
實驗用虛擬機操作系統為 Ubuntu16.04(內核版本4.4.0-93-generic),使用 bro2.5.1進行 1-22號提取,python3.5.2進行23-41號特征提取和入侵檢測系統的整體構建,攻擊測試平臺為Kali和blackarch。實驗中對數據集預處理后采用KNN算法[5][7-8],對一部分常見攻擊手段進行測試,具體結果見表 2,證實了本文中所描述的特征提取方法能夠獲得與原數據集中記錄匹配的網絡連接特征,從而可以在實驗中將入侵檢測算法應用到實際網絡中。

表2 虛擬機實驗結果
通過對基于 KDDCUP99數據集構建入侵檢測系統的研究,實驗結果表明文中所述的方法可以將數據集和入侵檢測算法應用到實際網絡環境中。
KDDCUP99數據集從誕生到現在已經有18年了,雖然一直作為入侵檢測領域的一個公認測試標準,但是其中的攻擊手段對于當下的網絡環境顯然已經有些過時。本文中介紹的網絡連接特征提取的方法,可以幫助研究人員將新的入侵檢測算法運用到實際網絡環境中。更進一步,可以參考文中的思路搭建攻擊測試環境,制作新的入侵檢測數據集,為研究和防御新型網絡攻擊做準備。
[1]Lee W,Stolfo S J.A framework for constructing features and models for intrusion detection systems[J].ACM transactions on Information and system security (TiSSEC),2000.
[2]Tavallaee M,Bagheri E,Lu W,et al.A detailed analysis of the KDD CUP 99 data set[C]//IEEE Computational Intelligence Society.2009 IEEE Symposium on Computational Intelligence for Security and Defense Applications.July 8-10,2009.Crowne Plaza Ottawa Ottawa,ON,Canada.New York.IEEE,2009.
[3]Lee W,Stolfo S J,Mok K W. Mining in a data-flow environment:Experience in network intrusion detection[C]//ACM.The fifth ACM SIGKDD international conference on Knowledge discovery and data mining. August 15-18,1999.New York,NY,USA.ACM,1999.
[4]Mehra P.A brief study and comparison of snort and bro open source network intrusion detection systems[J]. International Journal of Advanced Research in Computer and Communication Engineering,2012.
[5]解男男.機器學習方法在入侵檢測中的應用研究[D].吉林:吉林大學計算機科學與技術學院,2015.
[6]吳建勝,張文鵬,馬垣. KDDCUP99 數據集的數據分析研究[J].計算機應用與軟件,2014.
[7]郭春.基于數據挖掘的網絡入侵檢測關鍵技術研究[D].北京: 北京郵電大學計算機學院,2014.
[8]劉棣華,余斌,王小芬.基于 RBF 神經網絡的入侵檢測模型的研究[J].網絡安全技術與應用,2008.
杭州電子科技大學網絡空間安全學院“紅客”大學生科研創新訓練計劃項目[WAHK0011]。