張路青
(海軍駐中南地區光電系統軍事代表室 武漢 430223)
近年來,隨著互聯網的不斷發展,我國網站數量持續增長而網站所面臨的安全問題也愈發嚴重。圖1是360互聯網絡安全中心給出的每月存在高危漏洞的網站個數。其中,9月掃出的有高危漏洞的網站數最多,達到71964個。雖然通過網站的日志分析,網站管理人員可以清楚地獲取用戶的訪問行為,但是由于網站產生的日志文件較大,數據量較多,包含的數據類型多樣化,文件格式不統一等原因,手工進行日志文件分析需要消耗大量的人力成本和時間成本,因此如何使網站的管理者從繁重的手工分析日志文件工作中解脫出來,能夠有效識別針對網站發起的惡意攻擊行為,并深度檢測網站是否具有潛在的安全漏洞,保障網站業務能夠正常穩定安全的可持續執行,對建設網絡信息安全體系有著極為重要的意義。

圖1 每月存在高危漏洞的網站個數
Web日志挖掘系統的概念由Cooley R首次提出,該系統首先是處理客戶訪問網站所留下的日志信息,并將日志信息中的數據轉換成傳統數據挖掘算法能夠處理執行的數據格式,從而可以采用傳統的挖掘技術進行處理,最終獲得有用的信息。Spiliopoulout提出了一種從Web日志中構造聚集樹的算法,并建立了一個訪問模式挖掘器WUM(Web Utilization Miner),然后使用MINT挖掘語言在WUM中挖掘訪問模式[1]。為了發現攻擊和異常行為,Suneetha K R利用新的預處理技術與改進Apri?ori數組向量算法,提出了一種針對Web日志記錄更加優化的處理方法[2]。
以上研究成果對于Web攻擊數據挖掘技術研究具有很大的指導和借鑒意義。但是其中還存在一些不足之處:缺乏日志數據隱藏關系的發現,致使數據豐富,信息匱乏的現象;目前對Web日志的分析還是以訪問統計及用戶查詢方面較多,缺乏對日志中的孤立點的挖掘以及對日志中各項之間的關聯規則的發現,因此難以達到對Web日志中攻擊數據挖掘的要求。論文則從數據挖掘的角度,研究聚類分析的數據挖掘方法,并在此基礎上繼續展開研究。提出了基于孤立點異常度的攻擊數據挖掘算法,針對Web應用漏洞和攻擊行為建立了檢測模型,并對算法進行了實驗驗證。
Web日志主要是服務器用來將客戶在網上的訪問記錄或在站點上進行的一系列操作的行為記錄保存在服務器的日志文件上,以作為日后處理問題的一個追溯和根據[3]。隨著計算機技術的高速發展和大容量存儲設備的出現,使得Web服務器可以存儲海量的Web日志文件數據。Web日志挖掘就是通過分析日志文件中的記錄可以審查客戶瀏覽Web頁面的模式和執行的操作,進而推斷客戶訪問行為[4]。
如圖2所示是Web日志挖掘的總體流程[5]。

