周建國(guó),戴 華,2,楊 庚,2,周 倩,王 俊
(南京郵電大學(xué)1.計(jì)算機(jī)學(xué)院;2.江蘇省大數(shù)據(jù)安全與智能處理重點(diǎn)試驗(yàn)室;3.現(xiàn)代郵政學(xué)院;4.地理與生物信息學(xué)院,江蘇 南京 210023)
異常檢測(cè)是維護(hù)系統(tǒng)安全和穩(wěn)定的重要手段之一[1]。系統(tǒng)日志的設(shè)計(jì)目的是記錄系統(tǒng)的實(shí)時(shí)運(yùn)行狀態(tài)以及系統(tǒng)運(yùn)行時(shí)出現(xiàn)的關(guān)鍵問(wèn)題,因此系統(tǒng)日志對(duì)于后期分析系統(tǒng)狀態(tài)具有重要意義。基于日志數(shù)據(jù)的異常檢測(cè)是指通過(guò)信息化方法分析系統(tǒng)運(yùn)行時(shí)產(chǎn)生的日志數(shù)據(jù),從而實(shí)現(xiàn)對(duì)系統(tǒng)的異常檢測(cè)。隨著計(jì)算機(jī)軟硬件的快速發(fā)展,系統(tǒng)也變得愈加復(fù)雜,更容易被敵對(duì)攻擊者發(fā)現(xiàn)并利用漏洞對(duì)系統(tǒng)進(jìn)行攻擊。因此,異常檢測(cè)更加復(fù)雜,傳統(tǒng)的檢測(cè)方法逐漸不適用。除此以外,系統(tǒng)日志的規(guī)模也隨著計(jì)算機(jī)軟硬件的發(fā)展迅速增長(zhǎng),人工進(jìn)行分析和標(biāo)記變得非常困難。以Hadoop分布式文件系統(tǒng)(Hadoop distributed file system,HDFS)日志數(shù)據(jù)集[2]為例,此系統(tǒng)能夠在38.7 h內(nèi)產(chǎn)生超過(guò)1 100萬(wàn)條日志數(shù)據(jù)。
現(xiàn)有分析系統(tǒng)日志的方法可以被分為以下4類:基于主成分分析日志信息計(jì)數(shù)器的檢測(cè)方法[2-4]、基于變量挖掘[5]捕捉日志復(fù)現(xiàn)模式的檢測(cè)方法、基于工作流的檢測(cè)方法[6]和基于深度學(xué)習(xí)的檢測(cè)方法[7-11]。前三類方法僅在特定應(yīng)用場(chǎng)景下可以使用,但并不能應(yīng)用到更廣泛和復(fù)雜的系統(tǒng)當(dāng)中,因此具有很大的局限性。第四類方法雖然可以很好地解決前三類方法的局限性,但此類方法僅能對(duì)日志序列內(nèi)的日志先后次序的異常特征進(jìn)行檢測(cè),并沒(méi)有對(duì)日志頻度信息的異常特征進(jìn)行檢測(cè)。因此這類方法在檢測(cè)準(zhǔn)確度上依然存在提升空間,需要進(jìn)一步改進(jìn)和優(yōu)化。
本文提出了一種并列循環(huán)門單元(Gate recurrent unit,GRU)分類模型的日志異常檢測(cè)方法,其核心為通過(guò)設(shè)計(jì)并整合兩個(gè)GRU神經(jīng)網(wǎng)絡(luò)模型,以實(shí)現(xiàn)同時(shí)對(duì)日志序列異常以及日志頻度異常進(jìn)行檢測(cè)。首先,在模型訓(xùn)練階段,利用日志模板解析器在原始日志數(shù)據(jù)集中解析日志模板集合和結(jié)構(gòu)化日志集合;然后,構(gòu)造并生成日志模板滑動(dòng)窗口數(shù)據(jù)集和相應(yīng)的日志模板頻度向量集,并作為訓(xùn)練數(shù)據(jù)集,訓(xùn)練生成并列GRU分類模型。在異常檢測(cè)階段,對(duì)于被檢測(cè)進(jìn)程的日志序列,將其轉(zhuǎn)換為與這一進(jìn)程對(duì)應(yīng)的日志模板滑動(dòng)窗口集和日志模板頻度向量集,然后輸入并列GRU分類模型,通過(guò)判斷當(dāng)前日志模板是否屬于模型的預(yù)測(cè)結(jié)果候選集以確定此日志模板序列是否存在異常。最后通過(guò)試驗(yàn),將本文所提方法與現(xiàn)有的Deeplog方案[7]進(jìn)行比較分析。
在進(jìn)行日志異常檢測(cè)之前,需要對(duì)原始日志數(shù)據(jù)進(jìn)行處理。日志模板解析器能夠?qū)⑾到y(tǒng)日志記錄分離成日志模板和參數(shù)向量?jī)蓚€(gè)部分,并且將原始日志轉(zhuǎn)換為結(jié)構(gòu)化日志,如圖1所示。目前,國(guó)內(nèi)外的研究者們提出了面向各種不同日志應(yīng)用場(chǎng)景的日志模板解析器,例如IPLoM[12]、LogSig[13]、SHISO[14]、Spell[15]和Drain[16]等。本文將會(huì)使用日志模板解析器,對(duì)原始日志文件進(jìn)行預(yù)處理,以生成訓(xùn)練數(shù)據(jù)或待檢測(cè)數(shù)據(jù)。
GRU[17]是循環(huán)神經(jīng)網(wǎng)絡(luò)的一種結(jié)構(gòu)模型,相較于長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)模型(Long short term memory,LSTM)[18]能夠有效減少參數(shù)的計(jì)算量,并且在不同的數(shù)據(jù)集上能夠獲得近似的甚至更好的預(yù)測(cè)準(zhǔn)確度[19]。循環(huán)神經(jīng)網(wǎng)絡(luò)在自然語(yǔ)言處理領(lǐng)域有著廣泛的應(yīng)用,其最大優(yōu)勢(shì)是能夠很好地學(xué)習(xí)句子內(nèi)單詞的上下文模式。由于日志行為具有明顯的先后順序關(guān)系,因此可以使用循環(huán)神經(jīng)網(wǎng)絡(luò)模型學(xué)習(xí)系統(tǒng)的行為模式,從而實(shí)現(xiàn)對(duì)后續(xù)進(jìn)程行為的預(yù)測(cè)。本文將基于GRU神經(jīng)網(wǎng)絡(luò)模型構(gòu)造一個(gè)并列GRU分類模型,實(shí)現(xiàn)對(duì)進(jìn)程日志的異常檢測(cè)。
本文所提出的基于并列GRU分類模型的日志異常檢測(cè)方法包含模型訓(xùn)練和異常檢測(cè)兩個(gè)階段,如圖2所示。在模型訓(xùn)練階段,需要將正常的日志數(shù)據(jù)集進(jìn)行預(yù)處理以訓(xùn)練并列GRU分類模型;在異常檢測(cè)階段,某一進(jìn)程的日志序列將會(huì)被轉(zhuǎn)換為日志模板序列,構(gòu)造日志模板滑動(dòng)窗口輸入并列GRU分類模型并預(yù)測(cè)得到日志模板候選集,通過(guò)判斷日志模板序列中的日志模板是否屬于日志模板候選集以決定這個(gè)日志序列是否存在異常。具體步驟將在后續(xù)章節(jié)內(nèi)詳細(xì)闡述。
定義1結(jié)構(gòu)化日志集合:原始日志數(shù)據(jù)集L={log1,log2,…,log n}對(duì)應(yīng)的結(jié)構(gòu)化日志集合記為D={d1,d2,…,d n},d i為log i對(duì)應(yīng)的結(jié)構(gòu)化日志三元組(k,pid,ts),其中k為日志模板k i,pid為進(jìn)程標(biāo)識(shí)符,ts為日志產(chǎn)生的時(shí)間戳。
定義2日志模板集合:在本文中,使用K={k1,k2,…,k m}表示日志模板集合,其中k i為唯一標(biāo)識(shí)某一類日志的日志模板ID。為了說(shuō)明簡(jiǎn)便,本文直接用k i表示某一日志模板。
定義3進(jìn)程日志模板序列:對(duì)于進(jìn)程p i,設(shè)其產(chǎn)生的日志對(duì)應(yīng)的結(jié)構(gòu)化日志序列為D i=〈d i,1,d i,2,…,d i,q〉,滿足d i,j∈D i∧D i?D∧d i,j.ts<d i,j+1.ts,則D i對(duì)應(yīng)的進(jìn)程日志模板序列為S i=〈d i,1.k,d i,2.k,…,d i,q.k〉。
定義4日志模板滑動(dòng)窗口(Log template sliding window,LTSW):設(shè)滑動(dòng)窗口大小閾值為h,進(jìn)程p i的進(jìn)程日志模板序列為S i=〈e1,e2,…,e q〉,則對(duì)于e j∈S i而言,e j對(duì)應(yīng)的滑動(dòng)窗口序列LTSW記為Win(S i,e j),生成方法如下:
(1)若j≤h,則Win(S i,e j)=?;
(2)若q>h,則Win(Si,e j)=〈e j-h,…e j-2,e j-1〉。
定義5日志模板頻度向量:對(duì)于任一日志模板滑動(dòng)窗口w=〈e j-h,…e j-2,e j-1〉而言,w的日志模板頻度向量記為U w。此向量的維度等于K中日志模板的數(shù)量m,即U w∈R1×m,其中任一維的數(shù)值U w[i]為日志模板k i在w中出現(xiàn)的頻次。
定義6日志模板概率分布向量:將被檢測(cè)進(jìn)程的某個(gè)日志模板滑動(dòng)窗口w=〈e j-h,…e j-2,e j-1〉輸入并列GRU分類模型,分類模型將會(huì)輸出此日志模板滑動(dòng)窗口所對(duì)應(yīng)的日志模板概率分布向量,記為V w。此向量的維度等于K中日志模板的數(shù)量m,即V w∈R1×m,其中任一維的數(shù)值V w[i]表示e j為K中日志模板k i的概率。
圖2 日志異常檢測(cè)的系統(tǒng)框架圖
為了實(shí)現(xiàn)異常檢測(cè),本文基于GRU神經(jīng)網(wǎng)絡(luò)模型構(gòu)造了并列GRU分類模型。這一預(yù)測(cè)模型包含3層,分別為輸入層、神經(jīng)網(wǎng)絡(luò)隱藏層和輸出層,如圖3所示。輸入層負(fù)責(zé)接收由日志模板滑動(dòng)窗口w=〈e j-h,…e j-2,e j-1〉和與w對(duì)應(yīng)的日志模板頻度向量U w構(gòu)成的訓(xùn)練數(shù)據(jù)或檢測(cè)數(shù)據(jù)。神經(jīng)網(wǎng)絡(luò)隱藏層由兩個(gè)并列的GRU模塊構(gòu)成,其中GRU1負(fù)責(zé)處理日志模板滑動(dòng)窗口數(shù)據(jù)w,GRU2負(fù)責(zé)處理與w對(duì)應(yīng)的日志模板頻度向量U w;GRU1和GRU2的輸出結(jié)果在連接后傳入輸出層。輸出層負(fù)責(zé)將連接后的GRU輸出結(jié)果進(jìn)行Softmax變換,最終輸出日志模板概率分布向量V w。
圖3 并列GRU分類模型結(jié)構(gòu)圖
在本文提出的日志異常檢測(cè)方法中,首先在模型訓(xùn)練階段,通過(guò)對(duì)原始日志數(shù)據(jù)進(jìn)行預(yù)處理,生成日志模板滑動(dòng)窗口數(shù)據(jù)集和相應(yīng)的日志模板頻度向量集,并將此數(shù)據(jù)集和向量集作為輸入,訓(xùn)練并生成并列GRU分類模型;然后,在異常檢測(cè)階段,對(duì)于被檢測(cè)進(jìn)程的日志序列,將其轉(zhuǎn)換為與這一進(jìn)程對(duì)應(yīng)的日志模板滑動(dòng)窗口集和日志模板頻度向量集,并輸入并列GRU分類模型,以實(shí)現(xiàn)對(duì)這一進(jìn)程日志的異常檢測(cè)。
在進(jìn)行異常檢測(cè)之前,首先需要完成對(duì)并列GRU分類模型的訓(xùn)練。本文將原始日志數(shù)據(jù)集轉(zhuǎn)換為結(jié)構(gòu)化日志數(shù)據(jù)集,并根據(jù)進(jìn)程標(biāo)識(shí)符構(gòu)造進(jìn)程日志模板序列;然后基于進(jìn)程日志模板序列構(gòu)造日志模板滑動(dòng)窗口和日志模板頻度向量,以形成最終的模型訓(xùn)練輸入數(shù)據(jù)集;最后使用這個(gè)輸入數(shù)據(jù)集,訓(xùn)練并列GRU分類模型。具體過(guò)程如算法1所示。
算法1 模型訓(xùn)練算法輸入:原始日志數(shù)據(jù)集L,滑動(dòng)窗口大小閾值h;輸出:訓(xùn)練后的并列GRU分類模型;1:初始化用于模型訓(xùn)練的三元組集合PL;2:以原始日志數(shù)據(jù)集L為輸入,使用日志模板解析器生成日志模板集合K,然后構(gòu)造結(jié)構(gòu)化日志集合D;3:按照進(jìn)程標(biāo)識(shí)符pid對(duì)結(jié)構(gòu)化日志集合D進(jìn)行分組,得到分組集合DS={D1,D2,…,D u},其中D i表示進(jìn)程p對(duì)應(yīng)的結(jié)構(gòu)化日志集合;4:FOR EACH Di∈DS DO 5: 按時(shí)間戳對(duì)Di中的結(jié)構(gòu)化日志進(jìn)行排序,排序結(jié)果不妨設(shè)為Di=〈d i,1,d i,2,…,d i,q〉,滿足d i,j∈Di且d i,j.ts<d i,j+1.ts;6: 提取Di中的結(jié)構(gòu)化日志中的日志模板ID,生成與Di相對(duì)應(yīng)的進(jìn)程日志模板序列S i=〈d i,1.k,d i,2.k…,d i,q.k〉;7: IF q≤h THEN 8: CONTINUE;9: END IF;10: FOR j=h+1,h+2,…,q DO 11: 生成e j對(duì)應(yīng)的日志模板滑動(dòng)窗口w=Win(S i e j);12: 生成日志模板滑動(dòng)窗口w對(duì)應(yīng)的日志模板頻度向量U w;13: 構(gòu)造三元組(w,U w,e j),并添加到PL中;14: END FOR;15:END FOR;16:以PL作為輸入數(shù)據(jù)集訓(xùn)練并列GRU分類模型;17:返回訓(xùn)練完成的并列GRU分類模型。i,,
其中,算法1中的步驟13中的三元組(w,U w,e j)的第一個(gè)屬性日志模板滑動(dòng)窗口w用于訓(xùn)練檢測(cè)日志模板序列異常的GRU1神經(jīng)網(wǎng)絡(luò)模型,而第二個(gè)屬性日志模板頻度向量U w用于訓(xùn)練負(fù)責(zé)檢測(cè)日志模板頻度異常的GRU2神經(jīng)網(wǎng)絡(luò)模型,而最后一個(gè)屬性e j作為GRU1和GRU2的公共輸入?yún)?shù)。
在并列GRU分類模型訓(xùn)練完成后,此模型被用于日志異常檢測(cè)。在檢測(cè)過(guò)程中,首先使用日志模板解析器將待檢測(cè)進(jìn)程的日志序列轉(zhuǎn)換為進(jìn)程日志模板序列,進(jìn)而構(gòu)造日志模板滑動(dòng)窗口集和日志模板頻度向量集;然后將日志模板滑動(dòng)窗口與相應(yīng)的日志模板頻度向量,逐一輸入并列GRU分類模型,得到模型預(yù)測(cè)輸出的日志模板候選集;最后,通過(guò)判斷每一個(gè)日志模板滑動(dòng)窗口的下一時(shí)刻的日志模板是否屬于日志模板候選集,以確定這一進(jìn)程日志序列是否存在異常。具體檢測(cè)過(guò)程如算法2所示。
算法2 異常檢測(cè)算法輸入:進(jìn)程pi對(duì)應(yīng)的日志序列L i=〈log1,log2,…,log q〉,滑動(dòng)窗口大小閾值h,預(yù)測(cè)結(jié)果候選集大小閾值g;輸出:檢測(cè)結(jié)果(TRUE表示正常,F(xiàn)ALSE表示異常);1:使用日志模板解析器將L i轉(zhuǎn)換為進(jìn)程日志模板序列S i=〈e1,e2,…,e q〉;2:FOR j=h+1,h+2,…,q DO 3: 生成e j對(duì)應(yīng)的日志模板滑動(dòng)窗口w=Win(S i,e j);4: IF w=?THEN 5: RETURN FALSE;6: END IF;7: 生成與w對(duì)應(yīng)的日志模板頻度向量U w;8: V w=GRUPredict(w,U w);9: 獲取V w中g(shù)個(gè)最大的概率值所對(duì)應(yīng)的日志模板候選集C;10: IF e j?C THEN 11: RETURN FALSE;12: END IF;13:END FOR;14:RETURN TRUE。
在算法2的步驟8中,GRUPredict(w,U w)表示利用并列GRU分類模型對(duì)輸入的日志模板滑動(dòng)窗口w和日志模板頻度向量U w進(jìn)行預(yù)測(cè),其輸出為日志模板概率分布向量V w;步驟9中的日志模板候選集C的形成規(guī)則如下:若V w[i]是V w中g(shù)個(gè)最大概率值中的一個(gè),則日志模板k i加入C。
本文試驗(yàn)基于PyTorch框架進(jìn)行試驗(yàn),這個(gè)框架整合了GRU神經(jīng)網(wǎng)絡(luò)模型,試驗(yàn)結(jié)果與同類方法Deeplog[7]進(jìn)行對(duì)比。試驗(yàn)的操作系統(tǒng)為Windows 10 64 bit,開(kāi)發(fā)語(yǔ)言為Python 3.8,深度學(xué)習(xí)框架為Pytorch 1.8,GPU采用Nvidia GTX 1660S 6GB。日志模板解析器采用Spell[15],日志模板解析器源碼參考文獻(xiàn)[20]。本文試驗(yàn)使用文獻(xiàn)[21]收錄標(biāo)記過(guò)的HDFS日志文件[2]作為數(shù)據(jù)集。這一數(shù)據(jù)集來(lái)自于200多臺(tái)亞馬遜EC2節(jié)點(diǎn),包含了11 175 629條日志數(shù)據(jù),記錄了575 061個(gè)block進(jìn)程讀寫(xiě)文件的行為,其中有16 838個(gè)進(jìn)程被Hadoop領(lǐng)域的專家標(biāo)記為異常。試驗(yàn)中的超參數(shù)設(shè)置如表1所示。
表1 試驗(yàn)超參數(shù)數(shù)值表
(1)假陽(yáng)數(shù)(False positive):在所有被檢測(cè)日志序列中,被錯(cuò)誤地判定為異常的日志序列數(shù)量,記為FP。
(2)假陰數(shù)(False negative):在所有被檢測(cè)日志序列中,被錯(cuò)誤地判定為正常的日志序列數(shù)量,記為FN。
(3)查準(zhǔn)率(Precision):正確檢測(cè)出的異常日志序列數(shù)量,占所有檢測(cè)為異常的日志序列數(shù)量的比重,本文用TP表示正確檢測(cè)出的異常日志序列數(shù)量,計(jì)算公式如下
(4)查全率(Recall):正確檢測(cè)的異常日志序列數(shù)量,占所有確定異常的日志序列數(shù)量的比重,計(jì)算公式如下
(5)調(diào)和分?jǐn)?shù)(F1 score):查準(zhǔn)率和查全率的調(diào)和均值,記為FS,計(jì)算公式如下
(1)查準(zhǔn)率、查全率及調(diào)和分?jǐn)?shù)試驗(yàn)
為了驗(yàn)證本文提出的方法的各項(xiàng)指標(biāo)表現(xiàn),本試驗(yàn)將從查準(zhǔn)率、查全率和調(diào)和分?jǐn)?shù)3個(gè)指標(biāo)上對(duì)比Deeplog和本文提出的方法。試驗(yàn)結(jié)果已在表2中展示。
表2的試驗(yàn)結(jié)果表明,本文提出的方法相較于Deeplog方案,在HDFS數(shù)據(jù)集上查全率和調(diào)和分?jǐn)?shù)分別提升了13.8%和5.8%。更高的查全率表明監(jiān)測(cè)算法所檢測(cè)到的真正存在異常的日志模板序列的總數(shù)占比更高。而本文提出的并列GRU分類模型與Deeplog方案相比額外增加了一個(gè)GRU神經(jīng)網(wǎng)絡(luò)模型,這個(gè)GRU神經(jīng)網(wǎng)絡(luò)模型能夠?qū)Υ龣z測(cè)的日志模板序列中的日志模板頻度異常進(jìn)行檢測(cè),因此能夠在一定程度上改善日志異常檢測(cè)的性能表現(xiàn)。
表2 不同方法在HDFS數(shù)據(jù)集上的查準(zhǔn)率、查全率和調(diào)和分?jǐn)?shù)
(2)假陽(yáng)數(shù)和假陰數(shù)試驗(yàn)
為了對(duì)比不同方法檢測(cè)錯(cuò)誤的次數(shù),本試驗(yàn)將會(huì)從假陽(yáng)數(shù)和假陰數(shù)兩個(gè)指標(biāo)對(duì)比Deeplog和本文提出的方法。試驗(yàn)結(jié)果已在表3中展示。
表3 不同方法在HDFS數(shù)據(jù)集上的假陽(yáng)性和假陰性
表3的試驗(yàn)結(jié)果表明,本文提出的方法相較于Deeplog,能夠顯著降低異常檢測(cè)的假陰數(shù)指標(biāo),本文提出的方法的假陰數(shù)僅為Deeplog方案的6.97%。更低的假陰性次數(shù)表示方法能夠檢測(cè)到更多的異常日志模板序列。更低的假陰數(shù)表明系統(tǒng)存在的未被檢測(cè)算法所檢測(cè)出來(lái)的異常日志模板序列的數(shù)量更少。而更高的假陽(yáng)數(shù)表明系統(tǒng)內(nèi)正常日志模板序列被檢測(cè)算法錯(cuò)誤地標(biāo)記為異常日志模板序列的數(shù)量更多。因此,從系統(tǒng)安全的角度考慮,更低的假陰數(shù)比更低的假陽(yáng)數(shù)更有安全意義。
日志異常檢測(cè)是維護(hù)系統(tǒng)安全和穩(wěn)定的重要問(wèn)題之一。針對(duì)這一問(wèn)題,本文提出了一種基于并列GRU分類模型的日志異常檢測(cè)方法,這一方法同時(shí)考慮了日志序列上下文關(guān)系和頻度的特征,利用日志模板解析器和GRU神經(jīng)網(wǎng)絡(luò)模型,構(gòu)造并列GRU分類模型,實(shí)現(xiàn)對(duì)進(jìn)程日志的異常檢測(cè)。試驗(yàn)結(jié)果表明,與現(xiàn)有方案Deeplog相比,本文提出的方法在查全率、調(diào)和分?jǐn)?shù)等各項(xiàng)評(píng)價(jià)指標(biāo)上均有更好的表現(xiàn)。