王金華
(四川大學,四川 成都 610207)
基于網絡的入侵檢測的目標是識別那些企圖通過網絡跨越被保護系統安全邊界的行為,任何損害系統安全性的網絡入侵行為都應被識別,從而讓系統快速做出響應。異常入侵檢測對于網絡安全有著重要的意義,通過對正常用戶行為的建模它可以識別出異常的流量,從而檢測新型的攻擊。在檢測過程中,研究者面對的是網絡上捕獲的網絡流量數據,對于這些數據,其中一種處理方法是根據專家知識和統計學提取人工特征,形成特征集,然后基于人工特征數據執行入侵檢測,識別某條記錄是異常流量還是正常流量。
KDDCup-99數據集[1]是1999 KDD杯挑戰賽提出的入侵檢測數據集,該數據集對網絡流量進行預處理,提取了基本特征、內容特征、基于主機的流量特征、基于時間的流量特征4大類人工特征,共計41個小特征,含有4種攻擊類型,總計包含400萬條記錄,保存為txt文件。然而,使用KDDCup-99數據集來驗證檢測方法存在著諸多的不足,如存在攻擊類型定義模糊、冗余的記錄過多等問題。針對KDDCup-99數據集的缺點,Tavallaee等人[2]在該數據集的基礎上,刪除了冗余項,規劃了訓練集和測試集的比例,提出了NSL-KDD數據集,此數據集對于41維特征沒有做出改變,主要優點是類別分配平衡,是用于入侵檢測方法比較的基準數據集。
上述兩種數據集并沒有提供網絡流量數據文件,而在2015年公開的UNSW-NB15[3]和2018年公開的CICIDS-2018[4]數據集則提供了網絡流量數據pcap文件和已經預處理提取好特征的csv文件。Moustafa等人[5]對UNSW-NB15數據集做了評估分析,認為其包含新型的攻擊方式,更具復雜性,可以取代KDDCup-99數據集成為新的基準數據集。上述3種數據集(KDDCup-99和NSL-KDD算一種)人工提取的特征有著高度的相似性,均包含數據流的持續時間、目的端口、協議、數據包發送速率、傳輸控制協議(Transmission Control Protocol,TCP)數據流中設置為PSH和URG的次數、數據包大小,以及一些其他的流統計特征,如流數據包數目、到達時間偏差、其他基于時間的(如最近100個連接中具有相同源地址的個數)統計特征。不同的是,不同的數據集中有一些獨特設計的人工特征。值得注意的是,這些特征往往需要整體的流量情況做支撐,才能計算出統計學特征。
對于深度學習方法,如卷積神經網絡(Convolutional Neural Network,CNN)和循環神經網絡(Recurrent Neural Network,RNN)等,其強大的地方在于可從復雜的原始數據如圖像、文本等數據中自動提取特征,并用這些人類無法確切解釋,但是十分有效的特征進行一些人工智能(Artificial Intelligence,AI)任務,如對象檢測或者語音識別、機器翻譯[6]等。將人工特征送入CNN或RNN中進行分類,只是將其作為一個強大的分類器,沒有利用到深度學習方法強大的表示學習能力。盡管目前研究者所提出的方法在入侵檢測分類上得到了良好的效果,但是面對各種新型的攻擊類型,人工提取的特征是否還能勝任檢測工作還存在疑問,以及對檢測方法的實時性要求,也需要檢測方法可以快速獲取依賴的特征,而不是在整個流量都得到之后再進行計算,因此研究者開始探索直接監測網絡流量的方法。
隨著深度學習的興起,使用深度學習方法替代傳統機器學習算法開展入侵檢測的趨勢逐漸形成,但也正如引言中的描述,這些方法很多是基于已有的人工特征的分類算法,很少直接針對網絡流量數據進行設計,或者忽視了網絡流量數據某一方面的特征。本節將簡要介紹其他研究者在入侵檢測領域所做的工作。
Hu等人[7]研究了傳統支持向量機(Support Vector Machine,SVM)、魯棒SVM、K最近鄰(K-Nearest Neighbor,KNN)在KDD-99數據集上的性能表現,實驗表明使用魯棒SVM在準確率和誤報率上表現更好。Dong等人[8]則對SVM、決策樹C4.5、貝葉斯(Naive Bayes)和使用了玻爾茲曼 機(Restred Bolzman Machine,RBM)的SVMRBM進行了比較,實驗表明結合了RBM技術的SVM在KDD-99數據集中具有最好的性能。Ravi等人[9]則綜合評估了卷積神經網絡CNN和循環神經網絡RNN,包括長短期記憶網絡(Long Short Term Memory,LSTM)、門控循環單元(gate recurrent unit,GRU),以及結合使用CNN和RNN的深度神經網絡。他們將這些在KDD-99上表現良好的深度神經網絡(Deep Neural Network,DNN)模型應用于其他數據集,例如NSL-KDD、UNSW-NB15、Kyoto、WSN-DS和CICIDS-2017,并對其進行了全面而完整的分析。實驗結果表明,使用深度學習作為分類器學習人工特征所含信息做出決策的能力要比傳統機器學習更好。此外,Xu等人[10]詳細對比了采用LSTM和GRU[11]的循環神經網絡在入侵檢測數據集NSL-KDD和KDD 99上的性能表現,實驗表明采用雙向GRU能夠達到更好的性能,當然這只是在特定領域里,比如Chung等人[12]的研究表明了在復調音樂建模和語言信號建模兩種任務上,這兩種網絡性能相當。
雖然深度學習方法在人工特征集上的任務中表現出優越的性能,但是不能忽略其更強大的能力,即從原始低級數據習得高級抽象(自動特征)即表示學習的能力。Wang等人[13]將網絡流量數據表示成1 000長的一維序列,采用堆疊的自動編碼器(Stacked Auto Encoder,SAE)做網絡協議識別,取得了良好的效果。Wang等人[14]第一次嘗試將網絡流量轉化為圖像,使用卷積神經網絡進行惡意軟件流量分類,在他們自建的數據集USTC-TFC2016上,取得了平均準確率99.41%的好成績。他們還對如何表示網絡流量取得最佳性能做了對比實驗,實驗結果表明,采取會話即雙向流和所有數據包層的流量表示類型會取得最好的結果。此外,他們還使用一維卷積神經網絡來鑒別加密流量和未加密流量[15]。也有研究者采用網絡流量數據做入侵檢測的流量識別,Peng等人[16]將網絡流量作為圖像,送入卷積神經網絡中檢測該流量是否是安卓惡意軟件流量。此外,基于循環神經網絡,Radford等人[17]將流量數據視為機器之間對話的語言,使用LSTM進行序列建模,并提出了一個簡單的基于頻率的模型,采用受試者工作特性曲線(Reciver Operating Characteristic,ROC)下面積(Area Under Curve,AUC)為評估指標,實驗在IDS-2017上進行,取得了不錯的效果。
本文從網絡流量中提取會話樣本后,首先將會話中數據包含有的字節作為一個一維長序列送入門控循環單元GRU中,類似于自然語言處理中一句話中的一個個單詞,利用RNN提取數據包的時序相關特征;其次整個流中各個數據包被合并為一個固定尺寸的二維圖像,被送入一個卷積神經網絡提取空間特征;最后結合這兩種特征做入侵檢測。相比于先經過卷積然后經過RNN處理的線性方法,這種方法是雙線并行的。先提取空間特征可能由于卷積層和池化層的存在送入RNN后會損失一部分信息,本文方法則避免了這種可能性,并且關注整個流的空間特征。本文算法直接從原始字節流量學習深層抽象特征,完成入侵檢測任務,是一種端對端的入侵檢測算法,一端是數據,一端是任務,無需人工特征提取,并且具有實時檢測的優點。
本文提出的算法的重點在于處理網絡流量數據生成可用于深度學習的流量樣本,以及構建神經網絡模型,從這些流量樣本中提取出良好的特征用于檢測流量是正常流量還是異常流量,整體流程如圖1所示,最后得到一個可用于入侵檢測的模型。圖1還顯示了本文算法的一個重要優點是無需人工設計特征,無需專家知識,由模型自動提取特征。

