0×00 前言
之前在FreeBuf上看到過針對機器學習在安全領(lǐng)域應用的介紹,或許在信息爆炸的大數(shù)據(jù)時代,從數(shù)據(jù)中尋找安全解決方案不失為一種好的選擇。概念容易理解,但是如果項目落地到底是什么樣呢?作為拋磚引玉,今天我就為大家?guī)硪粋€基于用戶命令行為數(shù)據(jù)的內(nèi)部威脅檢測實驗,希望在FreeBuf上可以涌現(xiàn)更多機器學習在安全領(lǐng)域應用研究的好文章。
0×01 實驗數(shù)據(jù)集
機器學習的核心思想是從大量數(shù)據(jù)集中訓練,進而學習出我們目前還無法知曉或描述的知識,然后基于獲得的知識對新的情況進行預測或判斷。因此,作為機器學習研究或應用的第一步關(guān)鍵工作就是獲取數(shù)據(jù)。
目前數(shù)據(jù)本身就是一種稀缺資源,往往一個分析項目最大的難點就是如何獲取到需要的數(shù)據(jù)。比如想進行交通路況狀態(tài)的大數(shù)據(jù)分析,首先必須要有交通路況流量等數(shù)據(jù),這些只能從交警部門獲得;再如想進行詐騙短信的模型挖掘分析,就必須首先和移動、聯(lián)通和電信合作,獲取到短信流信息,然后才能基于詞法進行學習分類,等等。由于當前的客觀局限,大量關(guān)鍵數(shù)據(jù)并不公開,這就需要政策和公關(guān)的幫助。
學界為了進行機器學習的相關(guān)研究,以及比較不同算法的效果差異,往往采用公開可得的安全數(shù)據(jù)集。這些數(shù)據(jù)集都是研究者在特定的環(huán)境中實際采集到的數(shù)據(jù),經(jīng)過處理后提供給大家免費使用。我們今天實驗使用的數(shù)據(jù)集,就是著名的Schonlau數(shù)據(jù)集。
內(nèi)部威脅檢測是一門年輕的研究領(lǐng)域,2008年的一篇創(chuàng)領(lǐng)域綜述中,第一次正式提出了內(nèi)部威脅,并且將其細化為了Traitor(組織合法成員)和Masquerader(外部偽裝的內(nèi)部成員)兩類攻擊,并且根據(jù)兩類攻擊者的特點進行了分析,提出了可行的應對建議。
今天我們將要使用的Schonlau的Masquerader數(shù)據(jù)集簡稱為S-M數(shù)據(jù)集。該數(shù)據(jù)集結(jié)構(gòu)如下:1. 記錄50個用戶的命令行為記錄; 2. 每個用戶總共記錄了15000條; 3. 每個用戶的前5000條記錄是正常的,后續(xù)的10000條記錄分成100個塊(每個塊100條命令)中隨機混入了Masquerade的命令行為; 4. 所有的命令塊都提供了類別標簽,以供訓練和實驗分組;
整體的User記錄列表如圖1:
以User7為例,具體的命令行為記錄如圖2:
在后面的實驗中,我們會以User7為例進行學習、測試,更加具體的數(shù)據(jù)集信息可以參考Schonlau的個人網(wǎng)站:
0×02 特征提取
機器學習應用的關(guān)鍵有兩個:一個是數(shù)據(jù)分析提取特征,構(gòu)建學習用的特征向量;另一個則是構(gòu)建合適的算法分類器,調(diào)整最優(yōu)參數(shù)獲得最好的分類效果和魯棒性。
針對一個數(shù)據(jù)集的特征構(gòu)建有諸多方法,所得的特征也各有不同。今天出于實驗的考慮,我們用兩種方法來構(gòu)建特征。
下述實驗所用的數(shù)據(jù)均已經(jīng)處理成了100條命令組成的命令塊,每個用戶均有150個塊。
1. 統(tǒng)計特征
最常用的特征方法當然是基于統(tǒng)計分析的特征提取。我們給出一個命令塊的示例,如User7的第一個命令塊:['
cpp', 'sh', '
xrdb', 'cpp', 'sh', 'xrdb', 'mkpts', 'test', '
stty', '
hostname', '
date', '
echo', '[', 'find', '
chmod', 'tty', 'echo', 'env', 'echo', 'sh', 'userenv', 'wait4wm', '
xhost', 'xsetroot', 'reaper', 'xmodmap', 'sh', '[', 'cat', 'stty', 'hostname', 'date', 'echo', '[', 'find', 'chmod', 'tty', 'echo', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'more', 'sh', 'launchef', 'launchef', 'sh', '9term', 'sh', 'launchef', 'sh', 'launchef', 'hostname', '[', 'cat', 'stty', 'hostname', 'date', 'echo', '[', 'find', 'chmod', 'tty', 'echo', 'sh', 'more', 'sh', 'more', 'sh', 'ex', '
sendmail', 'sendmail', 'sh', 'MediaMai', 'sendmail', 'sh', 'rm', 'MediaMai', 'sh', 'rm', 'MediaMai', 'launchef', 'launchef']
為了分類的需要,我們要從中提取出特征構(gòu)建特征向量進行機器學習的訓練。從統(tǒng)計的角度考慮,我們首先使用以下三個維度的特征向量:FeatureVector:【命令種類數(shù),最多的n個命令,最少的m個命令】
其中,命令種類數(shù)指的是100個命令組成的命令塊中出現(xiàn)過的命令種類;最多的n個命令則是指命令塊中出現(xiàn)次數(shù)降序排列的前n個;同理,最少的m個命令則是指命令塊中出現(xiàn)次數(shù)降升序排列的前m個。同樣是User7的第一個命令塊,提取特征向量為:FeatureVector:【28, ['mkpts', 'xsetroot', 'xhost', 'ex', 'reaper'], ['sh', 'more', 'echo', 'launchef', '[' 】
整體的特征向量結(jié)構(gòu)如圖3:
之所以選擇這三個特征向量,是因為我們假設(shè)用戶在日常的工作中的命令行為應該具有穩(wěn)定性,訓練期間整體的命令使用記錄應當呈現(xiàn)穩(wěn)定的規(guī)律。
2. 文本特征
上面介紹了我們實驗中使用的統(tǒng)計特征,該特征主要在KNN分類器中使用。對于這類文本數(shù)據(jù),我們可以使用樸素貝葉斯(Naive Bayes)分類器。但是在此之前,我們需要對數(shù)據(jù)進行處理,獲得文本特征。
我們這里使用的文本特征基于一個訓練集的詞匯表,根據(jù)一般的訓練測試比例,我們選擇90%的數(shù)據(jù)用來訓練,10%的數(shù)據(jù)用來測試。我們首先建立一個詞集(WordSet),其中包含訓練集中出現(xiàn)過的所有單詞,這里即我們所說的用戶命令。
通過隨機選取135個命令塊,我們統(tǒng)計其中出現(xiàn)的命令單詞,獲得長度為144的詞匯表:['tty', 'gs', 'xdvi.rea', 'basename', 'uname', 'sleep', 'touch', 'find', 'lc', 'ln', 'xset', 'tail', 'dict', 'ls', 'lp', 'troff', 'dvips', 'ld_', 'ksh', 'xconfirm', 'env', '==', 'xdm', 'xterm', 'tbl', 'getpgrp', 'MakeTeXP', '
stty', 'du', 'gethost', 'mimencod', 'tput', 'p', 'samterm', 'appdefpa', 'dvipost', 'xhost', 'FIFO', 'wdefine', 'sed', 'ex', 'download', 'dirname', '9term', '
sendmail', 'rm', 'bc', 'netstat', 'nawk', 'mkpts', 'news', '[', 'on', 'rlogin', 'lks', 'xmodmap', 'w', 'faces', '4Dwm', 'col', 'drf', 'postprin', 'tcpostio', 'xsetroot', '
chmod', 'echo', 'colthloo', 'printf', '
xrdb', 'diff', 'xdvi', 'xv', 'post', 'pr', 'ps', 'wait4wm', 'pq', 'ppost', 'mkdir', 'MediaMai', 'hpost', 'xlistscr', 'rmdir', 'dpost', 'virmf', 'userenv', 'sort', 'LOCK', 'eqn', 'telnet', 'pwd', 'delatex', 'nospool', 'true', 'netscape', 'grep', 'mc', 'agrep', 'expr', 'cat', 'ul', 'xprop', 'virtex', 'more', 'launchef', 'sprog', 'gettxt', 'sam', 'mailx', 'file', 'ispell', 'id', 'xmaplev5', 'xmaplev4', 'xrn', 'egrep', 'hoc', 'xwsh', 'generic', 'twm', '
hostname', 'acroread', 'endsessi', 'reaper', 'which', 'test', 'getopt', '=', 'tellwm', 'colthrea', 'spell', 'ghostvie', 'tcppost', 'toolches', 'gzip', 'UNLOCK', 'awk', 'gftopk', '
date', 'maple.sy', 'xclock', 'man', 'sh', '
cpp']
在獲得詞匯表之后,對135個訓練命令塊分別提取特征。特征向量為一個與詞匯表相同長度的特征向量,當對應的命令在塊中出現(xiàn)時,則該塊的對應位置元素為1,未出現(xiàn)則為0。同樣以User7的第一個命令塊的特征向量為例:[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1]
在處理獲得訓練集的特征向量后,接下來的工作就是構(gòu)建分類器了。
0×03 KNN實驗
1. KNN介紹
KNN(K Nearest Neighbour)稱之為“K最近鄰”算法。它的核心思想是比較一個示例與已知的所有樣本的距離,選擇最近的K個樣本,以這些樣本中數(shù)量最多的類別作為新示例的判斷結(jié)果。以圖4為例:
假設(shè)與示例最近的7個樣本中,三個屬于類別1, 兩個屬于類別2,類別3和類別4分別只有一個,那么分類器就會判定示例類別為1。
2. KNN距離計算
KNN算法的關(guān)鍵在于距離的度量。一般對于數(shù)值型的特征可以使用歐式距離,而對于集合特征,我們使用比較不同命令的個數(shù),最終都是作為數(shù)值型計算歐氏距離。KNN算法的優(yōu)點是:精度高、對異常值不敏感、無數(shù)據(jù)輸入假定; KNN算法的缺點是:計算復雜度高,空間復雜度高(存儲訓練集的距離)
針對之前我們獲得的統(tǒng)計特征:FeatureVector:【28, ['mkpts', 'xsetroot', '
xhost', 'ex', 'reaper'], ['sh', 'more', '
echo', 'launchef', '[' 】
第一個維度可以直接計算歐式距離,后兩個維度則比較兩個特征向量間的相同性,將差異值作為計算歐式距離的數(shù)值,代碼如圖5:
KNN算法不需要構(gòu)建分類器,大致過程如下:1. 計算、存儲訓練集的特征向量; 2. 輸入一個新示例x,計算其特征向量; 3. 計算新示例特征向量與訓練集所有特征向量的距離; 4. 選擇距離最小的k個向量; 5. 判斷k個向量的類別,占比最高的類別即為x的類別;
KNN算法中特征向量間的距離計算代碼如圖6:
KNN實驗結(jié)果
我們使用KNN算法進行了“10折交叉驗證”,10次實驗的平均準確率為0.866667,平均用時0.439156,可以由于數(shù)據(jù)量較小,因此運行速度很快,但是準確率并不高,尤其是有兩例漏報,因此實際的應用效果并不理想。
分類效果不理想有多方面原因,對應也可以從多個方面改進。比如數(shù)據(jù)的再處理(歸一化、去中心化等),比如參數(shù)的調(diào)整設(shè)置(KNN中k的取值,以及m和n的取值),比如擴充特征向量。如果上述方法都不理想,那么我們可以選擇更加合適的算法構(gòu)建分類器。我們下面是用樸素貝葉斯來構(gòu)建分類器。
0×04 NB實驗
Naive Bayes(NB)稱之為樸素貝葉斯,其基礎(chǔ)為貝葉斯理論。貝葉斯理論的核心思想就是當需要對示例進行分類時,計算示例屬于每種分類的條件概率,然后選擇概率最大的分類作為判斷。例如,對于示例x有兩個分類:1表示異常,0表示正常,那么我們分別計算P(1|x)和P(0|x),如果P(1|x) > P(0|x),則x屬于類別1,異常;反之屬于類別0。
一般來說計算P(1|x)比較麻煩,那么我們使用貝葉斯公式進行簡化,如圖7:
當我們考慮是樸素貝葉斯時,即考慮特征間各個維度相互獨立,且都是同等重要的。那么分子的計算可以進行簡化,這里更多的細節(jié)略去不表,感興趣的童鞋可以參考博文
我們直接給出實現(xiàn)的代碼,具體在python中實現(xiàn)時會根據(jù)工程進行一些改變,如圖8計算重要的概率參數(shù):
如圖9進行分類判定:
最終的實驗結(jié)果果然沒有讓我們失望,同樣采用10折交叉驗證,樸素貝葉斯分類器的錯誤率只有0.0666…,誤報率為0,,如圖10:
0×05 小結(jié)
今天我們基于公開的S-M用戶命令行為數(shù)據(jù)集,分別提取了統(tǒng)計特征和文本特征。當使用KNN構(gòu)建的分類器針對統(tǒng)計特征不能很好地識別異常命令塊時,我們采用樸素貝葉斯分類器針對文本特征識別異常,相比于KNN分類器結(jié)果大大改進。
實驗的結(jié)果仍舊有很大的改進空間。基于機器學習建立的主動檢測機制的效果改進可以從特征擴充、參數(shù)微調(diào)、模型修改以及算法選擇上著手,一般都會有不錯的結(jié)果。我們今天的實驗為大家呈現(xiàn)了主動檢測機制一點端倪:1. 收集數(shù)據(jù):來自你需要的各個領(lǐng)域; 2. 準備數(shù)據(jù):將數(shù)據(jù)處理成指定格式,如命令塊、文本向量等; 3. 分析數(shù)據(jù):從數(shù)據(jù)特點以及安全知識中提取特征,建立
特征向量; 4. 訓練算法:選擇合適的機器學習算法,學習模型參數(shù); 5. 測試算法:按照10折交叉驗證測試分類器效果; 6. 使用算法:若算法效果可以接受,則實際部署;否則返回步驟3,循環(huán);
關(guān)鍵有兩點,一個是特征的選擇和構(gòu)建,一個是算法分類器的選擇和優(yōu)化;而現(xiàn)實應用最大的瓶頸則是誤報率高。今天的實驗介紹僅僅是領(lǐng)域的一個邊角,更多有趣的內(nèi)容歡迎大家一起分享!
參考資料
A Survey of Insider Attack Detection Research, Malek &Shlomo, 2008;
機器學習實戰(zhàn),Perter Harrington, 人民郵電出版社, 2013
(本文來自互聯(lián)網(wǎng),不代表本站的觀點和立場)