池亞平,莫崇維,楊垠坦,陳純霞
(1.北京電子科技學院 網絡空間安全系,北京100070; 2.西安電子科技大學 通信工程學院,西安710071)
軟件定義網絡(Software Defined Network, SDN)是一種新興的網絡架構,已逐漸成為云計算環境所依賴的重要技術之一[1],但SDN架構本身也存在安全問題,國內外相關研究人員也更加關注SDN本身帶來的安全問題。文獻[2]從SDN特有/非特有的安全威脅兩方面分析和歸納了SDN中存在的典型安全問題。文獻[3-5]以流量為出發點,分析了可能出現的攻擊方式,并提出了相應的解決方法。SDN的安全問題主要分布在控制層和數據轉發層,而控制層和數據轉發層的很多安全問題都可以用入侵檢測的技術手段來解決[2,6]。
文獻[7-8]綜述了近年來國外研究人員采用機器學習或深度學習手段展開的網絡入侵檢測領域的研究。其中,文獻[7]對常用的機器學習和深度學習算法進行歸類。文獻[8]分析了9種不同機器學習和深度學習算法應用在網絡入侵檢測中的優缺點,對比了多種多算法結合的網絡入侵檢測算法,詳細說明了數據集的選擇方法和入侵檢測評判標準。文獻[7-8]指出卷積神經網絡(Convolutional Neural Network, CNN)算法具有良好的分類特性和特征學習能力,但目前仍較少地用于網絡入侵檢測領域。文獻[9]中提出一種基于多層感知機的SDN入侵檢測模型,選取了特征數據的6個特征作為輸入,最終識別準確率為75.75%;文獻[10]采用信息增益和支持向量機(Support Vector Machine, SVM)結合的方式實現了SDN環境下入侵檢測算法;文獻[11]針對SDN固有特性,通過流表項提取特征數據作為輸入數據,并實驗對比了5種不同算法的準確率、訓練時間、檢測時間等屬性。
通過分析現有研究發現,入侵檢測算法驗證時多采用KDD Cup99數據集或NSL-KDD數據集,而這兩個數據集都是傳統網絡下采集的數據集,并不能有效反映SDN環境下的真實安全需求[7-12]。文獻[12]雖然通過采集流表項進行改進,但也只適用于檢測傳統網絡下的分布式拒絕服務攻擊(Distributed Denial of Service, DDoS)。本文設計基于流表項的特征提取方法,采集SDN特有攻擊下的數據樣本并形成流表數據集,入侵檢測模型利用該數據集檢測SDN特有攻擊,采用NSL-KDD數據集檢測傳統網絡攻擊。鑒于文獻[9-11]中的算法對小概率攻擊檢,例如遠程到本地的非授權訪問攻擊(Remote-to-Login, R2L)和非授權提升用戶權限攻擊(User-to-Root, U2R),測效果較差。本文設計一種加強訓練方法用以提升對此類攻擊的檢測率。
文獻[2]中指出了兩種典型的SDN特有網絡攻擊行為,分別為交換機流表攻擊和控制域帶寬攻擊。這兩種攻擊都不能被傳統網絡下的入侵檢測系統識別。
在數據獲取過程中,只關注了數據轉發層的數據信息,忽略了南向通道可能發生的交換機流表攻擊。
圖1所示為交換機流表攻擊的原理:受控終端向交換機發送大量未知目的的虛假請求,而交換機流表中沒有與之匹配的流規則,該交換機便將請求轉發給控制器,由控制器制定相應的應答策略。當攻擊者通過不同交換機向控制器發送大量虛假請求信息時,控制器會一直忙于處理虛假請求信息,并消耗大量鏈路資源,而正常的請求無法及時處理,當短時間內虛假請求信息量超過某一閾值時,便會導致整個SDN的癱瘓。與此同時,短時間內過多的交換機未記錄的數據請求,會引起交換機流表溢出,導致交換機崩潰,因此,該模型僅適用于檢測傳統網絡架構下的網絡攻擊。