圖1 算法流程
在計算機網絡中,定義5元組(源IP,目的IP,源端口,目的端口,協議)相同的一系列數據包同屬于一個流,源IP和目的IP相反,源端口和目的端口相反,協議相同的另一個流是它的反向流,前向流和反向流就構成了一個雙向流即會話,以下統稱會話。在這樣的定義下,網絡數據基本上分為TCP會話和用戶數據報協議(User Datagram Protocol,UDP)會話兩大類,當然,根據應用層協議的不同在這兩類上會衍生出很多小類,如網絡流中最多的超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)會話。對于TCP會話,第1個SYN報文標志著會話開始,而FIN包之后的ACK包表示會話的結束。對于UDP會話,定義在最初始的數據包之后600 s(已經能夠包含絕大多數的數據包)內的會話是同一個會話,超時過后即使5元組相同也將其劃分為一個新會話,同樣對于TCP會話也有超時的設定。流量分割的流程如圖2所示。

圖2 流量分割流程
值得注意的是,在收到TCP-FIN數據包之后,根據TCP4次握手的規則,還需要再收到一個ACK包才算是結束了整個TCP會話,5元數組只會記錄該會話第1個數據包的接收時間,用于判斷與該5元組相同的數據包加入該會話時是否超時。
在流量分割后,獲得了以張量形式存儲的會話樣本x,x是一個二維張量n×m,其中n表示該會話中數據包的個數,m是最大字節數,因此x是一個n行m列的矩陣。對于字節數超出m的數據包只能截取m個字節,少于m則空缺處填0。如圖3所示,對于每個會話樣本張量n×m,按順序取出n個m長的一維序列送入GRU中,GRU將在這n個序列中共享權重、記憶相關信息,不需要理會這個n長序列的具體位置情況,最后在經過n個時間步后得到一個1×f的向量。將會話樣本n×m組成一個固定大小為w×w的二維矩陣,類似于只有一個顏色通道的灰度圖像,如果n×m大于w×w,則丟棄樣本x的多余數據,小于w×w則在剩余位置填0,將其送入卷積神經網絡CNN中,最后也會得到一個1×f的向量。最后將這兩個特征向量在第一維拼接起來,得到一個1×2f的特征向量,至此,完成了特征提取。
圖3上半部分所示的CNN卷積網絡中,依順序分別是3×3的卷積層、2×2的池化層、3×3的卷積層、2×2的池化層、2×2的卷積層,最后是一個全連接層,共計3個卷積層,2個池化層,1個全連接層,最后輸出1×128的向量。下半部分為一個循環神經網絡的展開圖,采用的是LSTM的一個較為輕量的網絡變種——門控循環單元GRU。一個流的所有數據包按順序依次作為1個m長向量送入GRU,采用最后輸出的output作為特征向量,是1個1×128的向量。最后,將這兩個向量連接,就得到1個1×256的總特征向量,就是全連接網絡所期望的輸入值。