圖2 Web日志挖掘的主要過程
首先通過數據采集從Web服務器中取出所需要的Web日志文件;然后經過數據預處理對這些日志文件進行按要求的處理,往往是刪除冗余數據與系統噪聲,得到的是經過清理之后的會話文件與事務文件;再通過模式發現建立數據項之間的規則或者模式,其中模式發現可以選擇多種不同的分析技術,如關聯分析與聚類分析等;最后采用有用的模式進行分析,挖掘出最終的結果。
由于在數據收集階段采集回來的數據不能保證是完整的,且在結構上存在多種格式,或有許多冗余的數據。針對這個問題,需要先對原始Web日志文件進行數據預處理,將數據轉換成結構化的統一格式,并過濾掉重復的或無用的信息才能提高數據分析的效率。
對于攻擊數據挖掘來說,Web日志數據預處理主要需要進行數據清理、用戶識別、會話識別與路徑補全這四個方面的操作[6]。
2.2.1 數據清理
數據清理主要是指通過填寫缺少的數值、識別或刪除離群點、刪除對挖掘結果無用的數據來“清理”數據。它主要是用來清理數據文件中出現的誤差,以及一些可能對挖掘結果影響較大的特殊值。數據清理需要達到以下幾個目標:格式標準化、異常數據清除、錯誤糾正以及重復數據清除[7]。對Web日志進行數據清理有多種方法,且目的不盡相同,因此需要根據每次挖掘任務的不同,選擇合適的處理方法對Web日志進行清理。
2.2.2 用戶識別
在Web日志數據挖掘之前,需要對用戶進行識別,來確定這些數據是否都來源于同一用戶還是多個用戶。因此可以利用以下的啟發式規則來進行用戶識別:
1)以IP地址來識別用戶。
2)如果IP相同,則以瀏覽器或操作系統版本來識別用戶。
3)如果IP相同,且瀏覽器與操作系統也相同,那么可通過網站的拓撲結構來識別用戶。
2.2.3 會話識別
會話識別是指將用戶的訪問請求按時序進行分片,形成多個相互獨立的序列,每一個會話序列對應著用戶那一段時間內的連續操作,因此研究分片后的會話序列,更有利于發現用戶的訪問模式以及瀏覽愛好,甚至可以察覺哪些會話可能屬于攻擊行為。
基于Web日志請求的用戶會話識別需要設定超時閾值,通常有兩種方法判斷用戶是否開啟了新的會話,第一種是判斷整個會話時間是否已經超時;第二種是判斷兩個請求頁面的時間差是否達到超時閾值。
2.2.4 路徑補全
路徑補全就是對用戶的訪問路徑進行補充,在日志引用不完整的情況下,可以利用網站的拓撲結構來補充路徑[8]。只有構造出完整的用戶訪問路徑,才好分析用戶的行為是否存在惡意攻擊。目前主流的路徑補全算法是利用網站本身的拓撲結構來進行用戶路徑補充,而算法的主要問題是如何判斷用戶瀏覽序列中兩個連續頁面間需要做路徑補充。這里提出一種判斷方法,即:對于同一用戶的連續瀏覽頁面P1、P2,如果P1是P2的引用頁面,則無需做路徑補充;如果P1與P2并無直接相連關系,則說明用戶在瀏覽了P1頁面之后又瀏覽了其他頁面或點擊了回退操作再去瀏覽P2頁面的,這里就需要對P1和P2間做路徑補充。
這里通過尋找匹配父節點來進行路徑補充。即當P1和P2間需要進行路徑補充時,首先判斷P2與P1的父節點是否相同,如果相同,則P1與P2都是通過此父節點訪問的,否則就進一步尋找各自的父節點,并依次比較,直到找到相同的父節點。
經有效處理后的Web日志存有多種HTTP請求信息,這些請求信息包含有很多的參數,而且參數的類型也不完全一樣,可以分為數值型參數和分類型參數兩種。HTTP請求信息主要涉及的參數有HTTP請求方法、服務器返回碼、響應包長度以及URI的各種參數等。將這些屬性設置為HTTP請求的屬性向量,并將它們分成方法屬性、統計屬性以及參數屬性三類,如表1所示。

表1 HTTP請求中各屬性及其類型
聚類分析是將有共同特征的對象實例聚成一類的過程。聚類與分類不同的是,在做聚類分析前并不知道會以何種方式或根據來分類,因此聚類分析的學習過程并不依賴于預先設定的訓練樣本[9]。
典型的聚類分析過程可以分為三步,如圖3所示。

