郭 帥,蘇 旸*
(1.武警工程大學密碼工程學院,西安 710086;2.網絡與信息安全武警部隊重點實驗室(武警工程大學),西安 710086)
(*通信作者電子郵箱suyang75@126.com)
當前加密流量在網絡中占據了越來越重要的地位。根據Netmarketshare 發布數據顯示,截止到2019 年10 月全球使用HTTPS(Hyper Text Transfer Protocol over Secure sockets layer)加密的萬維網(World Wide Web)流量比例已經超過90%;同時在2019 年12 月,谷歌宣稱80%的Android 應用程序默認使用TLS(Transport Layer Security)加密所有流量,且這一比例還會隨著時間的推移而繼續增大。數據流量的加密已成必然的趨勢,但在加密數據防護隱私的同時,也使得很多安全服務難以對各類加密流量進行檢測,如深度包檢測方法無法對加密的數據包進行辨別,入侵檢測系統的安全服務也不再有效,這些情況給網絡安全管理帶來了很大的問題。為了解決這些問題,對網絡上的加密流量進行分類識別已是首先要解決的問題。
在過去主要使用基于端口和基于簽名的方法對網絡中的加密流量進行分類:基于端口的分類是通過網絡中數據包頭部的端口號來確定服務,這種方式在過去簡單、有效,但近年來隨著臨時端口和端口偽裝等技術的出現,該方法已不再有效;基于簽名的方法是把字節屬性與已知簽名進行匹配,這種方式只限于識別已知應用協議的簽名,對未知的協議卻無法識別,對于新出現的協議其適用性大幅降低。
當前主要使用機器學習和深度學習進行檢測分類。本文也將使用卷積神經網絡(Convolutional Neural Network,CNN)對數據流量進行分類,并且采用端到端的方式。因為端到端的網絡對于樣本的擬合性更好,它求取的是從輸入端到輸出端之間樣本的全局最優值,而非局部最優值,端到端模型構建的方法可以根據輸出的損失值反向傳播自動調整每一層的參數,直到求得最優結果,非端到端的模型往往因步驟獨立,反饋只能從本層傳輸到上一層,難以實現全局最優化。本文所做工作如下:
1)設計了一個端到端的一維卷積神經網絡(One-Dimensional CNN,1D-CNN),該網絡可以實現對VPN(Virtual Private Network)與非VPN(NO-VPN)中共12 類網絡的加密流量進行服務類型的分類,其中每類加密流量中都包含多種應用,最多可達到5種。
2)利用五元組可以標記數據流和SSL(Secure Sockets Layer)握手時協商密鑰、算法的規律,把原始輸入時單個數據流使用的784 個字節減少到529 個字節,和現有的成果相比,其準確率保持不變,處理速度明顯提高。
3)通過對數據包中所有協議層All 和單獨使用有效載荷L7 進行對比實驗,證明了數據包中包頭部分對分類有著很大的提升作用,本文中使用所有協議層All的分類準確率比只使用有效載荷L7的分類準確率提高了20個百分點;單向流Flow與雙向流Session 準確率基本相同;除此之外,還對本文方法和其他研究方法進行對比。
Anderson 等[1]指出了對于加密流量,機器學習算法要比傳統的模式匹配等方法具有更好的性能,這種性能的優越是因為機器學習算法對不平衡的數據和不確定的實際情況具有更好的適應性,這種適應性表現在對結果的良好分類上。文章還使用實驗對6 種機器學習算法進行比較驗證,但該文章只限于使用傳統的機器學習算法,未能把深度學習也加入到里面進行對比。
陳雪嬌等[2]使用神經網絡模型對流量進行分類,把流量樣本預處理成為分組凈荷字節矩陣,指出了CNN 模型應用到數據流量分類時具有較好的表現,但該文章在選擇數據集時只選擇了ISCX 數據集中的3 種應用,其范圍明顯不足,缺乏足夠的說服力。
Wang 等[3]使用端到端方法進行實驗,把字節視為像素,使用處理圖片的方式來處理網絡數據包,在應用類型分類上取得了較好的效果。文章中重點對1D-CNN 和二維卷積神經網絡(Two-Dimensional CNN,2D-CNN)的分類準確性進行了比較,得出了一維卷積網絡的分類準確率高于二維卷積神經網絡2.51 個百分點的結果。但他們并未講明為什么要使用784 個字節,所使用的數據集也很不平衡,最大訓練樣本有60 000個,最小只有298個,不同類別之間數量相差極大。
Wang[4]指出了流量識別的關鍵在于尋找到流量數據中的關鍵特征,并結合神經網絡和深度學習提出了一種SAE(Stacked Auto-Encoder)架構,該架構屬于無監督學習,可以自動對數據流量進行分類。在實驗中還分別檢測了有效載荷中對分類最有用的前25 個特征、前100 個特征、最無用的300 個特征所處的位置,通過位置來看,前200 個字節最為重要,后面的關鍵字節比較分散,該結果表明可以減少在識別分類時對有效載荷的使用。
Rezaei 等[5-6]使用深度學習的方法對流進行分類,提出了模糊流的概念,模糊流就是指一些應用軟件會附帶通用的API(Application Programming Interface)模塊,這些API 模塊往往會發送一些廣告之類的無關信息,與正常的網絡數據流量有很大區別,但又屬于該應用軟件。作者使用CNN+LSTM(Long Short-Term Memory)的方式對流進行定位,取得了較好的效果。此外他們還使用遮擋分析對握手字段進行了研究,遮擋分析就是把一部分信息進行遮擋或刪除,以測試該部分對分類準確率的影響。經過多次分析,發現SNI(Service Node Interface)是SSL/TLS 中最重要的字段,因為它包含客戶端想要連接的目標主機名。Ciper info所含有的信息也非常關鍵,因為它包含了目標應用程序的各種密碼套件組合。
Anderson等[7]在2016年發表的另一篇文章中也使用密碼套件等信息來進行分類,他們分類的目標是識別出惡意加密數據,通過使用上下文中的DNS(Domain Name System)和HTTP(Hyper Text Transfer Protocol)頭部判斷服務器方所使用的密碼套件信息是否過期,惡意的服務方所使用的密碼套件信息與正常的服務器方所使用的有較大的區別,通過該方式可以達到超過99%的精度,同時作者又指出惡意數據占正常數據的極小一部分,為防止出現差錯,又添加了錯誤發現率FDR(False Discover Rate)參數,使FDR=0%時其準確率也超過了99%。
Lotfollahi 等[8]提出了深度包的方法進行加密流量應用分類,使用統計方法發現96%的數據包載荷長度小于1 480 字節,并因此使用1 500 個字節作為CNN 的輸入,對于不足的字節默認補0,然后使用深度學習方法從流量中自動提取特征,其應用分類結果表明深度包的方法優于之前所有在ISCX2016 公共數據集上的工作,但是他們選擇在輸入時把整個的載荷部分全部作為有效內容輸入進去,這增加了不必要的開銷。
卓勤政[9]使用兩種CNN 模型對10 類流量進行識別,一種是使用定長的數據流前1 024個字節,另一種可以自動處理可變長度字節輸出為定長字節,通過實驗對比后一種識別效果要明顯優于第一種,可達到97%左右;馬若龍[10]也使用1 024個字節對加密流量進行識別,對8種應用協議實現了95.65%的準確性。但本文認為以上兩種方法仍存在很大的改進空間。
Kumano等[11]提出在保證分類準確率的基礎上,可以一定程度減少所需要的數據包個數,并通過實驗加以驗證,在處理某些特征時,在保證準確率的情況下最少使用的數據包個數為10。
當前情況下研究加密流量分類的方法大體分傳統機器學習和深度學習兩種,但大多集中在深度學習上,這是由深度學習的特點所決定的,傳統的機器學習處理時有幾個問題:1)要先從數據集中提取特征,然后embedding 操作獲取詞向量,最后使用多種分類方式進行測試比較,取得最優值,其過程比較復雜,也不符合端到端的思想。2)準確率的提升依賴于對特征的精準提取,但對于一般人來說,該項要求較高,構造特征極為不易。3)處理少量的數據時傳統方式準確性更好,但面對當今的海量數據,其準確性相比于深度學習顯得較低,且隨著數據量的增大準確率差距會越來越大。當然傳統的機器學習便于理解,在處理小型數據集時有其特定的優勢;深度學習在處理數據時可以直接輸入進行處理,在簡化操作上占有很大的優勢。
陳良臣等[12]、潘吳斌等[13]把加密流量分類的目標分為5種,分別是加密與未加密流量分類、加密流量協議識別、加密流量服務分類、加密流量應用分類和異常流量識別分類。加密與未加密流量分類是需要從流量中識別出哪些是未加密的,哪些是加密的,Dorfinger等[14]使用熵估計的方法識別加密與未加密流量,準確率達94%。加密流量協議識別是識別加密所使用的具體協議,比如SSL/TLS、IPSec(Internet Protocol Security)、SSH(Secure Shell)等。加密流量服務分類就是識別加密流量所屬的服務類型,如即時通信、網頁瀏覽或流媒體等等。加密流量應用分類就是識別流量所屬的應用程序,如Skype、BitTorrent和YouTube等。異常流量識別分類就是識別出加密通道保護下的木馬回傳、僵尸網絡控制等惡意流量,這些惡意流量在加密通道下極為隱蔽,但可以通過異常行為特征進行識別,此外還可以通過其活動規律進行檢測,當前傅建明等[15]指出可以使用GAN(Generative Adversarial Network)進行檢測,也是一個新的方向。
本文使用端到端的1D-CNN 來對多個應用類型的數據流量包進行識別分類。1D-CNN是一種前饋神經網絡,在傳統神經網絡的基礎上進行了改變,它依然是層級結構,但是其形式和功能發生了變化,把原本的隱藏層替換為卷積層和池化層。卷積層通過卷積核處理特征圖,提取了樣本中存在的特征;池化層通過最大池化(Maxpooling)操作提取最主要的特征。使用1D-CNN在加密數據流量上的優勢有:
1)相比于傳統的機器學習方式,深度學習在處理大量數據上表現更好,無論是對不平衡樣本的適應還是對特征的高效處理,又或者是結果的準確性,都遠遠超過了傳統的機器學習。
2)相比于密集層(DENSE)組成的網絡,卷積網絡更容易利用學習到的局部特征進行分類。DENSE 層從輸入樣本中學習到的是全局模式,全局模式就是涉及所有特征的模式,而卷積層學到的是局部模式,學習到某個局部特征之后就可以在任何地方識別該特征,這叫作卷積神經網絡的平移不變性,利用該性質可以高效地利用數據,它只需要很少的訓練樣本就可以學到具有泛化能力的數據表示。比如在識別加密流量時就可以利用該特性對數據中的TCP(Transmission Control Protocol)字段或者其他關鍵字段進行識別。
3)卷積網絡可以學習樣本的空間層次結構,即特征與特征之間的結構關系,如果第一個卷積層可以學到較小的局部特征,則下一個卷積層可以學到由第一個卷積層特征組成的更大的特征,在進行訓練時,卷積層可以學習樣本的結構,比如對比數據包的結構可以區分TCP 與UDP(User Datagram Protocol)包。
4)加密流量是序列型數據,它們本質是請求方與回應方的一種先后應答,這種應答方式必須要遵循一定的先后順序,和文本類數據非常相似,一旦打亂關系則無法正確讀取。相比于2D-CNN 在圖像方面有更好的應用,1D-CNN 對于順序數據具有更好的效果。
在使用1D-CNN 時,本文把原始輸入的字節串聯成一個向量輸入到網絡通道中,網絡結構具體如圖1所示。