圖3 會話樣本特征提取流程
不同于人工設計特征,在執行任務前,提取的特征需要專家知識,而且后續使用傳統機器學習也無法對該特征工程進行指導優化,這是因為沒有明確的方法改進特征的優化提示,且如果模型效果不好,不能判斷是特征不好還是模型不好;而本文算法模型所得到的特征向量和所執行的任務是一體的,提取的特征會在訓練過程中通過優化算法不斷改進,從輸入網絡流量數據到模型執行入侵檢測任務的過程,整個模型是端到端的。
將前面特征提取網絡輸出的1×256向量作為輸入,經過兩層的全連接層,最后輸出1×Categories(類別數)張量,使用Softmax函數概率化每個類別的置信度,取最高置信度所在下標的類別即為神經網絡輸出的類別。兩個全連接層的網絡結構為,1個(256,64)的全連接層和1個(64,2)的全連接層,最后使用softmax輸出置信度。
實驗目的:對比本文提出的基于深度學習建立的端到端的入侵檢測算法和基于人工規則特征的入侵檢測算法的入侵檢測性能,證明算法有效性。本文實驗環境:Windows10-21H1,Python-3.8.10,Pytorch-1.9,scikit-learn-0.24.2,CPU i5-10400,GPU 1060。
為了獲得算法對當前網絡流行攻擊的檢測效果,本文選擇了CICIDS-2018數據集[5],該數據集是加拿大通信安全機構和網絡安全研究所的合作項目成果,涵蓋了如暴力攻擊、Heartbleed漏洞攻擊、DOS攻擊、分布式拒絕服務(Distributed Denial of Service,DDoS)攻擊、Web攻擊(跨站腳本攻擊)、結構化查詢語言(Structure Query Language,SQL)注入、僵尸網絡、滲透攻擊共7種攻擊場景。該數據集雖然不是真實場景的攻擊流量數據集,但是該數據集通過機器學習技術統計分析正常用戶的網絡行為,從而模擬正常用戶流量,使用上述攻擊場景模擬異常流量,并使用配置文件的方式生成了一個較為全面、一定程度上真實可靠的異常檢測流量數據集。
CICIDS-2018數據集針對捕獲的原始流量,使用CICFlowMeter-V3的工具,從統計分析的角度,按照人類專家規定的特征提取了80維特征,本文算法需要與該人工特征做對比。本文選取了Wednesday-21-02-2018_Traffic和Friday-02-03-2018_Trafficr兩天的網絡流量數據,其包含正常流量和Bot、DDoS-LOIC-UDP、DDoS-HOIC 3種攻擊流量,其中LOIC(Low Orbit Ion Cannon)是低軌道離子炮,對該網絡流量進行流量分割,其異常流量分布如表1。