圖1 交換機流表攻擊原理Fig. 1 Principle of switchboard flow table attack
若控制器被入侵者控制或因物理因素失效,則該入侵檢測系統(Intrusion Detection System, IDS)引擎將無法正常運行,安全策略也無法正常下達。如圖2所示是控制域帶寬攻擊基本原理:攻擊者通過被控制的SDN控制器向部分交換機下發虛假流規則,交換機執行新的流規則,產生大量錯誤的數據包,從而導致鏈路堵塞和網絡癱瘓。
針對上述問題,本文從流表項入手,采用數據原始特征和人工特征合成基于流表項的特征向量,并在此基礎上生成流表項數據集。本文采用mininet仿真網絡環境,并在此環境中模擬上述兩種攻擊行為,這兩種攻擊下采集得到的特征向量標記為“異常”。
卷積神經網絡是一種深度前饋神經網絡,是深度學習中的一種重要模型,被廣泛地應用于計算機視覺、自然語言處理等領域。卷積神經網絡通過模擬生物視覺機制構建,利用局部感知進行特征提取,其突出特點便是“權共享”,即讓一組神經元使用相同的連接權。圖3所示是CNN的典型結構。從圖3可以看出,一個完整的CNN包括數據輸入層、特征提取層和全連接層三個部分。輸入層利用“局部感知”從原始數據中提取局部數據;特征提取層經過多次卷積核池化最終得到一個特征向量;輸出層根據特征向量判決輸出結果。

圖3 卷積神經網絡典型結構Fig. 3 Typical structure of CNN
根據OpenFlow協議,每個流表由多個流表項組成,原始的流表項由多個功能部分組成,并不是所有的部分都可以用于入侵檢測。從流表項中直接提取出的流表特征如表1所示。

表1 流表項中的流表特征 Tab. 1 Flow table features in flow entry
同時,為了提高檢測的精度,根據匹配域和計數器信息人工構建額外的可能區分攻擊的流表特征,并將其作為輸入特征數據集的一部分,構造特征如表2所示。

表2 流表項數據集特征 Tab. 2 Flow entry dataset features
1)平均流包數(Average Number of Packets in per Flow, APF)。
攻擊時為了提高偽造源IP和目的IP的速度,一般會減少流中數據包的數量,因此,正常狀態下的流包數和被攻擊時的流包數是不同的。
(1)
其中:FlowNum是抽樣周期內流表總數;PacketNumi是第i個流表內的數據包數。
2)流表匹配成功率(Match/Lookup Ratio, MLR)。
數據包到達OpenFlow交換機時,都要進行匹配和查找操作。大量不同的新的流表會導致OpenFlow交換機流表溢出,此時若再收到新的流表,會引起流表匹配成功率急速降低:
(2)
其中:Match是匹配流表數;Lookup是總流表數。
3)對比流(Percentage of Pair-Flow, PPF)。
網絡在正常提供服務時,網絡中的對流數和單流數的比例較為穩定。在攻擊狀態下存在大量的偽造目的IP地址,會造成這種穩定性受到破壞:
(3)
其中pair是交互流表的對流數的個數。
4)平均流比特數(Average number of Byte in per Flow, ABF)。
受到攻擊時,為了提高發包速度,會減小數據包的字節數,平均流比特數往往是檢測攻擊的重要特征:
(4)
其中ByteNumi是第i個流表中數據包字節數。
5)端口增速(Port Generating Rate, PGS)。
正常網絡狀態下,端口增速較為穩定,攻擊時會隨機生成端口號,端口增速會明顯增大:
PGS=PortNum/T
(5)
其中PortNum是端口號的新增量。
6)目的IP增速(Destination IP Growing Speed, DIGS)。
攻擊時,大量偽造目的地址會導致目的IP大量增多,因此目的IP增速是檢測攻擊的重要特征:
DIGS=DIGSNum/T
(6)
其中DIGSNum是周期T內是目的IP地址增量。
7)源IP增速(Source IP Growing Speed,SIGS):
SIGS=SIGSNum/T
(7)
其中SIGSNum是周期T內是源IP地址增量。
8)流表項速率(Rate of Flow Entries, RFB)。
受到攻擊時流表項請求數目會有所增加,因此,可選擇流表項速率作為數據特征:
RFB=FlowsNum/T
(8)
其中FlowsNum是采樣周期內流表項請求數目。
因為存在兩種不同的輸入數據,因此設計了分流檢測結構。同時,由于在NSL-KDD數據集中U2R攻擊、R2L攻擊是小樣本攻擊,因此在入侵檢測算法中,這幾類攻擊往往是產生誤報或漏報的集中點,SDN特有攻擊和傳統網絡攻擊具有不同的數據特征,因此應當進行分開訓練,如圖4所示。