圖3 聚類分析過程
模式表示的是聚類算法的基礎,通過特征提取或選擇用來生成新的簇。
模式相似性是聚類分析的最基本問題,通常通過定義模式間的距離函數或異常度來描述。
聚類劃分是聚類分析的核心,如何將對象劃分到不同的簇中,直接影響到聚類的結果。
孤立點是指數據集中的那些小模式數據,也稱為異常點或離群點。它有可能是測試或執行錯誤時引起的,也可能是數據的某種變異性的結果。目前學術界對孤立點并沒有一個確切的定義,但卻有多種描述性定義。Hawkins給出了其本質性定義:孤立點是在數據集中與眾不同的數據,使人懷疑這些數據并非隨機偏差,而是產生于完全不同的機制[10]。Weisberg將孤立點定義為“數據集中與其他數據不服從于同一統計模型的數據”[11]。
在普通的數據挖掘中,孤立點一般是要被清除掉的,因為它相當于數據中的噪聲,對挖掘結果或多或少會產生影響。不同的是,在對網絡用戶攻擊行為進行數據挖掘時,孤立點反而是必不可少的,一個孤立點就有可能是一種攻擊數據源。目前常用的孤立點挖掘方法大體可分為以下幾類:基于統計學方法、基于距離的方法、基于密度的方法以及基于偏離的方法[12]。
在對于孤立點挖掘算法中,對象間的距離定義是非常重要的。HTTP請求中的對象屬性往往包含多種類型屬性,如表1所示。HTTP請求中的屬性一般可分為數值屬性和分類屬性,其中分類屬性又可以根據數值的類別分為布爾屬性、符號屬性、順序屬性等。因此,在定義距離函數時,不僅要計算不同屬性之間的距離,還得考慮不同屬性的權值問題,以平衡不同屬性對對象的貢獻程度的差異。
給定數據對象集合T,對象p=[p1,p2,…,pn],q=[q1,q2,……qn],p,q∈T。其維度為 n(對象的屬性個數,其中na是數值屬性個數,nb是na分類屬性的個數,n=na+nb)。
定義1 數值屬性的質心為對象各數值屬性值的算數平均值,即:

定義2 分類屬性的質心為對象各分類屬性中取值頻率最高的值的算數平均值,即:

這里假定T中第k(na<k≤n)個分類屬性的取值范圍為{a1,a2,…,an},count(ai)表示屬性k取值為ai的次數,則Fk(ai)表示屬性k取值為ai的頻率。Fm(k)為屬性k中取值最大的頻率,Vk為屬性k中最大頻率出現時的取值,則有:

綜合得到數據集T的質心如式(6)所示:

定義3 對象p在數據集T中的異常度OF(p)為p與數據集T質心的距離。
這里把數據集T的質心看作是一個虛擬的對象o,然后根據多維屬性距離函數計算出對象p的異常度:

算法以URI作為類別標志,把不同的URI聚集在不同的簇中,然后再分別進行孤立點挖掘。對于同一個簇來說,它們擁有相同的URI,并且各個參數也基本相同,選出一些合適的參數作為參考屬性,這樣就構成了一個具有多維屬性的數據對象。
有約束聚類的過程如圖4所示。

圖4 Web日志有約束聚類過程
首先進行Web日志文件初始化,讀入一條記錄并構成一個新的簇,并將該記錄的URI作為這個簇的類別標志,然后再繼續讀入下一條記錄,若此記錄的URI與已經存在的簇的類別標志相同,則將此記錄存入對應的簇中,并更新該簇的各類屬性的質心,否則,以此記錄的URI建立一個新的簇并標志。依次重復之前的操作,直到讀完Web日志文件的每一條記錄,最終完成有約束聚類過程。
基于異常度的孤立點挖掘是針對大量的日志文件來進行的,因此可以引用統計學方法中的中心極限定理,即大量相互獨立的隨機變量,其均值的分布以正態分布為極限。
令隨機變量X服從正態分布,即 X~N(μ,σ2),查表可得知:

從以上結果中可得知,當1≤β≤2時,可以將概率P(X≥μ+βσ)控制在一個很小的范圍內。而在大樣本的情況下,異常度OF(p)可以近似地看做服從正太分布。因此,可以設計挖掘算法如下:
第一步,按照不同的HTTP請求的URI生成有約束的聚類T={T1,T2,…,Ti,…,Tn},并計算各聚類的質心。
第二步,掃描每個聚類Ti,計算Ti中的每個對象p的異常度OF(p)、平均值μ_OF(p)以及標準差σ_OF(p)。如果滿足式(9)則判斷對象p為孤立點。
OF(p)≥ μ_OF(p)+ β*σ_OF(p)????(1 ≤ β ≤ 2)(9)
5.1.1 數據源
測試數據主要來源于兩臺服務器主機的Web日志,一臺采用的Windows2003系統并搭建的Apache服務器,另一臺采用的Centos系統并搭建的Nginx服務器。其中Apache服務器主要搭建的是滲透測試平臺,因此其日志中會存在大量的攻擊數據;Nginx服務器搭建的是常見cms系統,因此其日志中將會以正常數據為主。
5.1.2 測試環境
本機測試環境為系統版本為Windows 7旗艦版,處理器為 Intel(R)Core(TM)i5-2400 CPU@3.10GHz,內存為4G,采用python語言進行算法編程及實驗。
5.1.3 數據預處理
本測試數據并沒有達到海量數據的要求,但也應按規范在數據挖掘前進行數據預處理。比如對于服務器返回狀態碼為206(Partial Content,部分內容)、304(Not Modified,未修改,采用緩存拷貝)、408(Request Timeout,請求超時)這幾種確定不是攻擊數據或對挖掘攻擊數據無幫助的記錄可以事先清理掉。
在預存格式的時候,因為這里主要研究的是基于行為的Web攻擊數據挖掘技術,并無探討到攻擊數據挖掘后的攻擊溯源,所以在測試時,關于IP項以及客戶端瀏覽器信息記錄項都可刪除。
又由于日志記錄本身是按時間進行排序的,在數據預處理統一格式后可以刪除時間項,這樣又可以節省出部分的數據空間。
從服務器日志中提取出20000條日志記錄,其中包含有19120條正常HTTP請求以及890條攻擊數據。根據第四章的基于異常度的孤立點挖掘算法得到檢測結果如表2所示。

表2 基于異常度的孤立點挖掘檢測結果
由表2可以看出,基于異常度的孤立點挖掘算法能夠有效地檢測出攻擊行為,并且檢測率與β的大小成反比,即β越小,檢測率越高,但同時誤報率也越高。通常需要對β進行合理的取值,一般可將β取值1.27左右,既能保證很高的檢測率,而且也僅有5%左右的誤報率。

圖5 針對已知漏洞的檢測率
圖5顯示的是基于孤立點異常度的挖掘算法對已知漏洞的檢測效率圖,給出的890條樣本攻擊數據主要可分為四種類型,即SQL注入攻擊、XSS跨站攻擊、LFI本地文件包含攻擊以及其他攻擊。可以看出針對URI攻擊特征很明顯的XSS跨站攻擊數據與LFI本地文件包含攻擊數據的檢測率極高,僅有個別案例逃過了檢測。同時SQL注入攻擊數據的檢測率也較高,只是一些特殊的或經過精心編碼繞過的攻擊行為未能檢測出來,而其他類型的攻擊有些并不屬于孤立點范疇,則應繼續采用其他的挖掘算法進行輔助測試分析。
文中首先分析了Web日志HTTP請求包信息的特點,利用約束聚類方法對Web日志中的HTTP請求數據進行聚類,并定義了簇的質心,給出了異常度函數計算公式,然后利用統計學的思想,提出了一種利用近似正太分布的檢測模型,研究出基于孤立點異常度的Web攻擊數據挖掘算法。實驗證明該算法對XSS跨站攻擊、LFI本地文件包含攻擊以及常規SQL注入攻擊有較高的檢測率。后續的工作將致力于分布式挖掘研究以應對真實海量的Web日志系統。