表1 CICIDS-2018人工提取特征和本文分割流量攻擊類別分布
CICIDS-2018提供了基于主機的收集的眾多流量pcap文件,對于這些文件,需要先篩選數據,選取攻擊流量攻擊目標主機的pcap文件分割得到攻擊會話樣本,并選取其他正常通信主機得到正常會話樣本,提取數據后需要對樣本進行標記,詳情需要參考CICIDS-2018的具體實施攻擊場景,按照攻擊時間、端口、協議、IP等信息匹配樣本,進行標簽分配,該工作較為繁瑣,需要格外仔細。
CICIDS-2018提供的已經提取好特征的數據集為csv文件,它的每一條記錄就是一個會話(雙向流),所有的特征是基于雙向流的統計特征得出的,如流持續時間、正向包數、反向包數、正向字節數、反向字節數等,兩天共計2 097 150條數據。本文基于2.1節所提出的流量分割算法切割網絡流量,對于Friday-02-03-2018含有僵尸網絡的流量進行分割,提取出雙向流會話,共計100 000個會話,會話分布如表1第4列所示,對Wednesday-21-02-2018分割了共計100 000個會話,會話分布如表1列5所示。
提取的會話數據以張量的形式存儲,一個會話最后的張量形式為n×256,n是數據包的個數,根據每個會話的情況動態變化,256個字節是每個數據包最大接受的字節數,在對網絡流量數據進行處理的時候,發現數據包的平均字節數為213(Bot)、74(DDoS -LOIC-UDP)、179(DDoS -HOIC),最后選取了256字節的數據長度存儲數據包,超出256就截取前256個字節,少于256,空余位置填0。
圖4是各種異常會話的可視化圖像,其中每一張圖片都是一個會話的整體圖像,尺寸為28×28。

圖4 異常會話可視化
對于數據包數n,實際網絡中n可能極大,而在本文分割出的DDoS-LOIC-UDP異常會話中,按照既定規則該會話的數據包數高達十幾萬個,同時這也是DDoS-LOIC-UDP的特點,該攻擊使用多臺計算機針對目標服務器開放的端口,短時間內發送了大量偽造源IP地址的UDP數據包,消耗服務器的資源,網絡充滿無用數據,使其癱瘓,從而不能正常提供服務。通常來說UDP會話在正向流和反向流中數據包數相等,而在該攻擊中只會在發送方一側出現大量數據。當DDoS攻擊者已經發送了大量數據包的時候,攻擊的目的已經基本完成時,服務器根據網絡狀況和自己負載狀態等條件,很容易就可以判斷自己受到了DDoS攻擊,然而此時檢測到攻擊已經過于遲鈍了,因此對于DDoS攻擊最好的檢測狀態是能夠提前發現攻擊。本文采用的最大數據包數為32,對于大于32的會話會只截取一部分,對于有大量數據包的會話,可以根據局部特征識別該類攻擊,在攻擊初見跡象的時候就可以識別它,并作出警示。如圖4所示,LOIC-UDP攻擊可視化完整圖像基本就是下半部分的重復。
在實際訓練中,數據包并沒有出現由于冗余而造成計算資源浪費的現象,因為對于實際為空的數據包,其實并不參與實際計算,該種形式是為了樣本統一格式,方便處理。
3.1 節中得到的會話總計100 000個,將其打亂,按照7∶3的比例,分出70 000個會話作為訓練集,30 000個數據作為測試集。損失函數是交叉熵損失函數CrossEntropyLoss,用于衡量模型分布和經驗分布之間的距離,距離越小,模型就越接近經驗分布。優化算法是基于梯度下降的后向梯度傳播算法Adam,訓練集被循環使用10個epoch(時期),可以看到訓練集在大概第8個epoch的時候就開始收斂。
學習率參數設置:在使用Adam優化算法時,本文算法設置初始的學習率為0.001,在訓練中,開始時學習率可以設置得適當大些,以讓模型更快地接近最優點,之后應該將學習率減少,以避免跳過最優點,因此本文使用余弦曲率衰減計劃,它會按照余弦曲線,即初始緩慢減少學習率,之后快速減小學習率,余弦曲線的周期可以指定,本文指定其為10,與訓練集的循環次數一致,最低學習率選擇默認為0。
對于模型性能的指標,本文采用混淆矩陣的方式進行計算,表2為二分類混淆矩陣,可以基于將某一類視為正類,其他類視為負類的方式將混淆矩陣擴展到多分類。

