鄒 峰,陳興蜀,羅永剛
(1.四川大學 網(wǎng)絡空間安全學院,四川 成都 610065;2.四川大學 網(wǎng)絡空間安全研究院,四川 成都 610065)
隨著計算機與互聯(lián)網(wǎng)技術(shù)的發(fā)展,如何發(fā)現(xiàn)網(wǎng)絡流量、日志、威脅情報等數(shù)據(jù)中的安全問題,當前一種人機對答的數(shù)據(jù)分析方式(也可稱作交互式分析)成為了研究熱點。由于網(wǎng)絡攻擊的復雜性,采用固定的分析模型難以發(fā)現(xiàn)一些新型的攻擊,此時就需要分析人員探索式地與數(shù)據(jù)進行交互,將人的認知能力應用到安全分析過程中[1]。網(wǎng)絡流量、日志、威脅情報等數(shù)據(jù)存在規(guī)模大、實時、關(guān)聯(lián)關(guān)系復雜、結(jié)構(gòu)各異等特點,需要找到合適的存儲工具與分析方法來構(gòu)建交互式分析系統(tǒng)。
本文選擇Elastic Search作為存儲介質(zhì),通過在其外部進行擴展的方法,構(gòu)建了一種網(wǎng)絡安全交互式分析系統(tǒng)。①定義了一種新的語言CSIAL來解釋網(wǎng)絡安全分析的需求,簡化分析人員與數(shù)據(jù)進行交互的過程,并基于Antlr4對語句進行解析;②根據(jù)語句的解析結(jié)果來調(diào)用Elastic Search的相關(guān)API來實現(xiàn)基本的檢索、分組、統(tǒng)計等功能,并通過一些處理方法擴展其不具有的子查詢、連接查詢等功能。根據(jù)安全分析的需求提煉出所需功能并總結(jié)為自定義的分析語言,通過解析符合該語言語法的語句并調(diào)用相應功能對數(shù)據(jù)進行處理,基于這種思想,達到網(wǎng)絡安全交互式分析的目的。
Elastic Search是當前非常流行的開源分布式全文搜索引擎,通過對海量數(shù)據(jù)構(gòu)建索引,能夠快速從中查詢、分析得到所需結(jié)果。Elastic Search是基于Lucene的,而Lucene是目前使用最廣泛、最受歡迎、效果最好的一個開源全文搜索架構(gòu)[2]。在一個最新的非關(guān)系型數(shù)據(jù)庫流行度榜單中(https://db-engines.com/en/ranking),Elastic Search超過Redis排在第二位(僅次于Mongo BD)。面對大規(guī)模、實時、復雜、異構(gòu)的網(wǎng)絡安全相關(guān)數(shù)據(jù),進行分布式存儲與全文搜索的Elastic Search是最好的選擇之一?;贓lastic Search的ELK(Elastic Search、Logstash、Kibana)框架[3,4]是目前開源社區(qū)最活躍的分析框架,其提供了包括數(shù)據(jù)采集、索引、分析的一整套功能。文獻[4]基于ELK技術(shù)棧,實現(xiàn)了能對海量日志進行實時采集和檢索的分析監(jiān)控系統(tǒng)。文獻[5]中提出一種調(diào)用Elastic Search Java API并利用Spring Boot框架來快速簡潔地實現(xiàn)一個交互式平臺的方法。文獻[6]中,提出了一種新的威脅情報技術(shù),通過分析蜜罐日志數(shù)據(jù)來識別攻擊者的行為,從而確定攻擊模式,并利用ELK技術(shù)對日志數(shù)據(jù)進行分析。
Antlr(another tool for language recognition)作為一款Java編寫的語言識別分析工具,常用于處理符合某種語法規(guī)則的文本。Antlr4在Antlr的基礎(chǔ)上增加了語法樹的遍歷功能。文獻[7]中,選取了流系統(tǒng)持續(xù)查詢語言CQL(continues query language)中支持監(jiān)控的查詢語句,結(jié)合SQL(struct query language)的語法規(guī)則進行了相應的簡化,設(shè)計了結(jié)構(gòu)化持續(xù)查詢語言CSQL,并使用到Antlr來解析查詢語言來構(gòu)建系統(tǒng)與用戶交互層的方法。文獻[8]中用到Anltr來解析SQL語句并調(diào)用MongoDB API來實現(xiàn)SQL訪問接口的功能。
Apache Calcite[9]是類似于Altlr的另一個基礎(chǔ)軟件框架。與Altlr不同的是,Calcite專門為許多流行的開源數(shù)據(jù)分析系統(tǒng)提供統(tǒng)一的交互式SQL查詢語言支持,并提供了模塊化的、可擴展的查詢優(yōu)化器和數(shù)百個內(nèi)置的優(yōu)化規(guī)則。Calcite已被Hive、Drill、Storm等多種平臺所采用。文獻[10]在Apache Calcite和Postgres上實現(xiàn)了一個基于強化學習的連接優(yōu)化方法。
設(shè)計的基于Elastic Search的網(wǎng)絡安全交互式分析系統(tǒng),總體架構(gòu)如圖1所示。分析人員在客戶端輸入符合CSIAL語法規(guī)則的語句,與Elastic Search中的數(shù)據(jù)進行交互。
圖1 網(wǎng)絡安全交互式分析系統(tǒng)總體架構(gòu)
服務端(異步接口層)使用到Netty4框架,開啟端口接收客戶端發(fā)來的查詢語句。語句解析層利用Antlr4工具進行語句解析。關(guān)聯(lián)查詢功能擴展層主要擴展了子查詢與連接查詢的功能。Java API調(diào)用層根據(jù)語句解析層以及關(guān)聯(lián)查詢擴展層提交的請求去反復調(diào)用Elastic Search的Java API,實現(xiàn)分析數(shù)據(jù)所需的各種功能。
對Elastic Search中的數(shù)據(jù)進行分析時,要么需使用其原生的復雜的領(lǐng)域特定語言(domain-specific language,DSL),要么需編程去調(diào)用其Java API。
使用Elastic Search原生Rest Ful提供的Json風格的DSL語言語法復雜,每次編寫會花費大量的時間。該Rest Ful接口對外暴露了大量與分析數(shù)據(jù)無關(guān)的功能,若直接對外提供該接口,可能會因分析人員的不當使用而破壞Elastic Search中索引的數(shù)據(jù)。此外,該DSL語法中缺乏一些安全分析所需的數(shù)據(jù)關(guān)聯(lián)等功能。
安全分析人員往往對數(shù)據(jù)的分析能力較強,但編程能力相對較弱,采用人工編程的方式去實現(xiàn)對網(wǎng)絡安全相關(guān)數(shù)據(jù)的分析,代價較高。因此,直接使用Elastic Search提供的Java API來編程的方法也不適用。
若使用現(xiàn)有的一些語言,如SQL風格的語法,可能會無法實現(xiàn)Elastic Search具有但SQL不具有的功能。
因此,為了方便擴展功能、簡化分析操作,需要一種新的語言來解釋網(wǎng)絡安全交互式分析的需求。
設(shè)計實現(xiàn)了一種網(wǎng)絡安全交互式分析語言CSIAL。對于CSIAL的語法設(shè)計,主要參考了Elastic Search的基本查詢與分析功能、Splunk的SPL語法、關(guān)系型數(shù)據(jù)庫的SQL語法以及Linux命令。功能見表1。
表1 在CSIAL中所包括的功能
語法中分為Filters、Joins、Groups、Columns、Orders、Rows這6類子句,分別用于描述數(shù)據(jù)過濾與子查詢、連接、分組、返回字段設(shè)置與統(tǒng)計、排序、返回條數(shù)設(shè)置的功能。具體語法不再贅述。
在程序?qū)崿F(xiàn)中,為了更容易識別并解析符合某種語法的語句,通常選擇將解析過程拆分為兩個階段:詞法分析與語法分析。詞法分析是一個把字符組成單詞或符號的過程,語法分析是使用詞法分析所得的符號去識別句子結(jié)構(gòu)的過程。一條語句通過上述兩個階段后最終會得到一個語句生成樹的結(jié)構(gòu),以便于做進一步的解析。
本文使用到Antlr4工具來對CSIAL語句進行解析。語句解析流程如圖2所示。
圖2 語句解析流程
通過.g4文件來定義CSIAL的相關(guān)語法規(guī)則,并使用Antlr4為其建立相應的程序接口;根據(jù)解析需求去實現(xiàn)這些接口,得到所需的詞法分析器、語法分析器、錯誤監(jiān)聽器、生成樹遍歷器;滿足語法規(guī)則的語句通過詞法與語法解析后被處理為語句生成樹;利用遍歷器訪問生成樹的節(jié)點,其中采用了遞歸方式來依次遍歷語句生成樹中的長句、短句、單詞、關(guān)鍵字等;對匹配到的節(jié)點進行相應處理,最終得到語句解析結(jié)果,以用于后續(xù)對數(shù)據(jù)的查詢、分析等功能。
關(guān)聯(lián)查詢在網(wǎng)絡安全交互式分析的很多場景中會用到。但是Elastic Search只能通過嵌套、父子關(guān)系、反規(guī)范化等特殊方式來進行關(guān)聯(lián),這些方式存在消耗索引性能、浪費存儲空間等問題,在面對實時、多源、異構(gòu)的網(wǎng)絡安全相關(guān)數(shù)據(jù)時并不適用,因此選擇在Elastic Search外部擴展實現(xiàn)更加靈活的關(guān)聯(lián)查詢功能。主要包括子查詢與連接查詢。
當查詢數(shù)據(jù)時,需要對某數(shù)據(jù)集進行過濾,但過濾所需的具體值只能通過另一次查詢得到,此時就會用到子查詢。典型的SQL語句為“SELECT*FROM index1 WHERE x IN(SELECT DISTINCT x FROM index2)”。對于上述語句,Elastic Search實現(xiàn)子查詢功能的方法是:先從index2中進行一次去重統(tǒng)計,得到字段的值的種類,然后將結(jié)果封裝生成一個terms查詢,再從index1中獲取最終結(jié)果。
已知兩個結(jié)構(gòu)化的數(shù)據(jù)集都包含某個相同的字段,于是以該字段為鍵,將兩個數(shù)據(jù)集進行連接,生成一個新數(shù)據(jù)集,然后可以再對該新數(shù)據(jù)集進行后續(xù)分析操作(如分組、統(tǒng)計、排序等)。這一過程便是連接查詢。連接生成新數(shù)據(jù)集的算法通常有循環(huán)嵌套連接、排序歸并連接、哈希連接等[11]。
實現(xiàn)對Elastic Search多個索引的連接查詢的一種方法:先從2個索引中分別獲取結(jié)果;執(zhí)行連接算法,將2個索引的結(jié)果連接生成新數(shù)據(jù)集;若無后續(xù)操作,則直接返回連接結(jié)果并結(jié)束;若有后續(xù)操作,則在Elastic Search中建立新索引,將新數(shù)據(jù)集以批處理的方式寫入該索引;根據(jù)后續(xù)操作從新索引中得到最終結(jié)果。由于是實時結(jié)果,新索引持久保留的價值不大,因此最后需刪除新索引。
上面所述的連接查詢實現(xiàn)流程可分為如下幾部分:從已有索引中查詢數(shù)據(jù)、執(zhí)行連接操作生成新數(shù)據(jù)集、將新數(shù)據(jù)集寫入Elastic Search的新索引、根據(jù)連接查詢的后續(xù)操作從新索引中再獲取最終結(jié)果。
深入分析可以發(fā)現(xiàn):查詢數(shù)據(jù)主要由Elastic Search集群本身的性能決定;執(zhí)行連接操作的復雜度主要由使用的連接算法決定。因此,優(yōu)化方法選擇從新數(shù)據(jù)集再次寫入新索引的過程下手。本文選擇了兩個方面來進行優(yōu)化:
(1)數(shù)據(jù)寫入時,Elastic Search會解析數(shù)據(jù)的各個字段,對字段值的內(nèi)容進行分詞并建立索引。因此減少字段數(shù)量與數(shù)據(jù)大小能有效減少索引的運算操作與磁盤空間,進而有效減少數(shù)據(jù)的再寫入時間。
本文采取一種從后往前推的方法,根據(jù)后續(xù)操作(如分組、統(tǒng)計等)得到真正需要使用的字段,于是只需將這些字段添加到新數(shù)據(jù)集。這種方式很大程度上減少了新數(shù)據(jù)集的大小,寫入新索引的時間也會減少。例如,有A、B兩個索引,A包括a、b、c、d、e字段,B包括e、f、g、h字段,將A與B按照e字段連接,生成的新數(shù)據(jù)集按照a字段進行分組,分別統(tǒng)計每個組中g(shù)字段的平均值。可以發(fā)現(xiàn)這樣一次連接查詢雖然包括a~h共8個字段,但后續(xù)只涉及到a、g這2個字段,因此生成的新數(shù)據(jù)集完全可以只包括這2個字段,字段數(shù)量減少了3/4,使得數(shù)據(jù)量大幅減少,空間上與時間上均得到性能的提升。
(2)在Elastic Search中建立新索引時需要設(shè)置該索引的分片數(shù)與副本數(shù)[12](否則系統(tǒng)會默認分配5個分片與1個副本),分片用于分割索引讓讀寫可以進行并行操作,副本則用于將每個分片完整復制并放到不同硬盤中來保障數(shù)據(jù)的完整性。采用當前主流的機械硬盤時,若一個Elastic Search集群中的硬盤總數(shù)、分片數(shù)、副本數(shù)分別為Z、m、n,那么能使得索引的讀寫性能最好的平衡點滿足條件Z=m(n+1),此時對索引的進行寫入操作能夠最多達到m的并發(fā)量。
通過分析,副本數(shù)越少、分片數(shù)與副本數(shù)乘積越接近Elastic Search集群的總硬盤數(shù)時,數(shù)據(jù)寫入性能越高。而本文所述的連接查詢實現(xiàn)方法中,連接所得的數(shù)據(jù)為臨時數(shù)據(jù),因此副本數(shù)完全可以設(shè)置為0,而分片數(shù)可根據(jù)集群情況進行調(diào)整。
為了方便收集測試結(jié)果,實驗中,除了Elastic Search集群部署于2臺服務器上,其它程序(Netty4服務端程序、Antlr4、API調(diào)用程序、算法程序等)均運行于本地Windows10主機。在實際應用中,若將這些程序運行于服務器,效率必然會更高。部分軟件信息見表2。
表2 軟件信息
硬件主要包括本地PC機與兩臺服務器,見表3。
表3 硬件信息
Elastic Search集群的部分配置參數(shù)見表4。
表4 對Elastic Search的系統(tǒng)配置參數(shù)
使用到Insomnia軟件作為客戶端(對應前面所述的Netty4服務端)進行實驗。使用效果如圖3所示。
圖3 使用Insomnia作為客戶端進行實驗的效果
圖3中左側(cè)輸入語句、服務端IP與端口,右側(cè)得到返回結(jié)果、響應狀態(tài)、相應時間等。
為了評價CSIAL語法的復雜性,選擇了4個網(wǎng)絡安全分析需求,將其分別翻譯為CSIAL、SQL以及Elastic Search原生DSL這3種語句,然后用去掉空格與換行符后的字符數(shù)進行對比。對比結(jié)果如圖4所示。
圖4 幾種語句的字符數(shù)對比
從圖中可以看到,4種需求翻譯所得的CSIAL與SQL語句的字符數(shù)較為接近,且都遠小于Elastic Search原生DSL語句的字符數(shù),表明CSIAL的語法相比Elastic Search原生DSL更為簡潔,能有效提升安全分析人員的使用效率。
對一條語句的解析主要分為詞法解析、語法解析、錯誤反饋處理、語句生成樹生成幾個階段。為了測試自定義語言的語句解析性能,實驗中以語句的字符數(shù)為自變量、解析時間(μs)為因變量進行測試。其中解析時間為從接收到語句到得到解析結(jié)果的時間差值。實驗結(jié)果如圖5所示。
圖5 語句解析性能
可以看到時間隨著語句的字節(jié)大小增加而略微有所提升,平均大致在1 ms左右。由于語句解析過程的耗時極小,在實際使用中,這個時間幾乎可以忽略不計。
連接查詢實驗中自變量選擇的是連接生成的數(shù)據(jù)條數(shù),因變量為響應時間(ms)。結(jié)果如圖6所示。
圖6 連接查詢響應時間與連接后數(shù)據(jù)條數(shù)的關(guān)系
連接查詢的實驗結(jié)果中可以發(fā)現(xiàn):①響應時間與連接生成結(jié)果的數(shù)據(jù)條數(shù)大致呈正比;②優(yōu)化后的連接查詢,耗時約為優(yōu)化前的50%~60%,體現(xiàn)出該優(yōu)化方法的有效性;③在該測試實驗使用的數(shù)據(jù)與查詢用例中,對于連接生成結(jié)果的數(shù)據(jù)條數(shù)達到數(shù)十萬條的情況下,對再寫入過程進行優(yōu)化后的連接查詢,時間能夠控制在1 min以內(nèi)。
若使用其它數(shù)據(jù)或用例,實驗的結(jié)果可能會有所差異。
本文研究并構(gòu)建了一種基于Elastic Search的網(wǎng)絡安全交互式分析系統(tǒng)。
定義了一種網(wǎng)絡安全交互式分析語言CSIAL,該語言相比Elastic Search原生DSL語言更為簡潔,能夠顯著簡化安全人員對數(shù)據(jù)的分析過程。使用到Antlr4工具進行語句解析,實驗結(jié)果表明該方法的解析時間可以忽略不計。增加了網(wǎng)絡安全分析所需而Elastic Search缺乏的子查詢、連接查詢等功能,并通過兩個方面對連接過程進行了優(yōu)化調(diào)整,使得相應時間能夠一定程度上滿足需求。
由于只是原型系統(tǒng),后續(xù)工作將著手解決并發(fā)控制、可視化等復雜工程問題。