圖1 1D-CNN模型Fig.1 1D-CNN model
為了檢驗不同的數據流表示方式對識別分類的影響,本文在構建過程中,設置了4 種數據分析維度,分別是Session+All、Flow+All、Session+L7 和Flow+L7。其中Session 是由五元組標記的雙向會話流,Flow是由五元組標記的單向會話流,正常情況下一個Session 是由兩個Flow 組成,五元組是指源IP(Internet Protocol)地址、目的IP 地址、源端口、目的端口和協議類型。五元組可以較好地對會話流進行標記,即便是動態端口技術使端口發生跳轉,它對于當前的流量分類也起著重要的作用。All 是指數據包中所有協議層的數據,L7 指的是OSI(Open System Interconnection)結構第7層或者TCP/IP 結構第4 層的數據,即有效載荷信息。通過對比,可以明確地觀察到不同的數據流選擇對分類所產生的影響,以便更好地理解它們在分類過程中所起的作用。
本文使用ISCX2016數據集,在處理數據集時根據不同的流量表示可劃分成4個對比實驗,具體情況如表1所示。

表1 數據集預處理結果Tab.1 Preprocessing results of dataset
本文所使用的加密流量是傳輸層的加密,當前傳輸層加密協議主要有SSL、TLS和SSH 三類,TLS是在SSL的基礎上發展起來的協議,二者具有相同的加密流程。
楊婧[16]介紹了SSH 的基本原理和流程,通過對比可以發現SSH 與SSL 也并無本質上的區別,二者都是以TCP 為基礎保障通信的。在通信前都首先要進行協議版本及算法的協商,然后雙方互相驗證,最后使用得到的密鑰進行加密通信。區別在于通信過程中SSH 先使用非對稱加密再使用對稱加密,而SSL 直接使用對稱加密。本文在識別加密流量時著重利用協商過程中傳遞的數據包,該部分數據包屬于通信之前傳遞的明文信息,與通信過程中的加密方法并無太大關系,因此二者可以使用相同的方法進行識別。本文以SSL 為代表,對其加密過程進行分析(如圖2)。