表2 混淆矩陣
準確率acc:模型預測正確的數目占所有樣本的比例,如式(1)所示。在各個類別平衡時,該指標能夠表明模型性能,但是在極端類別情況,如正類10個、負類90個,模型只需要輸出全負類,就可以達到90%的準確率,然而其對正類的預測能力為0。

精確率p:模型預測為類別C的樣本中其實際類別為C的樣本所占比例,如式(2)。

召回率r:實際類別為C的樣本中模型預測為C的樣本所占比例,如式(3)。在上面闡述的類別不平衡分類中,就可以計算出正類的召回率為0/10=0,由此可以判斷模型的預測能力完全無效。

F1值F1-score:精度p和召回率r的調和平均值,如公式(4),它綜合考慮了準確率和精確率的值,F1值越高,模型性能越好。

本文針對3.1節中所提取的網絡會話做實驗,具體是對Friday提取的100 000個會話的含有僵尸網絡Bot的數據集進行實驗,其結果如圖5所示,其準確率為99.996 7%,精確率為100%,召回率為99.995 0%,F1值為99.997 5%。
對Wednesday提取了正常會話(Benign)和DDoS-LOIC-UDP、DDOS-HOIC兩種攻擊會話,總計100 000個會話。對這些會話進行實驗,其結果如圖5所示。實驗對總體樣本識別的準確率為99.99%,對正常流量的識別,以及對LOIC-UDP和對DDoS-HOIC的識別在各項指標上成績也為99.99%,錯誤識別的樣本數極少。在對LOIC-UDP的檢測攻擊中,即使由于最大數據包數的限制,導致算法無法取得該攻擊高達十幾萬個的數據包,并整體作為數據輸入神經網絡中,但是對該攻擊的局部特征識別非常成功。

圖5 異常流量實驗結果
同時,本文也對CIC-IDS-2018提供的基于專家知識和統計學的人工特征數據集(只包含Friday-02-03-2018.csv和Wednesday-21-02-2018.csv這兩個文件)在決策樹、隨機森林、AdaBoost集成學習、貝葉斯、SVM、KNN最近鄰這6種傳統機器學習中的表現進行了評估,其結果如表3所示。

表3 CIC-IDS-2018人工特征數據集在傳統機器學習上的表現
從表3結果分析,本文算法對Bot僵尸網絡的準確率為99.99%,F1值為99.99%,對DDOS的兩種攻擊LOIC-UDP和HOIC的各項指標均高達99.99%。而人工特征數據集中對Bot的檢測效果最好的是決策樹算法,其準確率為99.98%,F1值為99.92%。對LOIC-UDP和HOIC的檢測準確率最高的是決策樹算法,分別為100%和99.99%。可以看到本文算法提取的特征檢測攻擊效果與人工特征持平,在Bot檢測中略有優勢。需要指出的是,這些指標較高的原因有可能是攻擊類別較少,或者是該類攻擊特征判定條件較為簡單。
此外,本文在研究初期,采用提取單向流的流量分割方式,對Friday-02-03-2018-Trafficr提取的包含Bot僵尸網絡的單向流樣本數據進行實驗。該方法對Bot的準確率為99.98%,F1值為99.98%,性能表現不如會話,最后調整策略,采取了提取會話的樣本分割方式。
傳統的機器學習入侵檢測算法多依賴于人工設計特征,本文提出基于深度學習的異常入侵檢測算法,采用端到端的架構,自動學習會話中潛在的高級抽象特征,無需人工設計特征,并且由于樣本可由流量數據實時構造,具有實時檢測的優點。實驗證明本文算法是有效的,并且效果好于人工設計的特征。此外,本文還詳細研究了網絡流量切割的方法,遵循一般會話的定義來提取雙向流,并給出了詳細的會話分割流程。
本文方法還存在一些可改進之處,比如本文將算法提取的網絡流量表示為單純的數字向量,然而從可視化圖像中可以看到,每一種攻擊都有較為明顯的圖形特征,如果攻擊者將自己的攻擊流量的數據包大小重新設計,添加一些無用數據,打亂其原本的圖形特征,那么基于將網絡流量視為圖像的檢測算法是否還可以達到檢測的目的還需要驗證。此外,未將CICIDS-2018數據集的所有攻擊類型囊括,需要做更多工作。未來可以研究結合人工規則和深度學習的入侵檢測算法,這樣可以彌補兩者的缺點,取得更高的準確率,降低誤報率。此外,近幾年,圖神經網絡開始興起,采用圖的結構來表示數據可以承載更加復雜的數據形式,如將主機和會話表示為結點,而邊是流與主機之間的聯系[18],這也是異常入侵檢測研究的另一個方向。