鄒 峰,陳興蜀,羅永剛
(1.四川大學 網絡空間安全學院,四川 成都 610065;2.四川大學 網絡空間安全研究院,四川 成都 610065)
隨著計算機與互聯網技術的發展,如何發現網絡流量、日志、威脅情報等數據中的安全問題,當前一種人機對答的數據分析方式(也可稱作交互式分析)成為了研究熱點。由于網絡攻擊的復雜性,采用固定的分析模型難以發現一些新型的攻擊,此時就需要分析人員探索式地與數據進行交互,將人的認知能力應用到安全分析過程中[1]。網絡流量、日志、威脅情報等數據存在規模大、實時、關聯關系復雜、結構各異等特點,需要找到合適的存儲工具與分析方法來構建交互式分析系統。
本文選擇Elastic Search作為存儲介質,通過在其外部進行擴展的方法,構建了一種網絡安全交互式分析系統。①定義了一種新的語言CSIAL來解釋網絡安全分析的需求,簡化分析人員與數據進行交互的過程,并基于Antlr4對語句進行解析;②根據語句的解析結果來調用Elastic Search的相關API來實現基本的檢索、分組、統計等功能,并通過一些處理方法擴展其不具有的子查詢、連接查詢等功能。根據安全分析的需求提煉出所需功能并總結為自定義的分析語言,通過解析符合該語言語法的語句并調用相應功能對數據進行處理,基于這種思想,達到網絡安全交互式分析的目的。
Elastic Search是當前非常流行的開源分布式全文搜索引擎,通過對海量數據構建索引,能夠快速從中查詢、分析得到所需結果。Elastic Search是基于Lucene的,而Lucene是目前使用最廣泛、最受歡迎、效果最好的一個開源全文搜索架構[2]。在一個最新的非關系型數據庫流行度榜單中(https://db-engines.com/en/ranking),Elastic Search超過Redis排在第二位(僅次于Mongo BD)。面對大規模、實時、復雜、異構的網絡安全相關數據,進行分布式存儲與全文搜索的Elastic Search是最好的選擇之一。基于Elastic Search的ELK(Elastic Search、Logstash、Kibana)框架[3,4]是目前開源社區最活躍的分析框架,其提供了包括數據采集、索引、分析的一整套功能。文獻[4]基于ELK技術棧,實現了能對海量日志進行實時采集和檢索的分析監控系統。文獻[5]中提出一種調用Elastic Search Java API并利用Spring Boot框架來快速簡潔地實現一個交互式平臺的方法。文獻[6]中,提出了一種新的威脅情報技術,通過分析蜜罐日志數據來識別攻擊者的行為,從而確定攻擊模式,并利用ELK技術對日志數據進行分析。
Antlr(another tool for language recognition)作為一款Java編寫的語言識別分析工具,常用于處理符合某種語法規則的文本。Antlr4在Antlr的基礎上增加了語法樹的遍歷功能。文獻[7]中,選取了流系統持續查詢語言CQL(continues query language)中支持監控的查詢語句,結合SQL(struct query language)的語法規則進行了相應的簡化,設計了結構化持續查詢語言CSQL,并使用到Antlr來解析查詢語言來構建系統與用戶交互層的方法。文獻[8]中用到Anltr來解析SQL語句并調用MongoDB API來實現SQL訪問接口的功能。
Apache Calcite[9]是類似于Altlr的另一個基礎軟件框架。與Altlr不同的是,Calcite專門為許多流行的開源數據分析系統提供統一的交互式SQL查詢語言支持,并提供了模塊化的、可擴展的查詢優化器和數百個內置的優化規則。Calcite已被Hive、Drill、Storm等多種平臺所采用。文獻[10]在Apache Calcite和Postgres上實現了一個基于強化學習的連接優化方法。
設計的基于Elastic Search的網絡安全交互式分析系統,總體架構如圖1所示。分析人員在客戶端輸入符合CSIAL語法規則的語句,與Elastic Search中的數據進行交互。

圖1 網絡安全交互式分析系統總體架構
服務端(異步接口層)使用到Netty4框架,開啟端口接收客戶端發來的查詢語句。語句解析層利用Antlr4工具進行語句解析。關聯查詢功能擴展層主要擴展了子查詢與連接查詢的功能。Java API調用層根據語句解析層以及關聯查詢擴展層提交的請求去反復調用Elastic Search的Java API,實現分析數據所需的各種功能。
對Elastic Search中的數據進行分析時,要么需使用其原生的復雜的領域特定語言(domain-specific language,DSL),要么需編程去調用其Java API。
使用Elastic Search原生Rest Ful提供的Json風格的DSL語言語法復雜,每次編寫會花費大量的時間。該Rest Ful接口對外暴露了大量與分析數據無關的功能,若直接對外提供該接口,可能會因分析人員的不當使用而破壞Elastic Search中索引的數據。此外,該DSL語法中缺乏一些安全分析所需的數據關聯等功能。
安全分析人員往往對數據的分析能力較強,但編程能力相對較弱,采用人工編程的方式去實現對網絡安全相關數據的分析,代價較高。因此,直接使用Elastic Search提供的Java API來編程的方法也不適用。
若使用現有的一些語言,如SQL風格的語法,可能會無法實現Elastic Search具有但SQL不具有的功能。
因此,為了方便擴展功能、簡化分析操作,需要一種新的語言來解釋網絡安全交互式分析的需求。
設計實現了一種網絡安全交互式分析語言CSIAL。對于CSIAL的語法設計,主要參考了Elastic Search的基本查詢與分析功能、Splunk的SPL語法、關系型數據庫的SQL語法以及Linux命令。功能見表1。

表1 在CSIAL中所包括的功能
語法中分為Filters、Joins、Groups、Columns、Orders、Rows這6類子句,分別用于描述數據過濾與子查詢、連接、分組、返回字段設置與統計、排序、返回條數設置的功能。具體語法不再贅述。
在程序實現中,為了更容易識別并解析符合某種語法的語句,通常選擇將解析過程拆分為兩個階段:詞法分析與語法分析。詞法分析是一個把字符組成單詞或符號的過程,語法分析是使用詞法分析所得的符號去識別句子結構的過程。一條語句通過上述兩個階段后最終會得到一個語句生成樹的結構,以便于做進一步的解析。
本文使用到Antlr4工具來對CSIAL語句進行解析。語句解析流程如圖2所示。

圖2 語句解析流程
通過.g4文件來定義CSIAL的相關語法規則,并使用Antlr4為其建立相應的程序接口;根據解析需求去實現這些接口,得到所需的詞法分析器、語法分析器、錯誤監聽器、生成樹遍歷器;滿足語法規則的語句通過詞法與語法解析后被處理為語句生成樹;利用遍歷器訪問生成樹的節點,其中采用了遞歸方式來依次遍歷語句生成樹中的長句、短句、單詞、關鍵字等;對匹配到的節點進行相應處理,最終得到語句解析結果,以用于后續對數據的查詢、分析等功能。
關聯查詢在網絡安全交互式分析的很多場景中會用到。但是Elastic Search只能通過嵌套、父子關系、反規范化等特殊方式來進行關聯,這些方式存在消耗索引性能、浪費存儲空間等問題,在面對實時、多源、異構的網絡安全相關數據時并不適用,因此選擇在Elastic Search外部擴展實現更加靈活的關聯查詢功能。主要包括子查詢與連接查詢。
當查詢數據時,需要對某數據集進行過濾,但過濾所需的具體值只能通過另一次查詢得到,此時就會用到子查詢。典型的SQL語句為“SELECT*FROM index1 WHERE x IN(SELECT DISTINCT x FROM index2)”。對于上述語句,Elastic Search實現子查詢功能的方法是:先從index2中進行一次去重統計,得到字段的值的種類,然后將結果封裝生成一個terms查詢,再從index1中獲取最終結果。
已知兩個結構化的數據集都包含某個相同的字段,于是以該字段為鍵,將兩個數據集進行連接,生成一個新數據集,然后可以再對該新數據集進行后續分析操作(如分組、統計、排序等)。這一過程便是連接查詢。連接生成新數據集的算法通常有循環嵌套連接、排序歸并連接、哈希連接等[11]。
實現對Elastic Search多個索引的連接查詢的一種方法:先從2個索引中分別獲取結果;執行連接算法,將2個索引的結果連接生成新數據集;若無后續操作,則直接返回連接結果并結束;若有后續操作,則在Elastic Search中建立新索引,將新數據集以批處理的方式寫入該索引;根據后續操作從新索引中得到最終結果。由于是實時結果,新索引持久保留的價值不大,因此最后需刪除新索引。
上面所述的連接查詢實現流程可分為如下幾部分:從已有索引中查詢數據、執行連接操作生成新數據集、將新數據集寫入Elastic Search的新索引、根據連接查詢的后續操作從新索引中再獲取最終結果。
深入分析可以發現:查詢數據主要由Elastic Search集群本身的性能決定;執行連接操作的復雜度主要由使用的連接算法決定。因此,優化方法選擇從新數據集再次寫入新索引的過程下手。本文選擇了兩個方面來進行優化:
(1)數據寫入時,Elastic Search會解析數據的各個字段,對字段值的內容進行分詞并建立索引。因此減少字段數量與數據大小能有效減少索引的運算操作與磁盤空間,進而有效減少數據的再寫入時間。
本文采取一種從后往前推的方法,根據后續操作(如分組、統計等)得到真正需要使用的字段,于是只需將這些字段添加到新數據集。這種方式很大程度上減少了新數據集的大小,寫入新索引的時間也會減少。例如,有A、B兩個索引,A包括a、b、c、d、e字段,B包括e、f、g、h字段,將A與B按照e字段連接,生成的新數據集按照a字段進行分組,分別統計每個組中g字段的平均值。可以發現這樣一次連接查詢雖然包括a~h共8個字段,但后續只涉及到a、g這2個字段,因此生成的新數據集完全可以只包括這2個字段,字段數量減少了3/4,使得數據量大幅減少,空間上與時間上均得到性能的提升。
(2)在Elastic Search中建立新索引時需要設置該索引的分片數與副本數[12](否則系統會默認分配5個分片與1個副本),分片用于分割索引讓讀寫可以進行并行操作,副本則用于將每個分片完整復制并放到不同硬盤中來保障數據的完整性。采用當前主流的機械硬盤時,若一個Elastic Search集群中的硬盤總數、分片數、副本數分別為Z、m、n,那么能使得索引的讀寫性能最好的平衡點滿足條件Z=m(n+1),此時對索引的進行寫入操作能夠最多達到m的并發量。
通過分析,副本數越少、分片數與副本數乘積越接近Elastic Search集群的總硬盤數時,數據寫入性能越高。而本文所述的連接查詢實現方法中,連接所得的數據為臨時數據,因此副本數完全可以設置為0,而分片數可根據集群情況進行調整。
為了方便收集測試結果,實驗中,除了Elastic Search集群部署于2臺服務器上,其它程序(Netty4服務端程序、Antlr4、API調用程序、算法程序等)均運行于本地Windows10主機。在實際應用中,若將這些程序運行于服務器,效率必然會更高。部分軟件信息見表2。

表2 軟件信息
硬件主要包括本地PC機與兩臺服務器,見表3。

表3 硬件信息
Elastic Search集群的部分配置參數見表4。

表4 對Elastic Search的系統配置參數
使用到Insomnia軟件作為客戶端(對應前面所述的Netty4服務端)進行實驗。使用效果如圖3所示。

圖3 使用Insomnia作為客戶端進行實驗的效果
圖3中左側輸入語句、服務端IP與端口,右側得到返回結果、響應狀態、相應時間等。
為了評價CSIAL語法的復雜性,選擇了4個網絡安全分析需求,將其分別翻譯為CSIAL、SQL以及Elastic Search原生DSL這3種語句,然后用去掉空格與換行符后的字符數進行對比。對比結果如圖4所示。

圖4 幾種語句的字符數對比
從圖中可以看到,4種需求翻譯所得的CSIAL與SQL語句的字符數較為接近,且都遠小于Elastic Search原生DSL語句的字符數,表明CSIAL的語法相比Elastic Search原生DSL更為簡潔,能有效提升安全分析人員的使用效率。
對一條語句的解析主要分為詞法解析、語法解析、錯誤反饋處理、語句生成樹生成幾個階段。為了測試自定義語言的語句解析性能,實驗中以語句的字符數為自變量、解析時間(μs)為因變量進行測試。其中解析時間為從接收到語句到得到解析結果的時間差值。實驗結果如圖5所示。

圖5 語句解析性能
可以看到時間隨著語句的字節大小增加而略微有所提升,平均大致在1 ms左右。由于語句解析過程的耗時極小,在實際使用中,這個時間幾乎可以忽略不計。
連接查詢實驗中自變量選擇的是連接生成的數據條數,因變量為響應時間(ms)。結果如圖6所示。

圖6 連接查詢響應時間與連接后數據條數的關系
連接查詢的實驗結果中可以發現:①響應時間與連接生成結果的數據條數大致呈正比;②優化后的連接查詢,耗時約為優化前的50%~60%,體現出該優化方法的有效性;③在該測試實驗使用的數據與查詢用例中,對于連接生成結果的數據條數達到數十萬條的情況下,對再寫入過程進行優化后的連接查詢,時間能夠控制在1 min以內。
若使用其它數據或用例,實驗的結果可能會有所差異。
本文研究并構建了一種基于Elastic Search的網絡安全交互式分析系統。
定義了一種網絡安全交互式分析語言CSIAL,該語言相比Elastic Search原生DSL語言更為簡潔,能夠顯著簡化安全人員對數據的分析過程。使用到Antlr4工具進行語句解析,實驗結果表明該方法的解析時間可以忽略不計。增加了網絡安全分析所需而Elastic Search缺乏的子查詢、連接查詢等功能,并通過兩個方面對連接過程進行了優化調整,使得相應時間能夠一定程度上滿足需求。
由于只是原型系統,后續工作將著手解決并發控制、可視化等復雜工程問題。