陳敬涵
(四川大學計算機學院,成都610065)
1987年Denning[1]首次提出入侵檢測的概念,在入侵檢測中根據檢測思路的不同,入侵檢測可以分為誤用檢測和異常檢測兩類。誤用檢測假設入侵活動能夠被按某種方式精確編碼,通過分析攻擊者的網絡行為數據,建立起攻擊模型庫,在實際的網絡環境中通過匹配攻擊者的網絡行為與攻擊模型庫來檢測入侵者。由于其必須針對每一個特定攻擊進行分析建模,已知的入侵模式必須手工編碼到系統中,且系統需要不斷地升級維護,導致其工作量大,人為參與度高,在應對不斷更新的攻擊過程中受到了極大的限制。針對誤用檢測的問題,異常檢測從正常的網絡行為入手進行分析,建立網絡用戶的正常行為模型,在檢測過程中通過分析網絡行為偏離正常行為的程度來判斷異常。異常檢測不依賴于具體行為是否出現,并且不需要系統及其安全性缺陷的專門知識,相較于誤用檢測,異常檢測在應對未知攻擊上具有更好的檢測效果與更好適應性,但因為用戶行為是經常改變的,對系統中的所有用戶行為進行全面描述是不可能做到的,所以一定程度上有更高的誤報率,并且在用戶數量多、工作方式易變的環境中,配置和管理的復雜性較高。
異常檢測方法可以分為靜態檢測方法和動態檢測方法兩類[2-4]。靜態的檢測方法基于設定好的閾值,監控當前網絡的觀測參數,如果參數值超出閾值,就認為當前監控的網絡發生異常。動態方法在進行異常檢測時,不僅要監控當前網絡流量的情況,還要參考相鄰時間內網絡流量觀測值的變化。動態檢測方法主要有廣義似然比(GLR)檢測方法[5]、基于指數平滑技術的檢測方法[6]和殘差比異常檢測方法[7]等。
Spark是使用Scala開發的分布計算框架,由于分布式計算過程中會涉及大量的數據集重用。例如,在數據挖掘與機器學習的算法中就會涉及大量的數據集重用。對于此類問題,設計者提出了彈性分布式數據集(Resilient Distributed Dataset,RDD),數據在整個并行計算過程中以RDD的形式緩存于內存中并支持緩存與復用,最大可能的降低了框架I/O,提高了數據處理速度。RDD是一種在分布集群節點上進行分區的只讀對象集合,在集群的分布計算中多節點可共享RDD,其具有局部計算、容錯與可擴展等特性,并支持基于數據集的應用。基于RDD開發者在Spark中提出了內存計算的概念,極大的降低了磁盤的交互讀寫操作?,F階段,RDD緩存粒度較粗,僅支持全部緩存。當內存不足時,Spark調用LRU(Least Recently Used)算法將要替換的RDD緩存到磁盤,并在內存中緩存新的RDD。Spark的迭代分布式內存計算框架,在數據重用度高的應用場景中具有高效性,但由于RDD的不可修改性,在異步更新的應用場景如索引和爬蟲中Spark有一定的局限性。為了提供不同場景下的Spark大數據處理,Spark除了提供MapReduce編程模型之外,還提供了一組工具集包括 SparkSQL、Spark Streaming、MLlib 和GraphX等子模塊。
其中,SparkSQL是在Spark平臺上處理結構化數據的工具。首先,SparkSQL針對多種數據源問題提供了統一的數據源訪問接口,如JSON文件與Apache?Hive表等;其次SparkSQL兼容Hive,復用Hive的元數據,支持Hive的UDF、查詢與數據等;最后SparkSQL提供了一套簡化版的SQL查詢語句提升了數據分析交互性與數據分析的效率。Spark Streaming是Spark平臺上的流式計算工具。首先,Spark Streaming基于Spark API實現,其極大的簡化了流式編程的復雜度,在進行流式編程時可以像普通的批處理程序一樣進行編寫。其次,Spark Streaming將流式計算、批處理、交互式查詢進行了良好的結合,并提供了良好的自動化容錯處理。MLlib是基于Spark編寫的機器學習算法庫,該機器學習庫中包含了常用的聚類、分類、回歸、協同過濾與統計分析等算法。MLlib性能是Hadoop的100倍[6-7]。自Spark0.8版本開始MLlib成為了Spark的一個子模塊。隨著Spark的不斷開發Mllib也在進一步豐富與完善。GraphX是Spark平臺上的圖運算工具。用戶可以通過GraphX在Spark平臺上進行集合運算與圖運算。GraphX相較于GraphLab和Giraph等圖計算框架具有更優的計算性能。
Spark集群主要包含:驅動程序(Driver)與工作節點(Worker)。驅動程序是應用程序的起點,其負責協調集群間工作節點的并行化計算。工作節點主要負責并行化的計算由驅動程序所分配子任務,并將最終的計算結果返回給驅動程序。如圖1所示是Spark運行時狀態:

圖1 Spark運行時狀態
如上圖1所示,當一個任務被提交給Driver時,Driver負責協調啟動多個Worker,Worker將會從本地文件系統或HDFS中讀取數據在集群中進行分區并創建RDD,然后將RDD緩存在內存中。在程序運行過程中Driver將操執行程序傳遞給Worker,協調Worker進行數據處理,當Worker的相應子任務處理結束后,Worker將最后的處理結果返回給Driver完成整個運行過程。
本文提出的異常行為分析系統支持基于安全規則定義的知識庫的導入,支持基于快速多模式匹配技術的大流量網絡環境下的網絡行為特征匹配,實現網絡異常行為監測。異常行為檢測的總體流程如下圖2所示,主要包括數據源、數據緩存與分發、異常行為檢測、結果存儲與展示四個部分。

圖2 異常檢測架構圖
異常行為檢測的數據源為TCP/UDP會話流,將TCP/UDP會話流統稱為Session數據,Session數據來源于Session流量還原程序,由于流量規模較大,系統對實時性要求較高,因此本項目基于Kafka實現數據緩存與分發。為了便于將數據對象作為字節流在不同組件間傳輸,Session對象采用AVRO序列化方式進行處理,Kafka接收端解析AVRO字節流,并將數據傳送給Spark Streaming進行處理。具體實現方式為:Session還原程序作為Kafka系統的producer,通過push模式將消息發布到broker,異常行為檢測模塊作為Kafka系統的 consumer,通過 pull模式從 broker獲取 Session數據。
本文所采用的多數據流聚合的方式如下:stream?ing程序在每個時間間隔內讀取該時間段內的session集合,將session按照上面提到的3個維度進行聚合操作,針對每個聚合操作,提取出對應的統計特征,然后將統計特征與規則列表逐個進行匹配,一旦匹配成功,則認為該會話里違反了規則,根據規則的action進行異常處理,包括 info、warn、error。
異常行為檢測系統主要基于安全策略實現異常行為的檢測。具體地,一條安全策略規則如下所示:

其中,target字段的值只能為“srcip”、“srcip_dstip”、“srcip_dstip_dstport”,filed中的name也是有限制的,基本上充分考慮了所有的統計字段,如果規則不合法,將不會起作用。
本文主要制定了端口掃描、主機掃描、SYN Flood、各類應用暴力破解共四類異常檢測規則,相關代碼為:


本文通過將安全策略導入攻擊檢測模塊,利用相關工具分別模擬了端口掃描、主機探測、SYN Flood以及異常應用訪問,進行了仿真實驗。實驗結果表明,本文提出的基于快速多模式匹配技術的大流量網絡環境下的網絡異常行為監測方法可有效檢測上述異常。
通過基于源IP及目的IP的數據流聚合方式,有效檢測出端口掃描,檢測結果圖3所示。

圖3 端口掃描檢測結果
通過基于源IP及目的IP的數據流聚合,有效進行的主機探測攻擊檢測,檢測結果中包含network-probe的異常告警,以及針對44網段存活主機的端口掃描告警,檢測結果如圖4所示。
通過基于源IP及目的IP的數據流聚合方式,有效檢測出SYN Flood攻擊,檢測結果中包含針對目標主機的syn-flood及port-scan類型告警,因為此次攻擊同時滿足兩類攻擊的規則,檢測結果如圖5所示。
通過基于源IP、目的IP及目的端口的數據流聚合方式,有效檢測出異常應用攻擊檢測,檢測結果中包含針對目標主機的ssh-abnormal-acces、mysql-abnormalaccess、smtp-abnormal-access類型告警,檢測結果如圖6所示。
針對網絡中繞過安全設備安全策略的異常網絡行為檢測問題,本文對異常行為分析與檢測進行了深入研究,提出一種基于安全策略的網絡異常檢測方法。通過該方法可實現對網絡中不符合安全策略的網絡數據流的實時檢測,提高網絡安全實時監測和態勢感知能力。

圖4 主機探測檢測結果

圖5 SYN Flood檢測結果