◆孟 平 龍華秋
(五邑大學(xué)智能制造學(xué)部 廣東 529020)
如今互聯(lián)網(wǎng)的發(fā)展速度和規(guī)模的擴(kuò)張十分迅猛,IT技術(shù)、硬件產(chǎn)品和軟件產(chǎn)品的迭代更新非常迅速?;ヂ?lián)網(wǎng)+的時(shí)代,如此迅速的發(fā)展給我們的生活帶來了巨大的便利,同時(shí)也帶來了眾多的安全隱患。在大多數(shù)人眼中,互聯(lián)網(wǎng)上的安全問題,大多都是數(shù)據(jù)泄露,以及其他相關(guān)問題,這些問題影響的大多都是企業(yè),造成的損失也基本是經(jīng)濟(jì)上的損失。然而近年來發(fā)生的多起工業(yè)控制系統(tǒng)相關(guān)的安全問題,充分證明了攻擊者完全可以通過互聯(lián)網(wǎng)威脅到人們的現(xiàn)實(shí)生活,比如近期國外發(fā)生的工控系統(tǒng)入侵事件導(dǎo)致的他國全國范圍大部分地區(qū)停電的事件。當(dāng)下互聯(lián)網(wǎng)的安全問題,已經(jīng)被國家高中重視,網(wǎng)絡(luò)安全事關(guān)國家安全。
利用機(jī)器學(xué)習(xí)中的監(jiān)督學(xué)習(xí)相關(guān)算法訓(xùn)練好的模型,在實(shí)際中應(yīng)用時(shí),可以快速對(duì)一個(gè)新提取的樣本做判斷,判斷其是否惡意。比以往通過特征碼等其他判斷方式,少了查詢“特征碼集合”和比對(duì)的操作,其判斷速度上要遠(yuǎn)快于傳統(tǒng)方式。良好的訓(xùn)練集和合適的算法及相應(yīng)的參數(shù),可使訓(xùn)練出來的模型具有很好的泛化性能。
計(jì)算機(jī)網(wǎng)絡(luò)具有多層協(xié)議,在其七層模型(物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層)中,物理層和數(shù)據(jù)鏈路層太過底層,會(huì)話層、表示層和應(yīng)用層涉及的協(xié)議眾多不適合作為用于進(jìn)行判斷其是否惡意的基礎(chǔ)。在網(wǎng)絡(luò)層上可以開始不考慮具體的數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn),而傳輸層TCP和UDP協(xié)議是上層協(xié)議的基礎(chǔ)且僅為實(shí)現(xiàn)連續(xù)和離散的傳輸方式。因此在本次研究中,判斷流量是否惡意便是基于網(wǎng)絡(luò)層和傳輸層的數(shù)據(jù)報(bào)文。
在整個(gè)機(jī)器學(xué)習(xí)入侵檢測中,我們需要有“流量探針”為我們捕獲流量,而捕獲的數(shù)據(jù)報(bào)文要經(jīng)過“特征提取”,提取的特征會(huì)組成一個(gè)“樣本”,樣本將會(huì)是我們直接用于訓(xùn)練模型和模型判斷的目標(biāo)。在本次研究中,由于服務(wù)器性能等問題,為了方便,我們直接使用KDD 99 比賽中提供的五百萬現(xiàn)成的樣本,作為訓(xùn)練模型和模型評(píng)估的數(shù)據(jù)集合。在整個(gè)系統(tǒng)中將分為三個(gè)部分:模型訓(xùn)練、樣本采集和模型判斷。
圖1為系統(tǒng)流程圖。
如流程圖中所示,整個(gè)系統(tǒng)中有三個(gè)部分相對(duì)獨(dú)立:模型訓(xùn)練、檢測判斷、樣本采集。本系統(tǒng)涉及機(jī)器學(xué)習(xí)的內(nèi)容,要保證模型訓(xùn)練、樣本采集和檢測判斷的部分的最終樣本的維度特征的一致性,才能保證模型的使用。因本課題中,對(duì)樣本的判斷可以看作是分類,即是否具有攻擊性和可能的攻擊類別,因此在機(jī)器學(xué)習(xí)模型算法的選擇上,我們將選擇分類器相關(guān)的算法。
圖1 系統(tǒng)流程圖
以下將對(duì)模型訓(xùn)練階段的內(nèi)容進(jìn)行講解:
在本次研究課題中,我們采用的是機(jī)器學(xué)習(xí)中監(jiān)督學(xué)習(xí)的邏輯斯諦回歸算法(Logistic Regression)。需要注意的是,邏輯斯諦回歸算法并不是回歸模型相關(guān)的算法,而是用于分類的分類器算法。
2.1.1 算法原理
邏輯斯蒂回歸(Logistic Regression),是一種分類算法,其算法原理如下:
不同類的x對(duì)應(yīng)z的值為0或者1,單位階躍函數(shù)由于函數(shù)性質(zhì)不可導(dǎo)不連續(xù),所以引入sigmoid函數(shù):
圖2函數(shù)圖
所以令:
得到:
化成對(duì)數(shù)形式:
y/(1-y) 代表了樣本作為正例的可能性,1-y是反例。
所以y=概率p(y=1|x)
1-y=概率p(y=0|x)
所以上式又可化為:
解得:
將這2個(gè)等式化成一個(gè)等式:
對(duì)上式連乘,然后取對(duì)數(shù),進(jìn)行極大似然估計(jì):
最大化上式相等于最小化:
這是一個(gè)凸函數(shù),可以使用梯度下降或者牛頓迭代(割線法)來求最優(yōu)解。
梯度下降的迭代式為:
因?yàn)橐龈叩姆较?,所以?號(hào),代表梯度的正方向。
2.1.2 邏輯斯蒂回歸——多分類擴(kuò)展
邏輯斯蒂回歸是二分類器,本系統(tǒng)是多分類器,所以采用OVR的方式將二分類器的方式擴(kuò)展到多分類器,OVR訓(xùn)練多個(gè)分類器,每一個(gè)分類器將某一類別的視為正樣本,其他視為負(fù)樣本,訓(xùn)練出n個(gè)后,然后輸出每個(gè)樣本對(duì)應(yīng)每個(gè)類別的概率,取最大的概率作為最終的輸出結(jié)果。
為了方便,我們?cè)谀P陀?xùn)練階段直接使用了KDD 99比賽的數(shù)據(jù)集,以縮減前期數(shù)據(jù)采集的時(shí)間。該數(shù)據(jù)集采集自美國軍方網(wǎng)絡(luò),其樣本的特征基于計(jì)算機(jī)網(wǎng)絡(luò)的網(wǎng)絡(luò)層和傳輸層的,但在其提供的特征上做了適當(dāng)?shù)倪x擇和特征的向量化,使其更加適用于本課題的研究。
具體特征內(nèi)容如下:
(1)duration:TCP以3次握手建立到FIN/ACK連接結(jié)束為止的時(shí)間;
(2)protocol type:協(xié)議類型;
(3)Service:網(wǎng)絡(luò)服務(wù)類型;
(4)flag:連接正常或錯(cuò)誤;
(5)src_bytes:源主機(jī)到目標(biāo)主機(jī)數(shù)據(jù)字節(jié)數(shù);
(6)dst_bytes:目標(biāo)主機(jī)到源主機(jī)數(shù)據(jù)字節(jié)數(shù);
(7)land:若連接來自或送達(dá)同一個(gè)主機(jī)則為1,否則為0;
(8)wrong_fragment:錯(cuò)誤分段數(shù)量;
(9)urgent:加急包個(gè)數(shù);
(10)count:與當(dāng)前連接具有相同的目標(biāo)主機(jī)的連接數(shù);
(11)srv_count:與當(dāng)前連接具有相同服務(wù)的連接數(shù);
(12)serror_rate:在與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,出現(xiàn)“SYN”錯(cuò)誤的連接的百分比;
(13)srv_serror_rate:在與當(dāng)前連接具有相同服務(wù)的連接中,出現(xiàn)“SYN”錯(cuò)誤的連接的百分比;
(14)rerror_rate:在與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,出現(xiàn)“REJ”錯(cuò)誤的連接的百分比;
(15)srv_rerror_rate:在與當(dāng)前連接具有相同服務(wù)的連接中,出現(xiàn)“REJ”錯(cuò)誤的連接的百分比;
(16)same_srv_rate:在與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,與當(dāng)前連接具有相同服務(wù)的連接的百分比;
(17)diff_srv_rate:在與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,與當(dāng)前連接具有不同服務(wù)的連接的百分比;
(18)srv_diff_host_rate:在與當(dāng)前連接具有相同服務(wù)的連接中,與當(dāng)前連接具有不同目標(biāo)主機(jī)的連接的百分比;
(19)dst_host_count:與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接數(shù);
(20)dst_host_srv_count:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同服務(wù)的連接數(shù);
(21)dst_host_same_srv_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同服務(wù)的連接所占的百分比;
(22)dst_host_diff_srv_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)不同服務(wù)的連接所占的百分比;
(23)dst_host_same_src_port_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同源端口的連接所占的百分比;
(24)dst_host_srv_diff_host_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同服務(wù)的連接中,與當(dāng)前連接具有不同源主機(jī)的連接所占的百分比;
(25)dst_host_serror_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,出現(xiàn)SYN錯(cuò)誤的連接所占的百分比;
(26)dst_host_srv_serror_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同服務(wù)的連接中,出現(xiàn)SYN錯(cuò)誤的連接所占的百分比;
(27)dst_host_rerror_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)的連接中,出現(xiàn)REJ錯(cuò)誤的連接所占的百分比;
(28)dst_host_srv_rerror_rate:與當(dāng)前連接具有相同目標(biāo)主機(jī)相同服務(wù)的連接中,出現(xiàn)REJ錯(cuò)誤的連接所占的百分比。
def ReadData(path):
data=open(path).readlines()
data=np.array([i.split(',') for i in data])
data[:, -1]= [i.replace(' ', '').replace('.', '') for i in data[:, -1]]
data_r=np.zeros(shape=data.shape)
data_r[:,0]=[float(i) for i in data[:,0]]
for i in range(4,40):
data_r[:, i]= [float(j) for j in data[:, i]]
protocol_type={k:i for i,k in enumerate(set(data[:,1]))}
service={k:i for i,k in enumerate(set(data[:,2]))}
flag={k:i for i,k in enumerate(set(data[:,3]))}
label={k:i for i,k in enumerate(set(data[:,-1]))}
print(protocol_type)
print(service)
print(flag)
print(label)
data_r[:, 1]= [protocol_type[j]for j in data[:, 1]]
data_r[:, 2]= [service[j]for j in data[:, 2]]
data_r[:, 3]= [flag[j]for j in data[:, 3]]
data_r[:, -1]= [label[j]for j in data[:, -1]]
data_r=np.c_[data_r[:,0:9],data_r[:,22:42]]
weight={}
for j in range(len(label)):
weight[j]=len(data)-len([i for i in data_r if i[-1]==j])
return data_r,weight
def Classify(feature,weight):
lr=LogisticRegression()
X_train, X_test, y_train, y_test = train_test_split(feature[:,:-1],feature[:,-1], test_size = 0.3, random_state = 42)
w=[weight[i]for i in y_train]
d = [weight[i]for i in y_test]
lr.fit(X_train,y_train,sample_weight=w)
print(str(lr.score(X_test,y_test,sample_weight=d)))
joblib.dump(lr, 'kdd99lr')
def train():
feature,weight=ReadData(r'kddcup.data.corrected')
Classify(feature,weight)
train()
圖3 數(shù)據(jù)采集功能
其中DONE表明該表明該樣本已經(jīng)過模型檢測判斷等處理。
圖4內(nèi)容為已訓(xùn)練好的模型對(duì)樣本采集器中樣本的檢測結(jié)果。
圖4 檢測結(jié)果
表1 模型性能評(píng)估表
phf 0.00 0.00 0.00 1 ipsweep 0.98 0.20 0.33 3709 smurf 1.00 1.00 1.00 842033 pod 0.00 0.00 0.00 72 rootkit 0.00 0.00 0.00 3 neptune 0.99 1.00 0.99 321807 warezmaster 0.00 0.00 0.00 5 multihop 0.00 0.00 0.00 1 nmap 0.88 0.09 0.17 733 teardrop 1.00 0.99 0.99 279 back 0.00 0.00 0.00 664 spy 0.00 0.00 0.00 1 ftp_write 0.00 0.00 0.00 4 loadmodule 0.00 0.00 0.00 3 land 0.50 0.20 0.29 10 buffer_overflow 0.00 0.00 0.00 10 warezclient 0.00 0.00 0.00 303 guess_passwd 0.00 0.00 0.00 13 portsweep 0.25 0.00 0.00 3079 Imap 0.00 0.00 0.00 1 perl 0.00 0.00 0.00 1 multihop 0.98 1.00 0.99 291976 Micro-avg 0.99 0.99 0.99 1469530 Macro-avg 0.33 0.23 0.25 1469530 Weighted-avg 0.99 0.99 0.99 1469530
本文詳細(xì)介紹了基于Python的機(jī)器學(xué)習(xí)入侵檢測系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。項(xiàng)目總共有三大功能需要實(shí)現(xiàn):模型訓(xùn)練、檢測判斷、樣本采集。在本項(xiàng)目中,我們直接使用KDD 99 比賽中提供的五百萬現(xiàn)成的樣本,作為訓(xùn)練模型和模型評(píng)估的數(shù)據(jù)集,使用邏輯斯蒂回歸算法對(duì)流量樣本進(jìn)行訓(xùn)練,從大量的流量數(shù)據(jù)集合中找到惡意樣本。通過在實(shí)際環(huán)境進(jìn)行的大量網(wǎng)絡(luò)流量測試,與流量樣本的測試,驗(yàn)證了該入侵檢測系統(tǒng)的實(shí)用性。