陶曉玲, 周理勝, 龔昱鳴
(1.桂林電子科技大學 廣西高校云計算與復雜系統重點實驗室,廣西 桂林 541004;2.桂林電子科技大學 計算機與信息安全學院,廣西 桂林 541004;3.桂林電子科技大學 信息與通信學院,廣西 桂林 541004)
隨著網絡技術的快速發展,安全問題也越來越突出。通常,網絡管理員采用多個網絡安全設備同時上線工作,以應對多樣化的黑客入侵。然而,由于各個網絡安全設備工作時大多處于獨立狀態,很容易導致同一個攻擊事件產生大量的冗余報警現象。報警數據聚合是解決網絡入侵檢測系統產生大量重復報警數據的重要手段,旨在將同一安全事件誘發的大量性質相同或相近的報警合并成一個報警(超報警)[1],能減少報警數據冗余,降低系統誤報率,提高檢測率,從而有利于網絡管理員及時地掌握網絡的運行狀態,也便于后續的報警數據融合和關聯分析。通過改進入侵檢測系統報警數據的讀取方式及處理方法,以提高報警數據聚合方法的檢測性能。
Ahmed等[2]從各個不同學科對報警聚合技術做了全面的綜述,將其分為基于統計數學的聚合技術[3]、基于知識推理的聚合技術[4]、基于數據挖掘的聚合技術[5]和基于哈希函數的聚合技術[6],同時,分別闡述了各類報警聚合技術的優缺點,總結出近年來在聚類和人工神經網絡方法方面的研究趨勢。Elshoush等[7]指出,基于屬性相似度的聚合方法存在不足之處是報警中的時間戳和IP地址等屬性在聚合中具有特殊作用,將其代入運算在一定程度上缺乏合理性。馮學偉等[8]通過報警數據的源/目的IP地址之間的相互關聯關系在各簇內部進行報警聚合,但此方法存在一定缺陷,不適用于處理DDOS等完整攻擊場景。Ghasemigol等[9]指出時間屬性窗口設置過大或過小都會影響報警聚合的有效性。針對此問題,邱輝等[10]將流式處理方法引入滑動時間窗口,從而達到報警數據聚合的目的,但該方法的不足在于當前窗口和滑動窗口的大小仍需主觀確定。Fatma等[5]提到在第二階段使用帶有k-means的SOM算法并不是非常有效,因為管理員需要手動檢驗2個屬性來確定哪個簇包含真正的報警頻率和時間間隔的報警數據。Thang等[11]基于密度的方法,將報警集合的高密度區域劃分為一個類,能夠發現任意形狀的類,且聚類精度較高,但對輸入參數敏感。Banumohamed等[6]從報警數據中提取3個屬性,并將這些屬性結合MD5散列函數生成用于初始聚類過程的唯一哈希值,但這種技術是基于字符串散列值的比較而不是直接的字符比較,通常需要對文本進行預處理。Saad等[12]為不同的攻擊類型設置不同的閾值,采用順序聚類的方法,將相似度高于閾值的報警進行合并,操作簡單,適用范圍廣,但具有較強的次序依賴性和缺乏靈活性。
綜上所述,目前的報警數據聚合方法在讀取數據時均采用順序讀取方式,處理方法單一,缺乏靈活性,從而影響聚合效果。為此,提出角標隨機讀取來實現Snort報警數據聚合。
不同的IDS系統產生的報警數據格式不同,若直接聚合分析,將造成很大不便。基于此,必須對報警數據進行統一的標準化,方便后續的聚合處理。借鑒國際標準入侵檢測消息交換格式IDMEF(intrusion detection message exchange format)來規范IDS入侵檢測報警格式。目前大多數的安全檢測系統都支持IDMEF格式報警的輸出。一個Snort報警數據包括規則號、規則名稱、優先級別、時間戳、原始IP、目的IP、協議類型、源端口、目的端口、報警類別等10種屬性構成的10元組,形式化Alert={signature,sig_name,sig_priority,timestamp,ip_src,ip_dst,ip_proto,layer4_sport,layer4_dport,sig_class_id},本研究以每個報警數據包代表每條報警數據,其每個屬性的含義如表1所示。

