譚 天,葉 倩,孫艷杰
(杭州迪普信息技術(shù)有限公司,浙江 杭州 310051)
網(wǎng)絡(luò)異常檢測是網(wǎng)絡(luò)安全領(lǐng)域一個非常重要的研究方向,它是網(wǎng)絡(luò)入侵檢測系統(tǒng)的一個重要組成部分。不同于基于特征碼的檢測,異常檢測能夠有效檢測出未知的攻擊(0-day 攻擊)活動。
有關(guān)網(wǎng)絡(luò)異常檢測的研究已經(jīng)具有很長的歷史,方法也是多種多樣,研究者最常用的方法包括:聚類、分類、統(tǒng)計、信息論、數(shù)字信號處理等。Gaddam[1]等人使用K-Means 聚類算法結(jié)合ID3算法來進行異常檢測,取得了較高的準(zhǔn)確率。使用聚類方法最重要的就是要定義一個合適的相似度度量方法。Yan[2]使用許多標(biāo)注了正?;虍惓5臄?shù)據(jù)來訓(xùn)練一個SVM 分類器,然后將訓(xùn)練好的分類器應(yīng)用到網(wǎng)絡(luò)異常流量檢測中。但分類的方法需要線下使用標(biāo)注過的數(shù)據(jù)集來訓(xùn)練一個分類器,由于不同網(wǎng)絡(luò)環(huán)境的流量和線下訓(xùn)練時所用的數(shù)據(jù)集差別可能非常大,這就限制了其應(yīng)用范圍。還有許多研究人員采用基于統(tǒng)計的方法來實現(xiàn)異常檢測。統(tǒng)計方法是異常檢測領(lǐng)域最早使用的方法,具有簡單、快速、可解釋性強等特點,但是往往需要假設(shè)數(shù)據(jù)滿足某種約束條件,很多時候這些約束條件在復(fù)雜多變的網(wǎng)絡(luò)環(huán)境中是無法滿足的。Zempoaltecatl Piedras[3]等人提出一種熵空間的方法來進行異常檢測,在實際的環(huán)境中也取得了不錯的表現(xiàn)。但是這種方法對于具有周期特性,并且周期內(nèi)數(shù)據(jù)存在較大波動的場景并不適用。信號處理的技術(shù)可以用于網(wǎng)絡(luò)異常檢測,Hamdi 和 Boudriga[4]利用小波理論將觀測到的一維信號進行分解,分析其特殊的頻率及時間局部性,從而識別攻擊相關(guān)的網(wǎng)絡(luò)異常。
本文提出一種基于時域卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)異常檢測方案,該方案通過對網(wǎng)絡(luò)中的歷史數(shù)據(jù)進行在線學(xué)習(xí)來預(yù)測未來的數(shù)據(jù),然后通過將預(yù)測的數(shù)據(jù)和未來的真實數(shù)據(jù)進行比較來判斷是否出現(xiàn)異常。使用在線學(xué)習(xí)的方法可以針對不同的網(wǎng)絡(luò)環(huán)境學(xué)習(xí)出不同的預(yù)測判別模型,能夠自動適應(yīng)不同的網(wǎng)絡(luò)環(huán)境。另外,本文中采用多個指標(biāo)從不同角度對網(wǎng)絡(luò)進行度量,這些度量指標(biāo)之間是有一定的影響和聯(lián)系的,不能單獨對待。在本文的方案中,這些不同指標(biāo)的數(shù)據(jù)在通過時域卷積神經(jīng)網(wǎng)絡(luò)時經(jīng)過卷積運算彼此之間是會相互影響的,并且在進行判別時也會通過一個多元高斯分布來建立這些指標(biāo)之間的聯(lián)系,從而能夠更好地學(xué)習(xí)到數(shù)據(jù)變化的規(guī)律,更準(zhǔn)確地檢測出網(wǎng)絡(luò)的異常。
時域卷積神經(jīng)網(wǎng)絡(luò)(Temporal Convolutional Network,TCN)[5]是一種能夠用來對時間序列進行建模的深度神經(jīng)網(wǎng)絡(luò),它結(jié)合了RNN 和CNN 的優(yōu)點。研究人員也已經(jīng)通過實驗證實了TCN 在多個任務(wù)上具有比標(biāo)準(zhǔn)LSTM 和GRU 更好的效果。除此之外,TCN 具有更低的內(nèi)存、更穩(wěn)定的梯度和更靈活的感受野,并且可以做到并行處理。
TCN 處理的數(shù)據(jù)是時間序列數(shù)據(jù),這些數(shù)據(jù)是具有嚴(yán)格的時間序的,在進行卷積的時候不能發(fā)生信息的“泄露”,即在對某個時間點的數(shù)據(jù)進行建模時是不能使用到它后面時間點的數(shù)據(jù)的。為了達到這一點就需要使用因果卷積。因為簡單的因果卷積所能覆蓋的歷史數(shù)據(jù)和卷積網(wǎng)絡(luò)的層數(shù)呈線性關(guān)系,在處理長周期數(shù)據(jù)時會導(dǎo)致網(wǎng)絡(luò)比較深,從而讓訓(xùn)練一個網(wǎng)絡(luò)變得很有挑戰(zhàn)性?;诖耍琓CN 一般采用膨脹卷積,可以指數(shù)級減少網(wǎng)絡(luò)的層深。下面就從因果卷積和膨脹卷積這兩個方面來介紹TCN。
因果卷積即某一神經(jīng)元的輸出只能用與其有因果關(guān)系的數(shù)據(jù)通過卷積運算得到,只有有了前面的因,才會有后面的果。具體到時間序列數(shù)據(jù)上來說就是某一時刻t對應(yīng)神經(jīng)元的輸出只能用時刻t及其之前的數(shù)據(jù)通過卷積運算得到。這是一種具有嚴(yán)格時間約束的模型。一個卷積核大小為2 的因果卷積如圖1 所示。
圖1 因果卷積示意圖
在圖1 中,每一層的一個神經(jīng)元都對應(yīng)一個時刻,每個神經(jīng)元的感受野對應(yīng)其當(dāng)前時刻及之前的一些時刻。
單純的因果卷積需要線性地堆疊很多層來捕獲長時依賴,這會導(dǎo)致模型難以訓(xùn)練,膨脹卷積則可以很好地解決這個問題。以一維卷積為例,傳統(tǒng)卷積會用卷積核和與卷積核大小相同數(shù)量的連續(xù)神經(jīng)元進行卷積運算,而膨脹卷積則可以用和卷積核大小相同但不連續(xù)的神經(jīng)元來進行卷積運算。膨脹卷積中有一個膨脹系數(shù)d用來控制參與卷積運算的神經(jīng)元的不連續(xù)程度。d=k表示在連續(xù)k個神經(jīng)元中取一個神經(jīng)元參與卷積運算。
圖2 膨脹卷積示意
在圖2 中,卷積核固定為2,第一個卷積層的膨脹系數(shù)為1,第二個卷積層的膨脹系數(shù)為2,第三個卷積層的膨脹系數(shù)為4。一般來說,膨脹系數(shù)是隨著卷積層的增加而呈指數(shù)增長,越高的層級使用的膨脹系數(shù)越大,卷積層深h和膨脹系數(shù)的關(guān)系如式(1)所示:
式中,b是膨脹系數(shù)的基。為了避免出現(xiàn)空洞,一般b要小于等于卷積核的大小。從圖2 可以看到,膨脹卷積使得神經(jīng)元的感受野隨著層數(shù)呈現(xiàn)指數(shù)級增長,可以用較少的層數(shù)捕獲長時依賴。
TCN 的輸入序列長度和輸出序列長度相等,每個隱藏層的寬度都和輸入層的寬度是一樣的,卷積層采用因果卷積和膨脹卷積。一個輸入序列長度為l,卷積核大小為k,膨脹系數(shù)的基為b的模型至少需要n層才能完整覆蓋輸入序列,n可以通過式(2)求得:
對于一個訓(xùn)練好的TCN 模型,輸入一個時間序列就可以預(yù)測這個時間序列后面的一個時刻的數(shù)據(jù)(TCN 可以預(yù)測一個時間序列數(shù)據(jù),但這里我們只需預(yù)測接下來一個時刻的數(shù)據(jù)即可)。
為了訓(xùn)練TCN 模型,就需要有輸入序列和目標(biāo)序列。輸入序列顧名思義就是要輸入模型中的序列。目標(biāo)序列和輸入序列是成對出現(xiàn)的,并且和輸入序列具有相同的長度,它是模型由輸入序列得到的輸出序列的一個期望值,主要用來定義模型的損失函數(shù)并據(jù)此優(yōu)化模型。目標(biāo)序列是在輸入序列的基礎(chǔ)上向前移動output_length個時刻的序列,如圖3 所示。
圖3 輸入序列和目標(biāo)序列
在圖3 中,output_length是向前預(yù)測的數(shù)據(jù)的個數(shù)。以一定的步長在時間序列上滑動輸入序列和目標(biāo)序列,用得到的輸入序列和目標(biāo)序列對來訓(xùn)練TCN。
網(wǎng)絡(luò)異常檢測的一般思路就是對正常情況下的網(wǎng)絡(luò)狀況進行建模,之后根據(jù)網(wǎng)絡(luò)狀況偏離模型的程度來判斷網(wǎng)絡(luò)是否出現(xiàn)異常。由于網(wǎng)絡(luò)狀態(tài)的復(fù)雜多變,并且在很多環(huán)境中還呈現(xiàn)出一定的周期性,有的還會呈現(xiàn)出多種不同的周期性的疊加。因此對網(wǎng)絡(luò)狀況進行建模就變得十分棘手。本文從多個維度定義了網(wǎng)絡(luò)的度量指標(biāo),并利用TCN 強大的學(xué)習(xí)能力對歷史數(shù)據(jù)進行建模,然后來預(yù)測未來數(shù)據(jù)的變化情況,可以有效提高網(wǎng)絡(luò)異常檢測的準(zhǔn)確率。本文方案的結(jié)構(gòu)如圖4 所示。
特征提取模塊用來從網(wǎng)絡(luò)數(shù)據(jù)流中提取數(shù)據(jù)用來進行學(xué)習(xí)、預(yù)測及判別。網(wǎng)絡(luò)狀況是隨時間變化的,可以用一個時間序列來描述這種隨時間變化的數(shù)據(jù),這里稱這種序列為NTS 序列,全稱為Network Time Series。NTS 中每個元素都對應(yīng)于某一個時間窗口內(nèi)的網(wǎng)絡(luò)狀況的描述。時間窗口的定義需要根據(jù)具體的網(wǎng)絡(luò)環(huán)境和需求來設(shè)置,例如,在一個辦公網(wǎng)絡(luò)中可以將時間窗口設(shè)置為1 h,那么一天就是一個長度為24 的NTS。
NTS 中的一個元素是對一個時間窗口內(nèi)的網(wǎng)絡(luò)狀況的描述。對網(wǎng)絡(luò)狀況進行描述最簡單也是最常用的一個指標(biāo)就是網(wǎng)絡(luò)流量大小但是僅僅使用這個指標(biāo)不能很準(zhǔn)確地反映網(wǎng)絡(luò)狀況的變化。本方案選擇從多個不同的角度定義網(wǎng)絡(luò)狀況的度量指標(biāo),能夠更加精確地反映網(wǎng)絡(luò)的變化情況。這些度量指標(biāo)詳見表1。
圖4 方案結(jié)構(gòu)圖
表1 網(wǎng)絡(luò)狀況度量指標(biāo)
用上述指標(biāo)組成一個10 維的特征向量,用來對網(wǎng)絡(luò)狀況進行度量。在時刻t的特征向量為:
從時刻0 到時刻t的NTS 可以表示為:
在線學(xué)習(xí)模塊會從歷史數(shù)據(jù)中學(xué)習(xí)出數(shù)據(jù)的變化規(guī)律,然后用來預(yù)測未來的數(shù)據(jù)。之所以選擇在線學(xué)習(xí)是因為不同網(wǎng)絡(luò)環(huán)境的差別是非常大的,用某個網(wǎng)絡(luò)環(huán)境中的流量數(shù)據(jù)進行訓(xùn)練得到的模型是無法應(yīng)用于其他網(wǎng)絡(luò)環(huán)境中的,所以需要在部署的網(wǎng)絡(luò)環(huán)境中自動利用其歷史數(shù)據(jù)進行學(xué)習(xí),然后加以應(yīng)用。
TCN 雖然理論上是個有監(jiān)督的機器學(xué)習(xí)算法,但是從上面關(guān)于TCN 模型的描述可知,用來訓(xùn)練TCN 的輸入序列和目標(biāo)序列是來自同一個時間序列的,所以可以像無監(jiān)督機器學(xué)習(xí)那樣進行在線訓(xùn)練。
鑒于不同維度的指標(biāo)的量綱是不一樣的,因此,需要對各個維度做一個歸一化,歸一化是針對所有輸入模型的輸入序列和目標(biāo)序列的。求出用來進行訓(xùn)練的序列中各個維度上的均值μi和方差δi,然后用如下公式對時刻t的第i維數(shù)據(jù)進行歸一化:
定義模型的輸入長度為k,該輸入長度最好大于一個數(shù)據(jù)周期的長度,從而更好地捕獲周期信息。一個以時刻i為結(jié)尾的輸入序列為:
因為這里只需預(yù)測出下一時刻的數(shù)據(jù),所以其對應(yīng)的目標(biāo)序列為:
將輸入序列中的10 個度量指標(biāo)看做TCN 輸入層的10 個通道,然后采用一維的因果卷積、膨脹卷積進行卷積運算。在卷積層進行卷積運算時會將這10 個通道的數(shù)據(jù)進行融合,這樣就可以學(xué)習(xí)到這些度量指標(biāo)之間的內(nèi)在聯(lián)系。
TCN 的輸出層的神經(jīng)元個數(shù)與輸入序列的長度是一樣的,即具有k個神經(jīng)元,如果輸入序列為ISi,則這k個神經(jīng)元分別對應(yīng)于i-k+2,i-k+3,…,i+1時刻的預(yù)測數(shù)據(jù),可用式(8)表示為:
模型的損失函數(shù)定義為模型的預(yù)測序列和目標(biāo)序列之間的均方誤差:
利用隨機梯度下降法訓(xùn)練模型,直到loss降低到一個指定的閾值或者loss收斂為止。
訓(xùn)練好的模型需要不斷地更新才能保證其良好的擬合能力。但是模型訓(xùn)練是相對比較消耗資源的,所以這里采用一個長短周期交替更新策略來對模型進行更新。定義長周期的長度為LP,短周期的長度為SP。自模型上次長周期更新之后,若經(jīng)過了LP個時間窗口就使用這LP個時間窗口的序列數(shù)據(jù)對模型進行訓(xùn)練,完成一次長周期更新。自模型上次更新之后,若經(jīng)過了SP個時間窗口就使用這SP個時間窗口的序列數(shù)據(jù)訓(xùn)練模型,完成一個短周期更新。當(dāng)長周期更新和短周期更新發(fā)生碰撞的時候選擇長周期更新。
預(yù)測模塊會利用當(dāng)前最新的模型及歷史數(shù)據(jù)來預(yù)測下一時刻的數(shù)據(jù)及預(yù)測誤差。設(shè)當(dāng)前時刻為t,預(yù)測模塊將從時刻t-k+1 到時刻t的歷史序列數(shù)據(jù)經(jīng)過歸一化之后輸入預(yù)測模型,可以得到一個輸出序列,用式(10)表示如下:
因為模型輸出的序列數(shù)據(jù)是在歸一化的基礎(chǔ)上得到的,所以需要將模型輸出序列中的數(shù)值做歸一化的逆變換方可得到真正的預(yù)測序列。具體變換過程為:
式(11)中的δi和μi分別為第i維數(shù)據(jù)在在線學(xué)習(xí)階段進行歸一化時使用的標(biāo)準(zhǔn)差和均值,式(11)和式(12)中的j取值范圍為2 ≤j≤k+1。
由于在時刻t、時刻t-k+2~t的數(shù)據(jù)是已知的,因此由這些已知數(shù)據(jù)及預(yù)測數(shù)據(jù)可以得到一個誤差矩陣:
判別模塊根據(jù)預(yù)測模塊預(yù)測的t+1 時刻的數(shù)據(jù)和對應(yīng)的誤差矩陣來判斷t+1 時刻獲取到的數(shù)據(jù)是否是異常的。根據(jù)式(13)的誤差矩陣可以計算出一個協(xié)方差矩陣:
將時刻t+1 的數(shù)據(jù)看作一個10 元隨機變量X,則可以認(rèn)為X滿足如下的多元高斯分布:
在獲取到t+1 時刻的特征向量之后,其概率密度估計P(Ft+1)為:
P(Ft+1)越大說明數(shù)據(jù)越正常。設(shè)定一個閾值ε,當(dāng)P(Ft+1)<ε時則說明t+1 時刻的數(shù)據(jù)是異常的。閾值ε越小則誤報(將正常數(shù)據(jù)判斷為異常)的概率越小,同時漏報(將異常數(shù)據(jù)判斷為正常)的概率也越大。ε可以由用戶設(shè)置,也可以在學(xué)習(xí)階段根據(jù)訓(xùn)練數(shù)據(jù)自行設(shè)定。
通常的網(wǎng)絡(luò)異常檢測使用多個度量指標(biāo)的時候都是將其作為多個獨立的變量進行分析,但是這些度量指標(biāo)其實內(nèi)在是有一定的聯(lián)系的,獨立進行分析就忽略掉了這些度量指標(biāo)之間的內(nèi)在聯(lián)系,從而影響檢測準(zhǔn)確率。本方案采用TCN 模型和多元高斯分布能夠發(fā)掘這些度量指標(biāo)之間的相互聯(lián)系,從而可以提高檢測的準(zhǔn)確率。另外,本方案可以自動地在線完成學(xué)習(xí)、檢測的過程,能夠適應(yīng)各種不同的網(wǎng)絡(luò)環(huán)境。