朱驪安
(北京郵電大學(xué)理學(xué)院,北京 100876)
基于隱馬爾可夫模型的web異常檢測案例分析
朱驪安
(北京郵電大學(xué)理學(xué)院,北京 100876)
如何將數(shù)據(jù)科學(xué)在網(wǎng)絡(luò)安全領(lǐng)域內(nèi)應(yīng)用一直是一個(gè)火熱的話題,本文介紹了如何用隱馬爾可夫模型(HMM)建立web參數(shù)模型,檢測注入類的web攻擊。以及這種方法在某航空公司的實(shí)施情況,準(zhǔn)確率最終達(dá)到約80%。
隱馬爾可夫模型;異常檢測;隱含序列;概率模型;web威脅
隨著互聯(lián)網(wǎng)的發(fā)展,企業(yè)的傳統(tǒng)網(wǎng)絡(luò)邊界在逐漸消失。工業(yè)界特別是大型互聯(lián)網(wǎng)公司,平均每日活躍用戶上千萬,每個(gè)應(yīng)用系統(tǒng)的日志都會(huì)高達(dá)幾百G甚至上T字節(jié)。同時(shí),以灰產(chǎn),黑產(chǎn)為代表的惡意訪問占比依然居高不下,并且攻擊手段在不斷推陳出新。傳統(tǒng)web入侵檢測技術(shù),無論是Firewall、Web應(yīng)用防火墻(WAF)、入侵防御系統(tǒng)、入侵防御系統(tǒng)(IPS)還是入侵檢測系統(tǒng)(IDS)本質(zhì)上都是依據(jù)白名單或已發(fā)現(xiàn)攻擊總結(jié)出的規(guī)則,通過維護(hù)規(guī)則集對(duì)入侵訪問進(jìn)行攔截。一方面,硬規(guī)則在靈活的黑客面前,很容易被繞過,且基于以往知識(shí)的規(guī)則集難以應(yīng)對(duì)攻擊;另一方面,攻防對(duì)抗水漲船高,防守方規(guī)則的構(gòu)造和維護(hù)門檻高、成本大。
基于機(jī)器學(xué)習(xí)技術(shù)的新一代web入侵檢測技術(shù)有望彌補(bǔ)傳統(tǒng)規(guī)則集方法的不足,為web對(duì)抗的防守端帶來新的發(fā)展和突破。Web異常檢測歸根結(jié)底還是基于日志文本的分析,因而可以借鑒自然語言處理中的一些方法思路,進(jìn)行文本分析建模。基于隱馬爾科夫模型(HMM)的參數(shù)值異常檢測,就是借助自然語言處理的方法,發(fā)現(xiàn)web日志中的異常序列,從而在線檢測出未知異常行為。
1.1 隱馬爾可夫模型
隱馬爾可夫模型(HMM)是馬爾可夫鏈的一種,它的狀態(tài)不能直接觀察到,但能通過觀測向量序列觀察到,每一個(gè)觀測向量是由一個(gè)具有相應(yīng)概率密度分布的狀態(tài)序列產(chǎn)生。
這里x為過程中的某個(gè)狀態(tài)。上面這個(gè)恒等式可以被看作是馬爾可夫性質(zhì)[1]。
隨機(jī)過程是一連串隨機(jī)事件動(dòng)態(tài)關(guān)系的定量描述。馬爾科夫過程是一種隨機(jī)過程,簡單地說,已知現(xiàn)在、將來與過去無關(guān)(條件獨(dú)立),則稱此過程為馬爾科夫過程[2]。
HMM 主要有以下三類應(yīng)用:解碼問題,根據(jù)模型參數(shù)和觀測序列,找出該觀測序列最優(yōu)的隱含狀態(tài)序列;評(píng)估問題,根據(jù)模型參數(shù)和觀測序列,計(jì)算該觀測序列是由該模型生成的概率;學(xué)習(xí)問題,根據(jù)一系列觀測序列,建立對(duì)應(yīng)該系列序列最優(yōu)的HMM 模型。這里我們只用得到后兩個(gè)。在訓(xùn)練階段,對(duì)應(yīng)學(xué)習(xí)問題,用大量正常的參數(shù)值訓(xùn)練出站點(diǎn)下的參數(shù)id的HMM模型;在檢測階段,對(duì)應(yīng)評(píng)估問題,待檢測的參數(shù)值帶入模型檢測是否是正常。
1.2 參數(shù)異常模型
Web威脅中的幾大類攻擊,SQL、XSS、RCE等雖然攻擊方式各不相同,但基本都有一個(gè)通用的模式,即通過對(duì)參數(shù)進(jìn)行注入payload來進(jìn)行攻擊,參數(shù)可能是出現(xiàn)在GET、POST、COOKIE、PATH等等位置。所以對(duì)于異常模型,能覆蓋掉參數(shù)中出現(xiàn)的異常,就能覆蓋掉很大一部分的常見的Web攻擊[3]。
假設(shè)有這樣一條url:www.xxx.com/index.php?id=123。通過對(duì)url的所有訪問記錄分析,不難發(fā)現(xiàn):普通用戶的正常請(qǐng)求雖然不一定完全相同,但總是彼此相似;攻擊者的異常請(qǐng)求總是彼此各有不同,同時(shí)又明顯不同于正常請(qǐng)求。如下數(shù)據(jù)所示:
User: www.xxx.com/index.php?userid=admin123
www.xxx.com/index.php?userid=root
www.xxx.com/index.php?userid=hzq_2017
Attacker: www.xxx.com/index.php?userid= mai06’union select xxx from xxx
www.xxx.com/index.php?userid=%3Cscript%3E alert(‘XSS’)%3C
www.xxx.com/index.php?userid=125$%7B@prin t(md5(123))%7D
如果我們能夠搜集大量參數(shù) id的正常的參數(shù)值,建立起一個(gè)能表達(dá)所有正常值的正常模型。由于,正??偸腔鞠嗨?,異常卻各有各的異常?;谶@樣一條觀測經(jīng)驗(yàn),如果我們能夠搜集大量參數(shù)id的正常的參數(shù)值,建立起一個(gè)能表達(dá)所有正常值的正常模型,那么一切不滿足于該正常模型的參數(shù)值,即為異常。
2.1 系統(tǒng)架構(gòu)--組件選擇與模塊關(guān)系
模型訓(xùn)練過程我們需要大量的正常歷史數(shù)據(jù)進(jìn)行訓(xùn)練、數(shù)據(jù)量會(huì)達(dá)千萬級(jí)別以上,因此我們需要一個(gè)大數(shù)據(jù)處理引擎;此外,檢測過程中我們希望能夠?qū)崟r(shí)的檢測數(shù)據(jù),及時(shí)的發(fā)現(xiàn)攻擊,這是一個(gè)流(streaming)計(jì)算過程,需要一個(gè)流計(jì)算引擎。綜合考慮,我們選擇 spark作為統(tǒng)一的數(shù)據(jù)處理引擎,即可以實(shí)現(xiàn)批處理,也可以使用spark streaming實(shí)現(xiàn)近實(shí)時(shí)的計(jì)算。
系統(tǒng)架構(gòu)如下圖,需要在spark上運(yùn)行三個(gè)任務(wù):
圖1 系統(tǒng)架構(gòu)圖Fig.1 Sy stem architecture diagram
①sparkstreaming將kafka中的數(shù)據(jù)實(shí)時(shí)的存入HDFS;
②訓(xùn)練算法定期加載批量數(shù)據(jù)進(jìn)行模型訓(xùn)練,并將模型參數(shù)保存到HDFS;
③檢測算法加載模型,檢測實(shí)時(shí)數(shù)據(jù),并將告警保存到ElasticSearch。
在我們的系統(tǒng)中,模型訓(xùn)練算法是在 spark上開發(fā)完成的。用HDFS來存儲(chǔ)HTTP請(qǐng)求數(shù)據(jù)和模型數(shù)據(jù)。ElasticSearch在我們的系統(tǒng)架構(gòu)中主要用來存儲(chǔ)、檢索、展示告警數(shù)據(jù)。
2.2 數(shù)據(jù)的采集與儲(chǔ)存
獲取http請(qǐng)求數(shù)據(jù)通常有兩種方式,第一種從web應(yīng)用中采集日志,使用 logstash從日志文件中提取日志并泛化,寫入 Kafka;第二種可以從網(wǎng)絡(luò)流量中抓包提取http信息。我這里使用第二種,用python結(jié)合Tcpflow采集http數(shù)據(jù),在數(shù)據(jù)量不大的情況下可穩(wěn)定運(yùn)行。
與 Tcpdump以包單位保存數(shù)據(jù)不同,Tcpflow是以流為單位保存數(shù)據(jù)內(nèi)容,分析 http數(shù)據(jù)使用tcpflow會(huì)更便捷。Tcpflow在linux下可以監(jiān)控網(wǎng)卡流量,將 tcp流保存到文件中,因此可以用 python的pyinotify模塊監(jiān)控流文件,當(dāng)流文件寫入結(jié)束后提取 http數(shù)據(jù),寫入 Kafka。這樣數(shù)據(jù)的采集就完成了,下面開始數(shù)據(jù)的儲(chǔ)存。
開啟一個(gè) SparkStreaming任務(wù),從 kafka消費(fèi)數(shù)據(jù)寫入Hdfs,Dstream的python API沒有好的入庫接口,需要將Dstream的RDD轉(zhuǎn)成DataFrame進(jìn)行保存,保存為json文件。
2.3 數(shù)據(jù)的清洗與泛化
抽取器實(shí)現(xiàn)原始數(shù)據(jù)的參數(shù)提取和數(shù)據(jù)泛化,傳入一條json格式的http請(qǐng)求數(shù)據(jù),可以返回所有參數(shù)的 id、參數(shù)類型、參數(shù)名、參數(shù)的觀察狀態(tài)序列 p_list。
2.3.1 拆解數(shù)據(jù)生成參數(shù)
將http請(qǐng)求數(shù)據(jù)用“請(qǐng)求的URL路徑”和“GET、POST的請(qǐng)求參數(shù)以及參數(shù)名本身”兩種方式進(jìn)行拆解,提取相應(yīng)的參數(shù)值。例如:提取源IP、目的IP、host[4]。這一步的難點(diǎn)在于如何正確的識(shí)別編碼方式并解碼。不同的參數(shù),正常的值不同。同時(shí),有參數(shù)傳遞的地方,就有可能發(fā)生參數(shù)注入型攻擊。所以,需要對(duì)站點(diǎn)下所有路徑下,所有GET、POST、PATH中的所有參數(shù)都訓(xùn)練各自的正常模型。另外,對(duì)參數(shù)名本身,也訓(xùn)練其正常的模型。
針對(duì)這些情況將參數(shù)分成三類:第一類,uri,將每條 uri的每一個(gè)參數(shù)對(duì)應(yīng)的參數(shù)值泛化后做為p_state。第二類,uri_pname,將每條數(shù)據(jù)的所有的參數(shù)名拼接起來泛化作為p_state。第三類,uri_path,將每條數(shù)據(jù)的uri里面的路徑泛化作為p_state。
2.3.2 參數(shù)泛化
如果我們把參數(shù) id的每個(gè)參數(shù)值看作一個(gè)序列,那么參數(shù)值中的每個(gè)字符就是這個(gè)序列中的一個(gè)狀態(tài)。同時(shí),對(duì)于一個(gè)序列,為 123或者 345,其背后所表達(dá)的安全上的解釋都是:數(shù)字 數(shù)字 數(shù)字,我們用N來表示數(shù)字,這樣就得到了對(duì)應(yīng)的隱含序列,取字符的unicode數(shù)值作為觀察序列[5]。泛化的方法如下:
1. 大小寫英文字母泛化為“A”,對(duì)應(yīng)的unicode數(shù)值為65。2. 數(shù)字泛化為“N”,對(duì)應(yīng)的unicode數(shù)值為78。3. 中文或中文字符泛化為“C”,對(duì)應(yīng)的unicode數(shù)值為67。
4. 特殊字符和其他字符集的編碼不作泛化,直接取unicode數(shù)值。
5. 參數(shù)值為空的取0。
2.4 訓(xùn)練任務(wù)
一個(gè)參數(shù)對(duì)應(yīng)一條數(shù)據(jù),其中包括:一個(gè)p_id與一個(gè) p_state。這樣就得到了對(duì)應(yīng)的隱含序列。Spark訓(xùn)練任務(wù)抽取所有 http請(qǐng)求數(shù)據(jù)的參數(shù),并按照參數(shù)ID(p_id)分組,分別進(jìn)行訓(xùn)練,將訓(xùn)練模型保存到Hdfs。
2.4.1 得到模型輸入
我們需要對(duì)經(jīng)過清洗與泛化(Extractor)后的數(shù)據(jù)進(jìn)行分組,并存為字典p_dict。key值為參數(shù)ID,將 key值相同的數(shù)據(jù)的 p_state作為其 value值。p_dict的 key值有:p_id,p_name,p_type,p_state。由于模型的輸入規(guī)則,我們只需要參數(shù)ID(p_id)和隱含序列(p_State)。故將每個(gè) p_dict中的 p_id和p_state抽取出來得到模型的輸入數(shù)據(jù)。
2.4.2 計(jì)算基線并保存--訓(xùn)練器(Trainer)
傳入?yún)?shù)的所有觀察序列,訓(xùn)練器完成對(duì)參數(shù)的訓(xùn)練,返回訓(xùn)練好的模型profile[6]。其中,HMM模型使用python下的hmmlearn模塊,profile取觀察序列的最小得分。由于我們假定進(jìn)入模型的數(shù)據(jù)是正常數(shù)據(jù),建立的是一個(gè)能表達(dá)所有正常值的正常模型,那么一切不滿足于該正常模型的參數(shù)值,即為異常。所以,profile取得是所有score的最小值。再將基線結(jié)果profile值保存起來[7-9]。
2.5 檢測任務(wù)
Spark Streaming檢測任務(wù)實(shí)時(shí)獲取kafka流數(shù)據(jù),抽取出數(shù)據(jù)的參數(shù),如果參數(shù)有訓(xùn)練模型,就計(jì)算參數(shù)得分,小于基線輸出告警到Elasticsearch。將得分與基線相比較,低于基線的報(bào)警。
3.1 背景
某航空公司門戶網(wǎng)站發(fā)現(xiàn)有不少攻擊嘗試行為,偶爾會(huì)發(fā)現(xiàn)有些網(wǎng)頁正常用戶在常規(guī)訪問的過程中會(huì)發(fā)現(xiàn)無法訪問的現(xiàn)象。經(jīng)初步判定,很可能是攻擊用戶的異常請(qǐng)求造成的。為了進(jìn)一步分析,航空公司運(yùn)維人員提供了為期一個(gè)月的web訪問日志,需要把訪問日志中的異常行為數(shù)據(jù)篩選出來。
3.2 研究過程
3.2.1 數(shù)據(jù)情況
運(yùn)維人員提供的是 IIS日志,對(duì)應(yīng)的日志關(guān)鍵屬性如表1所示。
3.2.2 數(shù)據(jù)處理與建模
以第一周七天的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),一周數(shù)據(jù)大概1G左右,我們選擇通過spark程序把數(shù)據(jù)處理成我們建模需要的json格式,存入HDFS中。數(shù)據(jù)預(yù)處理完成后,我們執(zhí)行訓(xùn)練任務(wù),建立模型。建模結(jié)果部分截圖如表2所示。
3.2.3 檢測與結(jié)果分析
由于目前拿到的數(shù)據(jù)都是歷史數(shù)據(jù),所以我們對(duì)實(shí)時(shí)檢測程序HmmDetectionJob作了修改,修改sparkstreaming代碼為spark代碼,把數(shù)據(jù)源從kafka讀數(shù)據(jù)修改為從HDFS讀數(shù)據(jù)。
為了測試模型的準(zhǔn)確性及程序的穩(wěn)定性,我們選取第8天的數(shù)據(jù)為研究對(duì)象,用第8天數(shù)據(jù)進(jìn)行檢測。第8天一共13萬條web日志,經(jīng)過檢測告警的有50天,其中30條為有威脅數(shù)據(jù),檢測準(zhǔn)確率為60%。
表1 IIS 日志Tab.1 IIS Logs
表2 建模結(jié)果Tab.2 Modeling results
3.2.4 問題與解決方案
通過對(duì)檢測結(jié)果與模型的對(duì)比分析,我們發(fā)現(xiàn)檢出準(zhǔn)確率還有進(jìn)一步提升的空間,主要原因是建模結(jié)果的準(zhǔn)確率缺失造成的[10-12],原因如下:
1、樣本量偏小
隱馬爾可夫模型是一個(gè)概率模型,樣本量越大、涵蓋的url數(shù)據(jù)類型越多,模型的準(zhǔn)確度越高。而我們這里只用了一周的web日志作為訓(xùn)練數(shù)據(jù),樣本量偏小,需要提高訓(xùn)練模型的數(shù)據(jù)量。
2、訓(xùn)練數(shù)據(jù)中有異常數(shù)據(jù)
通過對(duì)模型中基線分值異常偏低的模型結(jié)果所對(duì)應(yīng)的訓(xùn)練數(shù)據(jù)進(jìn)一步分析,發(fā)現(xiàn)訓(xùn)練數(shù)據(jù)中混入一些異常數(shù)據(jù),主要有以下三種情況:少量未被認(rèn)為篩選出的攻擊行為數(shù)據(jù);中文亂碼數(shù)據(jù);無法處理的加密數(shù)據(jù)。建模前我們需要設(shè)計(jì)一個(gè)過濾模塊,對(duì)這些異常數(shù)據(jù)進(jìn)行過濾。
3、缺少避免模型基線過度偏小的修正模塊
在對(duì)模型基線值profile進(jìn)行訓(xùn)練的過程中,只是簡單的把正常數(shù)據(jù)中評(píng)分最低的值當(dāng)做 profile,而在建模中并沒有加入修正過程。
通過對(duì)相同p_id所對(duì)應(yīng)score的分析,我們發(fā)現(xiàn)score服從正態(tài)分布,利用正態(tài)分布的特性,我們profile 距離score分布的期望3倍方差以內(nèi)為判斷條件,當(dāng)不滿足時(shí),剔除profile 對(duì)應(yīng)的score重新訓(xùn)練,直到滿足條件。
通過對(duì)以上問題的解決,我們最終把檢測準(zhǔn)確率提高了85%以上,并準(zhǔn)確的篩選出大量攻擊行為數(shù)據(jù),部分?jǐn)?shù)據(jù)截圖如表3所示。
表3 攻擊數(shù)據(jù)Table 3 Attact Data
[1] 施仁杰. 馬爾科夫鏈基礎(chǔ)及其應(yīng)用[J]. 西安電子科技大學(xué)出版社, 1992.
[2] 李裕奇, 劉赪編. 隨機(jī)過程(第3版)習(xí)題解答[M]. 國防工業(yè)出版社,2014.09.
[3] 謝逸, 余順. 爭基于Web用戶瀏覽行為的統(tǒng)計(jì)異常檢測[J].軟件學(xué)報(bào), 2007, 18(4):967-977
[4] DH Schneck, S Cherry,D Goodman.Web interface and method for accessing and displaying directory information[M].US, 2001.
[5] I Corona, D Ariu, G Giacinto. HMM-web: a framework for the detection of attacks against web applications[J]. IEEE International Conference on Communications , 2009 , 15 (1):747-752.
[6] 何強(qiáng), 毛士藝, 張有為.多觀察序列連續(xù)隱含馬爾柯夫模型的無溢出參數(shù)重估[J].電子學(xué)報(bào), 2000, 28(10): 98-101.[7] 岳峰, 左旺孟. 基于馬爾可夫隨機(jī)場的彈性掌紋匹配[J].新型工業(yè)化, 2012, 2(2): 52-61.
[8] 朱靖波, 肖桐. 句法統(tǒng)計(jì)機(jī)器翻譯的一些問題分析[J]. 新型工業(yè)化, 2012, 2(1): 1-11.
[9] 張?jiān)? 聶蘭順. 一種BPMN到JPDL的模型轉(zhuǎn)換方法[J].新型工業(yè)化, 2012, 2(1): 23-31.
[10] 張彥. 動(dòng)態(tài)Web 技術(shù)在實(shí)時(shí)監(jiān)測系統(tǒng)中的實(shí)現(xiàn)[J]. 軟件,2013, 34(12): 265.
[11] 劉曉婉, 胡燕祝, 艾新波. 開源中文分詞器在web搜索引擎中的應(yīng)用[J]. 軟件, 2013, 34(3): 80-83.
[12] 黃炳良, 張忠琳. 預(yù)測市場技術(shù)在機(jī)器學(xué)習(xí)中的應(yīng)用[J].軟件, 2014, 35(11): 31-35.
Case Analysis of Web Anomaly Detection Based on Hidden Markov Model
ZHU Li-an
(1. Beijing University of Posts and Telecommunications, Beijing 100876, China;
How to apply data science in the field of network security has been a hot topic, This paper describes how to use the hidden Markov model (HMM) to establish a web parameter model to detect injection attacks. As well as the implementation of this method in an airline, the accuracy rate eventually reached about 80%.
Hidden markov model; Anomaly detection; Implicit sequence; Probability model; Web threat
TP181
A
10.3969/j.issn.1003-6970.2017.11.022
本文著錄格式:朱驪安. 基于隱馬爾可夫模型的web異常檢測案例分析[J]. 軟件,2017,38(11):114-118
朱驪安(1992-),女,研究生,主要研究方向:隨機(jī)排隊(duì)網(wǎng)絡(luò)、物流供應(yīng)鏈管理。