圖2 SSL結構Fig.2 Structure of SSL
SSL 位于傳輸層和應用層之間,其結構分為握手協議、更改密文協議、警報協議和記錄協議。
SSL 握手協議是通信雙方互相驗證身份的協議,服務端和客戶端在這個過程中確認對方身份,并協商密鑰和算法,在協商完成后,雙方開始使用協商好的加密協議和密鑰進行通信。其流程如圖3所示。

圖3 SSL握手Fig.3 SSL handshake
在圖3 的握手過程中,通信雙方協商了加密傳輸信息時所使用的各類參數,由于SSL 握手協議的通信過程是通過明文傳輸的,所以可以通過抓取Pcap 文件獲取數據包的頭部信息,再利用五元組的標記功能,就可以對數據流進行標記并分類。
本文嘗試在保持準確率的情況下來減少數據包的個數以提高效率,根據對SSL 握手包的分析發現,在Finish 之前客戶端和服務器端已經完成了協商,因此為提高處理的效率只使用前6個數據包,這與其他研究相比要少得多。
為了更準確地選擇關鍵特征、去除無用特征,本文對特征所在的字節進行選擇。文獻[4]中把數據流中每個TCP 會話的有效載荷字節連接起來,每個有效載荷序列的長度是1 000個字節,然后使用SAE 對特征進行提取,并把最重要的25 個特征、最重要的100個特征和最不重要的300個特征所在位置進行繪圖。受其啟發,有必要選取一定的有效載荷字段,不能太短也不能太長。本文選取了前529 個字節,其長度的選擇來源于以下判斷:數據包加密傳輸時前6 個數據包中含有更多的信息,且其有效載荷中前200 個字節含有的信息更多,更有助于分類,于是使用54×6+200=524,54 是指數據包頭部的54 個字節,6 指前6 個數據包,200 則是指有效載荷長度,為便于計算將N設置為529 個字節。同時為了方便與原有的784個字節進行直觀對比,本文將4 組實驗中的新選取特征字節數都設置為529。
為精簡字節,本文在實際處理時還對無用字節進行了舍棄,如Pcap 的Pcap Header 和Packet Header,它們只是對整個Pcap信息的一些統計,并不能在分類中起到比較明顯的作用,圖4是它們的具體結構。