圖4 入侵檢測模型結構設計Fig. 4 Structure design of intrusion detection model
在入侵檢測模型中,分流器通過識別輸入數據的特征維數對輸入數據進行分流,左側為SDN特有攻擊單元,右側為傳統網絡攻擊檢測單元。在SDN特有攻擊檢測單元中,由于針對SDN特有攻擊的種類有限,并沒有較為成熟的異常分類體系,因此在該單元,設計基于CNN的二分類算法,用于區分正常和異常行為。在傳統網絡攻擊檢測單元,針對4種攻擊和正常行為設計具有5種分類情況的分類器。檢測結果處理單元負責將原始輸出數據轉換為標記信息。SDN特有攻擊檢測單元和傳統網絡攻擊檢測單元使用相同的入侵檢測算法,但采用不同的數據集進行算法訓練。
3.2.1 入侵檢測算法流程
基于卷積神經網絡入侵檢測算法是檢測模塊的核心,入侵檢測模型的實現即入侵檢測算法和加強訓練方法的實現,算法流程如圖5所示。

圖5 CNN算法執行流程Fig. 5 Execution flow of CNN algorithm
在圖5中,首先經過輸入數據集、初始化卷積神經網絡、采集樣本子集等操作,然后判斷是否需要加強訓練。若是,合并樣本子集和錯誤樣本集,否則,采用樣本子集執行正常訓練;之后采用小批量訓練,并采用交叉熵損失函數計算本次訓練損失值,并判斷是否繼續訓練。若是,采集新的樣本子集,Adam算法更新模型參數,執行統計本次訓練錯誤樣本,并執行加強訓練決策單元,判斷是否加強訓練;否則,結束訓練。本文對入侵檢測算法的優化包括卷積神經網絡的結構、加強訓練方法兩方面。
CNN各層具體參數如表3,其中,n為輸入特征矩陣的寬度。