表1 報警數據屬性含義
報警數據的預處理從傳感器采集到的原始報警數據出發,采用數據清理、屬性選擇和數據過濾等方法來初步消除原始報警數據本身的缺陷,從中抽取能夠用于聚合的主要屬性并存儲在數據庫中,最后通過設置計數迭代式固定時間閾值過濾的方法,減少重復報警數據的數量。其中,重復報警數據是每2條報警數據間除了時間屬性之外其他屬性內容均相同的報警數據,其參數符號說明如表2所示。

表2 參數符號說明表
以下給出了計數迭代式固定時間閾值預處理方法的具體偽代碼。
algorithm:SnortAlertProcessingByFilter(A,time,count,timeDiff,N)
Input:alert set in uniform formatA={n∈N,a1,a2,…,an};
Output:AlertByFilterB={n∈N,b1,b2,…,bn};
1. Begin
2. for (n=0;j 3. time=0 4. ifA=φthen 5. break 6. else 7. while new two alertai,ai+1is received do 8. if(timeDiff(ai,ai+1)<60) andai_attributes=ai+1_attributesthen 9. delete(ai+1) 10. B.add(ai) 11. count=count +1 12. else 13. B.add(ai), B.add(ai+1) 14. time ++ 15. if (time=1) 16. then FileReader(“AlertByFilter.txt”) 17. else FileReader(“AlertByFilter”+(time-1)+”.txt”) 18. end 由偽代碼可知,計數迭代式固定時間閾值預處理過程分為4個階段:1)對需預處理的Snort報警數據進行集合封裝(表3的Input部分)。 2)從本地數據庫的相關Snort表進行join操作,生成所需的報警數據表,同時,對整個Snort報警數據文本進行每2條順序讀取加載,若讀取到最后一行,則直接跳出循環,否則一一加載到集合(偽代碼的第1~6行)。 3)將報警數據記錄按照指定的時間屬性升序排序,在排序后的數據集上移動一個60 s的固定大小時間窗口,每次只檢測timeDiff小于窗口內的報警數據。判定它們是否匹配,以此來逐步減少比較次數,從而達到初步預處理過濾的目的(偽代碼的第7~13行)。 4)以計數迭代不斷循環比較出最精簡記錄的方式,使得重復率達到最低(偽代碼的第14~17行)。 角標隨機讀取方法用于將精簡后的中間Snort報警數據以隨機生成角標的方式達到每條報警數據隨機打散排列的目的。算法用到的相關參數符號如表3所示。 表3 角標隨機讀取算法參數符號說明表 以下給出了角標隨機讀取方法的具體偽代碼。 algorithm:CMRR(B,Q,M,I,N,R) Input:AlertProcessingByFilterB={n∈N|b1,b2,…,bn}; Output:AlertByCMRRC={n∈N|c1,c2,…,cn}; 1. Begin 2. forn=0 toN-1 3. ifB=φthen 4. break 5. else 6. Collections.sort(B(Snort),newComparator 7. Public int compare(Snort s1,Snort s2) 8. return s1.getTimeStamp().compareTo(s2.getTimeStamp()) 9.Q(B(Snort))=getSnortsWithMonth(B(Snort)) 10. fori=0 toQ.size 11.I(i)=getRandomIndex(Q[i]) 12.M(i)=getRandomSnortsByMonth(I(i)) 13.R.add(M(j)) 14. returnR(Snort) 15. End 由偽代碼可知,基于角標隨機讀取方法的過程分為3個階段: 1) 對精簡后的Snort報警數據進行集合封裝(偽代碼Input部分)。 2) 對整個Snort報警數據文本進行逐條順序讀取加載,若讀取到最后一行,則直接跳出循環,否則一一將加載到集合(偽代碼的第1~5行)。 3) 對數據按照時間屬性進行升序排序和分月份劃段處理,再對每個月內的數據進行隨機打散排列。 其中,先將每個月內隨機打散后的中間報警數據用M集合存儲,再統一用R集合重新存儲,得到最后的報警數據(偽代碼的第6~14行)。其中,每遍歷一次,取2條報警數據所在行號,得到生成的隨機數與角標標記區進行比較,若第一次出現,則將其存入并退出當層循壞,否則重新生成隨機數取值再進行比較。 報警數據相似度計算是一種基于各屬性之間幾何距離的簡單數值運算,是數據聚合的基礎。報警數據聚合方法的目標是對初級報警進行數據聚合,找到它們之間的關聯性,從而生成高級報警,消除重復報警。 給出各個Snort報警數據屬性特征的相似度計算函數。 1) 報警標識相似度的計算。signature,sig_priority,ip_proto,lay4_sport,lay4_dport若相同,則相似度設為0,若不相同,則相似度為1。 2) 報警名稱相似度的計算。sig_name對應于每條報警規則語句里的Msg,如將從每條報警數據該屬性對應的字符串Snort Alert[1∶2 000 419∶0]值中提取2 000 419,考慮自身數據特點,得知介于區間[2 000 334,2 221 030]和[2 400 001,2 522 312],基于此,結合Tableau工具,統計此屬性的特點,計算出相似度值,其計算公式設置為 Simname(Alerti,Alertj)= (1) 其中:Simname(Alerti,Alertj)是報警數據的名稱相似度值;Alerti和Alertj分別表示第i條和第j條報警數據;Alert.signame是報警數據的名稱屬性。 3) 報警時間戳相似度的計算。在報警聚合中報警時間是很重要的一個因素,對計算全局相似度的時候具有重要的影響。將時間間隔Tinternal與預設的最小閾值tmin及最大閾值tmax進行比較,當時間間隔小于tmin,則相似度為0,大于tmax,則相似度為1,若在tmin和tmax之間,則由公式計算得到。tmin和tmax的選取,不同參考文獻給出不同的數值。參考Long等[13],給出tmax-tmin=300 s及實際情況將閾值計算公式為 Simtimestamp(Alerti,Alertj)= (2) 其中:Simtimestamp(Alerti,Alertj)是報警數據時間戳的相似度值;Alerti和Alertj分別表示第i條和第j條報警數據;Alert.signame是報警數據的名稱屬性。 4) IP地址相似度的計算。對于IP地址的比較,采用無類別域間路由的格式進行分析,將每2條報警數據相同的二進制位個數r除以IP地址二進制位長度的值作為2個IP地址的相似度[14],其計算公式設置為 (3) 其中:Simip(Alerti,Alertj)是報警數據的IP相似度值;Alerti和Alertj分別表示第i條和第j條報警數據。 通常對于報警數據屬性權重的確定計算方法,一般來說有2大類:一類是人為的主觀判斷對不同屬性打分,比如基于一些專家的結論來進行打分,根據層次不同來進行分析、認為經驗來進行判斷等;另一類是客觀方法,如熵權計算方法、主成分分析方法等。因在評標過程中,不同屬性的權重對被評價對象的不同得分影響非常大,因此需要盡可能客觀去評價和打分,所以,通過客觀計算法計算屬性的權重是優先考慮的。同時,考慮到一般采用PCA需要數據比較,難獲取且存在相關及多重共線性問題,同時,它并不考慮因變量和自變量之間的關系,無法充分體現每個主成分的作用,因此選用熵值法來確定各個指標的權重計算。 報警數據能否聚合關鍵取決于報警數據之間的全局相似度,在計算全局相似度時,需為每種報警屬性設置一個權重W,用來衡量該屬性在計算全局相似度中的重要性。通過MATLAB 2016計算得知,權重矩陣為[ 0.000 1 0.045 2 0.013 0 0.047 1 0.000 5 0.004 6 0.035 3 0.272 1 0.582 1]。 Simsum(Alerti,Alertj)= (4) 其中:Simsum(Alerti,Alertj)為報警數據的總相似度;i,j為屬性權重時報警數據所在的行號;c為報警數據的屬性所在的列號;Wc為報警數據各個屬性的權重;Alert(i)attributes和Alert(j)attributes分別為第i條和第j條報警數據的每個屬性的集合;n為報警數據的條數。 由于Snort收集到的大量報警數據中存在重復冗余數據,通過設置較高期望值可有效去除一定的冗余,達到進一步精簡報警數據目的。Snort聚合計算用到的相關參數符號如表4所示。 表4 Snort聚合計算參數符號說明表 以下給出了Snort聚合計算的具體偽代碼。 algorithm:SADAA(S,W,SW,H,a,b) Input:AlertBySW SW={n∈N|Sw1,Sw2,…,Swn}; Output:AlertBySADAAE={n∈N|e1,e2,…,en}; 1. Begin 2. forn=0 toN-1 3. if SW=φthen 4. break 5. else 6. fori=0 to SW.size 7. for(H=0.1 to 0.9) 8. if getSumSim(SS(i)) >Ha++; 9. elseb++; 10. computeAggregation(); 11.End 由偽代碼可知,分為4個階段: 1) 對計算總相似度后的Snort報警數據進行集合封裝(偽代碼的Input部分)。 2) 對整個Snort報警數據文件進行逐條順序讀取加載,若讀取到最后一行,則直接跳出循環,否則一一將加載到集合(偽代碼的1~5行)。 3) 讀取指定的每條報警數據總相似度屬性列的內容,分別與期望閾值集合進行比較,并統計滿足條件的報警條數(偽代碼的6~9行)。 4) 進行聚合函數計算(偽代碼的第10行)。 為了驗證提出的基于角標隨機讀取的Snort報警數據聚合方法的有效性,實驗室搭建了真實的數據采集平臺,環境為OSSIM開源平臺下的Snort分布式入侵檢測系統。實驗整體采集環境拓撲圖如圖1所示。 圖1 數據采集平臺拓撲圖 通過搭建入侵檢測系統Snort并配合搭建LMAP、PHP、PEAR、ADOdb、BASE、HTML、MySQL、Libdnet、Libpcap、DAQ、Barnyard2的環境來直接對采集到的報警數據進行預先查看和分析。系統搭建完成后,通過BASE登錄,將實時監控網絡數據包,并通過數據庫輸出接口將入侵日志傳送到MySQL數據庫中,數據分析控制臺則可通過數據庫接口讀取數據,并顯示在BASE上。 數據預處理環境為:Win 10 + VMware Workstation 12 + CentOS 6.5 + Snort 2.9.7.0 + Barnyard 2.1.13+ Base 1.4.5 + MySQL5.1.73 + Eclipse Mars。數據屬性相似度及權重計算環境為:Win 10 + Eclipse Mars。數據聚合及系統評價指標環境為:Win10 + Eclipse Mars + JDK1.8 + Matlab2016 + IBM SPSS Statistics 24。 利用數據庫的輸出插件Barnyard2,將采集到的報警數據記入到數據庫MySQL。通過在OSSIM環境下部署snort-agent1到snort-agent4共4個數據采集節點,snort-server作為服務端節點??偣膊杉疭nort報警數據63 306條。以每個Snort報警數據類別屬性為分析基礎,進一步細化得到的分類結果如表5所示。 表5 原始Snort報警數據分類表 采用計數迭代式固定時間閾值預處理過程的方式來對報警數據進行預處理,將原始報警數據集A進行數據標準化,對其以time計數迭代來不斷循環,達到控制每相鄰報警數據間的比較目的,將timeDiff小于設定窗口值內的重復報警數據精簡到最低。 為了衡量報警數據預處理的效果,實驗分析中定義報警數據精簡率來作為評價標準。假設原始報警數量為srcsnort個,精簡后報警為dstsnort個,其報警數據精簡率公式為 (5) ReduceRatesnort用來反映聚合方法消除重復和冗余報警的效率,ReduceRatesnort越大,表示精簡越高,也就說明報警冗余去除的效果越明顯,提供給下一層數據聚合處理的數據源質量也就更高。精簡前后各類別的Snort報警數量分別如圖2和圖4所示,精簡前后各類別的Snort報警數量占比情況分別如圖3和圖5所示。 圖2 精簡前各類別的Snort報警數量 圖3 精簡前各類別的Snort報警數量占比 圖4 精簡后各類別的Snort報警數量 圖5 精簡后各類別的Snort報警數量占比 通過實驗結果得到srcsnort為63 306條,dstsnort為22 162條,總的報警精簡率為65%。 為了驗證提出方法的有效性,將本方法與文獻[15]的方法進行對比,通過訓練取期望值H在不同值時聚合效果對比,結果如圖6所示。從圖6可看出,在H<0.6時,聚合率均低于50%,且有小幅上升,在0.7≤H≤0.9時,聚合率維持在90%左右并保持平穩。同時,期間發生了一次較大幅度的增長跳躍變化,通過分析,變動期望值可以將相似度較高的報警數據合并為一類,從而進行下一步分析,由此生成超報警信息庫,因而將期望值設為0.7。 圖6 不同期望值下Snort報警數據聚合率對比 由此可見,在一定程度上本方法從反向思維來計算報警數據屬性相似度,相比常規手段的順序聚合而言,更能使得聚合率提高并維持平穩。 同時,為了驗證所提方法的有效性,還定義了誤報率和檢測率來作為評價系統檢測性能的指標。基于此,根據以下規則對收集到的報警數據進行了標定。 如果一條報警數據滿足[15]以下3個條件: 1) 源IP地址符合模擬的攻擊IP地址; 2) 目的IP地址符合模擬攻擊的受害機IP地址; 3) 報警的時間戳在模擬攻擊所發生的時間窗之內。 則該條報警被標記為真報警,否則就被稱為誤報警。 經標定后,數據集含有45 002條真報警和18 004條誤報警。以70%隨機抽取作為訓練數據集,30%作為測試數據集。類似Pietraszek[15]定義的反映報警處理性能的指標,給出了一個混合矩陣C,如表6所示,表中“+”代表真報警(攻擊報警),“-”代表誤報警。 表6 混合矩陣C 基于此,定義一組反映報警處理性能的指標。 Snort報警數據檢測系統的系統檢測率(TPsnort)計算公式為 TPsnort=C11+C22/(C11+C12+C21+C22)。 (6) Snort報警數據檢測系統的系統誤報率(FPsnort)計算公式為 FPsnort=C21/(C21+C22)。 (7) 使用SPSS里的CHAID樹算法作為Snort報警數據檢測系統的檢測方法,系統分別采用本方法(簡稱方法1)和文獻[13]的聚合方法(簡稱方法2)進行檢測性能比較。兩者的系統檢測率和誤報率對比情況如表7所示。 表7 系統檢測率與誤報率對比 % 由表7可知,方法1的檢測率為89.64%,高出方法2的檢測率13%左右,在一定程度上說明對真報警還是誤報警的判定有著明顯的作用,而且誤報率也有所降低。 同時,為了對比2種方法的運行效率,定義了系統檢測平均運行時間為 TA=T/n。 (8) 其中:T為檢測方法運行的總時間;n為測試數據樣本總數。2種方法的平均運行時間對比如表8所示。 表8 平均運行時間對比 由表8可知,方法1比方法2的系統檢測平均運行時間略少,可以稍微加快系統檢測運行效率。 針對現有的Snort報警數據聚合方法中報警數據讀取方法單一,進而影響聚合效果的問題,提出了一種基于角標隨機讀取的Snort報警數據聚合方法。該方法通過角標隨機讀取算法實現報警數據隨機打散讀取,并靈活計算屬性相似度。實驗結果表明,提出的方法有效地提高了Snort報警數據的聚合率,而且提高了入侵檢測系統的檢測性能。針對動態復雜情況下持續性攻擊引發的多個報警事件時間間隔變化的問題,如何進一步有效地提高報警數據聚合效果,將是后續研究的主要內容。1.3 角標隨機讀取算法設計

1.4 屬性相似度的計算

1.5 屬性權重的確定
1.6 聚合計算

2 相關工作實驗及結果分析
2.1 實驗環境


2.2 預處理結果及分析




2.3 聚合結果及分析




3 結束語