圖4 Pcap結構Fig.4 Pcap structure
從圖4 可以看出,Pcap Header 中包含著Pcap 文件的一些簡單信息,占據24 B,在整體的Pcap 前有且僅有一個,其中包含五項信息,它們表示數據流從第幾個字節開始,有多長字節,到哪結束,Packet Header 是單個數據包的信息概要,占據16 B,在每個Packet前側都會有一個,如果一個Pcap文件拆分為兩個,那么相應的Pcap Header 也會變成兩個,但Packet Header 個數是不會變的。但無論是Pacp Header 還是Packet Header它們都是一些統計信息,并未涉及分類的重要內容,對于該部分完全可以忽略,只選取Packet Data部分,不僅可以提高處理效率,也可以容納更多的有效信息。
本文硬件平臺采用NVIDIA GPU(GeForce GTX1660 Ti),16 GB 內存用于神經網絡的訓練和測試。Tensorflow 采用2.2.0 版本,CUDA 10.2,實驗過程中,訓練集占90%,測試集占10%,使用交叉熵作為損失函數,AdamOptimizer進行優化。
在實驗過程中,對數據集的處理非常重要,不同數據集的選擇其結果是很難進行公正的比較,即便是同一個數據集,其處理方式的不同也會導致一些差距,為了盡可能地處于同一個水平來比較不同方法的有效性,本文嘗試保持整體環境不變單個變量改變比較最終結果的方式來進行實驗。其具體處理過程如下:
第一階段(預處理階段)使用ISCX2016數據集,并根據所給出的數據集文件把數據分成12類,使用USTC-TK2016工具包切分成數據流,根據協議層和單雙向會話流的不同,生成4個數據集,再提取不同的報文長度,生成4 組對比實驗:第一組實驗是Session+All,第二組實驗是Session+L7,第三組實驗是Flow+All,第四組實驗是Flow+L7。每組中分別包含784 個字節和529個字節的IDX3文件。
第二階段(訓練測試階段)把第一階段所生成的IDX3 訓練標簽和訓練文件輸入到神經網絡模型中,損失函數是交叉熵,使用梯度下降法降低交叉熵以擬合樣本模型,然后用測試數據集進行驗證。
第三階段(實驗對比階段)使用第二階段方法得到四組實驗的結果,最終進行對比,注意在更換數據集時需要根據輸入像素的大小調整模型中weight和bias的值。
為了更好地評估模型的優劣性,本文選取了準確率(Accuracy)、精確率(Precision)、召回率(Recall)三個參數。在訓練和測試樣本中,樣本分為正樣本與負樣本,正樣本即是目標樣本,負樣本是非目標樣本。隨著檢測目標的不同正樣本會不停地變化,特別是在多分類樣本中更為明顯。
Accuracy 指的是預測正確的樣本個數與樣本總數的比值;Precision 指的是預測正確的所有正樣本個數與預測的所有正樣本個數的比值;Recall 指的是預測正確的正樣本個數與樣本總數中所有正樣本個數的比值。這3 個參數的值越高表明識別的效果越好。
圖5 是4 組對比實驗中12 分類的Accuracy 結果,從結果上看,784 個字節與529 個字節所得到的準確率基本相等,中間雖有差距,但其值較小,可視為識別時的上下波動。此外,Session 和Flow 的準確率并未拉開多少,本文認為其中有以下原因:

圖5 Accuracy結果對比Fig.5 Comparison of Accuracy results
1)Session 本身與Flow 的識別效果相差并不是很大,因為它們的五元組從根本上說是可以相等的,只是位置發生了變化,在使用神經網絡處理Flow 時,模型只需要多進行訓練就可以達到Session 的效果,因此二者的差距并不像想象中那么大。
2)在處理數據過程中,很大一部分Session 也同時等于Flow,該部分的Session 流由于動態端口技術的存在所以其數據包個數較少,有一部分只含有一到兩個數據包,且都是單向流。對于這一部分在進行Session 切分時,與進行Flow 切分時所得到的結果是完全一致的,這樣一來該部分會降低Session的處理效果,進而縮小Session與Flow的差距。
圖6 是第一組實驗中Session+All 的Precision 和Recall 擴展實驗結果,它是12 分類。按照先后順序其服務類型依次為Chat、Email、File、P2P、Streaming、VoIP、VPNchat、VPNemail、VPNfile、VPNP2P、VPNstreaming、VPNVoIP。

圖6 Precision和Recall結果對比Fig.6 Comparison of Precision and Recall results
從圖6 中對比來看,存在單個類別差距較大的情況,如圖中Vpnstreaming 的Precision,其值相差13 個百分點,這種差距是由選取字節所造成的,對于單個類別有較大影響,但這種差距在整體上并未顯現出來,因為在其余類別中相應地會加以補償。總體上看兩個取值結果相似,并無明顯差距。
為了更好地評估模型,本文對比其他論文中使用的機器學習方法,如表2所示。