表3 CNN參數配置 Tab. 3 CNN parameter configuration
基于以上述算法流程和配置參數,設計CNN算法核心代碼如下:
if __name__==′__main__′:
load_data()
feature_test=feature
feature_train=feature_full
label_test=label
label_train=label_full
init_model()
with tf.Session() as sess:
#初始化所有張量
sess.run(tf.global_variables_initializer())
#將神經網絡結構畫出來
writer=tf.summary.FileWriter("resout/",sess.graph)
#記錄中間值
merged=tf.summary.merge_all()
train_writer=tf.summary.FileWriter("resout/train",
sess.graph)
test_writer=tf.summary.FileWriter("resout/test",sess.graph)
#訓練
for step in range(1000):
f_t_batch,l_t_batch=next_batch(feature_train,label_train,1000) #小樣本梯度下降訓練,每次選大小為1 000的batch
#錯誤數據采集
a=sess.run(tf.argmax(prediction,1),feed_dict={xs:
f_t_batch,ys:l_t_batch,keep_prob:1})
b=sess.run(tf.argmax(ys,1),feed_dict={xs:f_t_batch,
ys:l_t_batch,keep_prob:1})
train_plus,label_plus=Plus_learning(a,b,f_t_batch,
l_t_batch)
sess.run(train_step,feed_dict={xs:f_t_batch,
ys:l_t_batch,keep_prob:0.5})
#加強訓練
if train_plus and label_plus:
sess.run(train_step,feed_dict={xs:train_plus,
ys:label_plus,keep_prob:0.5})
if step %5==0:
train_writer.add_summary(sess.run(merged,feed_dict=
{xs:f_t_batch,ys:l_t_batch,keep_prob:1}),step)
print(step,sess.run(accuracy,feed_dict={xs:f_t_batch,
ys:l_t_batch,keep_prob:1}))
其中,init_model()函數初始化神經網絡,sess.run(tf.global_variables_initializer())函數初始化神經網絡中的所有張量,配置了表3中的基本參數;next_batch()函數進行小樣本采樣,可自行選擇采樣大小;tf.train.AdamOptimizer()函數表示采用Adam算法進行梯度下降優化;tf.nn.softmax()函數調用Softmax算法優化輸出;Drop值為0.5,表示在本層保留50%神經元,此時神經元之間的組合方式最多;運行train_step表示開始本次訓練,每5次訓練記錄一次中間數值;Plus_learning()函數調用加強學習決策算法,對應流程圖中加強訓練決策單元。
3.2.2 卷積神經網絡結構優化設計
在卷積神經網絡結構方面,針對入侵檢測特征向量的特點,對CNN模型的結構進行優化,如圖6所示。

圖6 CNN結構Fig. 6 CNN structure
卷積神經網絡結構改進主要表現為兩個方面:其一,對卷積層和池化層的連接結構進行優化;其二,在全連接后面添加Softmax輸出層進行優化。
在基于CNN圖像識別領域中,直接將圖像作為輸入數據,并具有多通道特性,因此在卷積操作后面緊跟著池化操作,以減少中間參數量。相比之下,入侵檢測領域的特征向量維度較低,信息容易提取,過多的池化操作反而會引起特征模糊,難以提取,因此,采用改進卷積層和池化層的連接結構,減小池化頻率,每兩次卷積操作后再進行池化操作,并采用均值。同時,為了使優化算法輸出結果更具解釋性,使用和CNN結合最多的Softmax分類器作為輸出層。
3.2.3 加強訓練方法設計
針對入侵檢測模型訓練過程中存在小樣本攻擊類型不易檢測的問題,利用小批量梯度下降方法具有樣本抽樣的特點,設計了一種加強訓練方法,進行CNN模型訓練。圖7所示為加強訓練方法處理流程,這里以傳統網絡分類器為例介紹訓練流程。

圖7 加強訓練方法處理流程Fig. 7 Process flow of reinforcement training method
1)為了提高輸入數據的隨機性和小樣本攻擊的占比,對訓練集進行隨機采樣,形成子樣本集V,V既是小批量梯度下降的一個batch,又是一個加強訓練單元;
2)輸入訓練子集D,初始化時D=V;
3)檢測是否訓練結束,若是,輸出模型,否則執行4);
4)在低頻攻擊檢測器中,需要神經網絡對U2R攻擊和R2L攻擊更敏感,搜集分類錯誤的這兩種攻擊,形成錯誤樣本集v。同時執行1),得到子樣本V′;
5)以概率P∈[0,1]合并V′和v,形成新訓練子集D′=V′∪v,最后執行2)。其中,P的初始值為1,若錯誤樣本集減小則P=P-ΔP,否則,P=P+ΔP,ΔP為一較小常量。
加強訓練方法可以有效解決低頻攻擊類型不易檢測的問題,可以根據實際需要設計不同敏感偏向的分類器。利用以概率思想在合并訓練子集時引入隨機性,減小因大量重復訓練引起的模型過擬合。該方法具有思想簡單,易于實現、加速收斂、減小過擬合,有效提高入侵檢測精度等優點。加強訓練方法算法偽代碼如算法1所示。
算法1 加強訓練算法。
Process:Function improved_train (D)

initializeP=1
initialize ΔP
while not stop do
train CNNModel_Generate(Vt′)
Statistical error samplevt
Ifvt≥vt-1:
P=P-ΔP
else:
P=P+ΔP
Calculating the combination factor
α~Bernoulli(P)
Ifα=1:
Vt′=Vt′+vt
else:
continue
end while
Output:final CNN
實驗環境采用在Linux下運行Tensorflow深度學習框架,Tensorflow是谷歌研發的人工智能系統,采用基于數據流圖的計算,廣泛地應用于機器學習或深度學習領域,Tensorflow支持英偉達圖形顯卡加速,實驗采用Python語言編寫算法,采用的硬件設備型號分別是CPU為Intel i7 2600,內存為DDR3 1 333 MHz 16 GB,操作系統為Ubuntu16.04,GPU為NVDIA GTX960。
實驗采用入侵檢評估標準為準確率(ACcuracy,AC)、誤報率(False Positive Rate,FPR)、召回率(Recall)、精確度(Precision,PR)、混淆矩陣等,準確率、誤報率、召回率和精確度通過量化歸一評價檢測結果,混淆矩陣通過觀測預測值與真實值的統計分布判斷分類器性能。
(9)
(10)
(11)
(12)
其中:TP(True Positive)表示被正確分類的正常行為樣本數量;TN(True Negative)表示被正確分類的異常行為樣本數量;FP(False Positive)表示被錯誤分類的正常行為樣本數量;FN(False Negative)表示被錯誤分類的異常行為樣本數量,表4展示了各種分類情況。

表4 實驗結果分類 Tab. 4 Classification of experimental results
本實驗采用控制變量法進行實驗,每次都采用最終算法和缺少某一項優化的算法進行實驗對比。為了驗證多分類下的性能,使用數據集NSL-KDD在圖4的傳統網絡攻擊檢測單元模型進行實驗。基本參數設置為:學習率為0.001;CNN小批量訓練的batch為500;總迭代次數1 000次,每5次迭代記錄一次中間值。
4.2.1 加強訓練方法實驗
加強訓練方法的概率因子g設置為0.01,本實驗對比了使用加強訓練和未使用加強訓練的實驗結果,如圖8所示。

圖8 加強訓練方法實驗結果Fig. 8 Experimental results of reinforcement training method
圖8(a)為準確率隨著訓練次數增加的變化,其中,hard train曲線采用了加強訓練方法,normal train曲線未采用加強訓練方法,明顯可以看出,采用加強訓練方法時CNN模型在訓練前期的收斂速度更快;圖8(b)為損失值與訓練次數的關系,采用加強訓練后,損失值降低得更快;圖8(c)中加強訓練圖為采用加強訓練方法的模型處理訓練集得到的混淆矩陣,后面的實驗中也采用該矩陣進行實驗對比。考慮到精確度可以更直觀反映多分類的分類精度,因此,計算出正常類型的精確度為99.85%,DoS攻擊的精確度為99.95%,Probe攻擊的精確度為98.67%,R2L攻擊的精確度為96.48%,U2R攻擊的精確度為94.23%;圖8(c)中未加強訓練圖是未采用加強訓練的混淆矩陣,可以計算出正常類型的精確度為99.63%,DoS攻擊的精確度為99.20%,Probe攻擊的精確度為96.60%,R2L攻擊的精確度為75.28%,U2R攻擊的精確度為21.15%。可以看出:訓練前期模型尚未成熟,加強訓練可以在一定程度上提高收斂速度;訓練中期,加強訓練的小樣本數據較多,因此有效提升小樣本數據的精確度;訓練后期,加強訓練的P值會逐漸收斂至0,此時不再具有加強訓練的效果,因此,此時準確率和損失值會在一個穩定區間內小幅波動。
4.2.2 卷積神經網絡結構優化實驗
本實驗中均值池化與最大值池化、多池化層進行實驗對比。如圖9,two avg pool曲線代表多個池化層,max pool曲線代表最大值池化,avg pool曲線代表均值池化。從圖9(a)準確率對比和圖9(b)損失值對比可以看出,采用多池化層時收斂最慢且收斂時抖動較大,印證了多池化層會模糊數據特征的猜想;均值采樣的準確率收斂速度和損失值收斂速度略優于最大值采樣。圖9(c)中more pool圖為多池化層的混淆矩陣,可以計算出正常類型的精確度為99.27%,DoS攻擊的精確度為99.81%,Probe攻擊的精確度為96.67%,R2L攻擊的精確度為48.64%,U2R攻擊的精確度為0%;圖9(c)中max pool圖為最大值采樣的混淆矩陣,可以計算出正常類型的精確度為99.77%,DoS攻擊的精確度為99.74%,Probe攻擊的精確度為98.70%,R2L攻擊的精確度為91.16%,U2R攻擊的精確度為82.69%。從精確度來看,多采樣層模糊了小樣本數據的特征,導致R2L攻擊和U2R攻擊的檢測率低;均值池化略優于最大值池化。