表2 實驗方法對比Tab.2 Comparison of experimental methods
以上是一些加密流量識別分類的相關研究,其數據來源于各自論文的結果,且以上文獻原數據集都是使用ISCX2016。這些研究采用了相似的處理方法,都是在數據包上從前向后截取一定長度字節使用深度學習方法進行分類,但是又各有側重。
文獻[2]證實了相比于傳統機器學習方法深度學習具有更高的準確率,也更方便處理數據。文獻[3]驗證了1D-CNN和2D-CNN 的適用范圍,指出在序列型數據上1D-CNN 更有優勢。文獻[9]、文獻[10]較相似,二者更側重于與其他方法的結合應用。上述文章都是直接截取一定字節,但并未講清楚為何要使用該長度,也未對其進一步的探討。本文與上述文章相比多了字節篩選部分,嘗試只保留最關鍵的特征,使用關鍵字節進行最大程度分類,準確率與效率并重。
從上述表2可以看到,文獻[2]使用1 500個字節進行3分類準確率達98%、文獻[10]使用1 024 個字節進行8 分類準確率達95.65%,表現差于文獻[9]使用1 024 字節進行10 分類準確率達97%,因為根據以往經驗,隨著分類的種類增加準確率下降是越來越快的。文獻[3]使用784 個字節進行12 分類準確率達86.6%,與本文進行12 分類529 字節準確率達95.5%相比仍有一定的差距,雖然文獻[9]使用1 024 個字節進行10 分類準確率達97%,但其類型屬于應用分類,比服務類別分類難度要低,且在字節長度和目的分類數上本文都要優于文獻[9]很多,而二者準確率大致相當,故本文相比于上述論文有明顯的優勢。
本文主要研究了不同的加密數據流提取方法對分類準確率的影響,還與已有的工作進行對比,通過研究發現可以在保證已有準確率的同時更進一步減少對字節的要求,這種提取方式可以降低資源消耗、提高效率,但還有很多的不足,例如:在數據預處理時并未把重復發送或損壞的數據包進行嚴格的清理,在一定程度上降低了分類的準確性;此外訓練數據也不平衡,個別應用中數據過大或者過小都不利于準確分類。下一步工作將重點關注以下方向:一是研究LSTM 相關領域的最新文獻,并嘗試把時間因素作為特征加入到模型中去,以便對數據流更好地進行標記;二是嘗試分析數據包頭和有效載荷在分類過程中各字節所起的作用,以便對關鍵特征進行針對性提取,進一步提升性能。