圖9 池化層實驗Fig. 9 Pooling layer experiment
4.2.3 流表項數據集實驗
本實驗展示SDN特有攻擊下的CNN算法訓練過程,9 000條流表項數據取80%進行實驗,剩下20%下一節進行交叉驗證。圖10(a)、(b)及(c)分別展示了訓練過程準確率和損失值隨迭代次數的變化以及輸出結果的混淆矩陣,可以看出模型訓練200次左右便趨近穩定,準確率和損失值都接近于收斂值。根據混淆矩陣可以計算出準確率為99.34%,誤報率為0.43%,召回率為99%。

圖10 流表項數據集訓練Fig. 10 Flow table entry dataset training
圖11是流表項測試數據集的混淆矩陣,可以計算出準確率為98.83%,誤報率為1.28%,召回率為98.72%。各項檢測數據略低于訓練集。

圖11 流表項測試集混淆矩陣Fig. 11 Confusion matrix of flow table entry test set
4.2.4 NSL-KDD數據集測試集實驗
本實驗為了驗證本文所提算法具有較高的準確率、較低的誤報率和較高的召回率,并具有較強的泛化能力,故與其他文獻中的入侵檢測模型進行對比。
圖12所示為本文CNN在NSL-KDD測試集上的混淆矩陣,可以計算出正常的精確度為98.97%,DoS攻擊的精確度為99.81%,Probe攻擊的精確度為96.90%,R2L攻擊的精確度為94.19%,U2R攻擊的精確度為92%。
表5所示是本模型的實驗結果,其中,二分類表示SDN特有攻擊的檢測,可以計算出其在訓練集上的準確率為99.34%,誤檢率為0.43%,召回率為99%,在測試集中準確率為98.83%,誤檢率為1.28%,召回率為98.72%;可以看出本文模型能有效檢測SDN特有攻擊,且具有較強的泛化能力。對比文獻[10,12]的入侵檢測算法,可見本文所提算法具有較高的準確率、較低的誤報率和較高的召回率,并具有較強的泛化能力。

圖12 NSL-KDD測試集混淆矩陣Fig. 12 Confusion matrix of NSL-KDD test set表5 入侵檢測模型實驗結果

單位:% Tab. 5 Experimental results of intrusion detection model unit:%
本文針對SDN架構特有的安全隱患,設計基于卷積神經網絡的入侵檢測模型,該模型可以同時檢測SDN特有攻擊及傳統網絡攻擊。本文依據入侵檢測的特點設計適用于入侵檢測的卷積神經網絡結構,針對小樣本攻擊識別率低的問題,設計加強學習方法。實驗結果表明,該模型具有較高的檢測性能,加強訓練算法能有效提升小樣本攻擊的識別率。