王可 康曉鳳 張百川 蔡超萍 張一凡
摘? 要:隨著網(wǎng)絡(luò)應(yīng)用的發(fā)展,針對(duì)Web服務(wù)的惡意攻擊也日益增多,如何在第一時(shí)間找到惡意的攻擊日志,確認(rèn)攻擊者IP和漏洞位置,為后續(xù)的漏洞修補(bǔ)和攻擊溯源提供有效幫助,是本文的研究重點(diǎn)。本系統(tǒng)通過(guò)漏洞測(cè)試工具收集惡意請(qǐng)求URL,使用Python的Sklearn(Scikit-learn)框架實(shí)現(xiàn)SVM(Support Vector Machines, 支持向量機(jī))模型,對(duì)收集到的惡意URL進(jìn)行關(guān)鍵詞和特征提取,再對(duì)模型進(jìn)行訓(xùn)練,訓(xùn)練結(jié)果通過(guò)Pickle方式保存。使用本系統(tǒng)可以對(duì)常見(jiàn)的漏洞利用方式如SQL注入、XSS、遠(yuǎn)程代碼執(zhí)行等進(jìn)行檢測(cè),為Web服務(wù)的安全運(yùn)行以及漏洞修復(fù)、重新上線等提供有效幫助,減少漏洞攻擊事件帶來(lái)的損失。
關(guān)鍵詞:SVM;日志審計(jì);機(jī)器學(xué)習(xí)
中圖分類號(hào):TP315? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
Design and Implementation of Log Analysis System based on Machine Learning
WANG Ke, KANG Xiaofeng, ZHANG Baichuang, CAI Chaoping, ZHANG Yifan
(College of Information Engineering, Xuzhou Institute of Technology, Xuzhou 221000, China)
Abstract: With the development of network applications, malicious attacks against Web services are also increasing. The research focuses on how to find the malicious attack log at the first time, confirm the attacker's IP and vulnerability location, and provide effective help for subsequent vulnerability repair and attack traceability. Malicious request URLs are collected through vulnerability testing tools and? Python's Sklearn (Scikit-learn) framework is used to implement SVM (Support Vector Machines) model. Keywords and features are extracted from the collected malicious URLs and then the models are trained. The training results are saved in Pickle mode. This system can detect common vulnerability utilization methods such as SQL (Structured Query Language) injection, XSS (Cross Site Script), remote code execution, etc., and provide effective help for the safe operation of Web services, vulnerability repair and re-launch, so to reduce the losses caused by vulnerability attacks.
Keywords: SVM; log audit; machine learning
1? ?引言(Introduction)
隨著互聯(lián)網(wǎng)技術(shù)的高速發(fā)展,人們?cè)谙硎芫W(wǎng)絡(luò)帶來(lái)便利的同時(shí),遭受的針對(duì)Web服務(wù)的攻擊也日益增多,惡意攻擊日志和用戶正常訪問(wèn)日志等巨大的日志量往往使得維護(hù)人員在服務(wù)器遭受攻擊后很難第一時(shí)間從日志中找出惡意的攻擊日志。
本系統(tǒng)使用SVM算法,通過(guò)機(jī)器學(xué)習(xí)檢測(cè)惡意URL,定位攻擊者帶來(lái)的惡意流量在日志中的位置,一旦確認(rèn)攻擊之后可以確認(rèn)漏洞的所在位置,為后續(xù)的漏洞修補(bǔ)提供幫助。同時(shí)本系統(tǒng)針對(duì)日志進(jìn)行分析,對(duì)發(fā)送惡意流量的用戶IP進(jìn)行統(tǒng)計(jì),同時(shí)通過(guò)API進(jìn)行查詢、定位,為后續(xù)的攻擊溯源提供有效的幫助。本系統(tǒng)能夠更好地幫助維護(hù)人員進(jìn)行日志審計(jì)、攻擊溯源等工作,為后續(xù)Web服務(wù)漏洞的修補(bǔ)、Web服務(wù)的重新上線提供幫助,減少漏洞攻擊事件帶來(lái)的損失。
2? ?SVM介紹(Introduction to SVM)
SVM是一種二分類模型,其學(xué)習(xí)策略是間隔最大化可以用來(lái)求解凸二次規(guī)劃的問(wèn)題,即通過(guò)給定一組訓(xùn)練數(shù)據(jù),將每個(gè)訓(xùn)練數(shù)據(jù)區(qū)分為兩個(gè)類別,使兩個(gè)類別特征在定義的特征空間上的間隔最大。日志中的惡意URL檢測(cè)就是區(qū)分惡意URL和正常訪問(wèn)的URL數(shù)據(jù),因此將SVM應(yīng)用于入侵檢測(cè)領(lǐng)域是可行的[1]。
本系統(tǒng)通過(guò)漏洞測(cè)試工具如SQLMap等進(jìn)行惡意URL的數(shù)據(jù)收集,使用Python的Sklearn框架實(shí)現(xiàn)SVM模型;通過(guò)對(duì)已經(jīng)收集到的惡意URL進(jìn)行關(guān)鍵詞和特征的提取實(shí)現(xiàn)預(yù)處理;再對(duì)模型進(jìn)行訓(xùn)練,訓(xùn)練結(jié)果通過(guò)Pickle方式保存,訓(xùn)練完成后可以對(duì)日志中含有攻擊內(nèi)容的URL進(jìn)行檢測(cè),即數(shù)據(jù)收集、預(yù)處理、用于訓(xùn)練和測(cè)試的SVM技術(shù)和決策[2]。
3 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(System design and implementation)
本系統(tǒng)在算法方面采用了Python下成熟的第三方模塊Sklearn。Sklearn是當(dāng)前Github上最流行的機(jī)器學(xué)習(xí)庫(kù)之一,大量使用NumPy進(jìn)行高性能的線性代數(shù)和數(shù)組運(yùn)算,通過(guò)對(duì)LIBSVM的Cython包裝實(shí)現(xiàn)支持向量機(jī)。Sklearn對(duì)很多其他的Python庫(kù)如Numpy、Pandas等有著良好的集成性。
本系統(tǒng)通過(guò)SQLMap等漏洞測(cè)試工具收集常規(guī)的惡意URL,將惡意URL進(jìn)行解碼等操作之后再訓(xùn)練,通過(guò)訓(xùn)練完成的模型對(duì)日志中的URL進(jìn)行甄別,從而達(dá)到對(duì)正常日志中的URL進(jìn)行審計(jì)的效果。本系統(tǒng)的Web前端界面通過(guò)Vue+Element-UI實(shí)現(xiàn)。Vue.js是一款簡(jiǎn)單而功能強(qiáng)大的JavaScript庫(kù)[3],通過(guò)Python的Flask框架實(shí)現(xiàn)Web服務(wù),通過(guò)Axios實(shí)現(xiàn)前后端的交互。本系統(tǒng)主要包括以下六個(gè)模塊:日志上傳、日志管理、日志閱讀、自動(dòng)審計(jì)、惡意IP統(tǒng)計(jì)、惡意IP地址查詢。
3.1? ?日志上傳模塊
本模塊的主要功能是實(shí)現(xiàn)日志文件的上傳,啟動(dòng)前端界面后如圖1所示。在選定文件進(jìn)行上傳之后,將會(huì)通過(guò)Flask的request.files進(jìn)行數(shù)據(jù)的接收,同時(shí)系統(tǒng)在后端對(duì)文件的后綴名進(jìn)行檢驗(yàn),只允許上傳后綴名為log的文件,避免惡意文件混入其中。通過(guò)檢驗(yàn)的文件可以進(jìn)行保存,保存在Upload路徑下。
3.2? ?日志管理模塊
本模塊的主要功能是實(shí)現(xiàn)用戶對(duì)已經(jīng)上傳的文件進(jìn)行管理。對(duì)于已經(jīng)上傳的文件,本系統(tǒng)在展示目錄之前會(huì)通過(guò)調(diào)用Python中的time庫(kù)time.strftime獲取時(shí)間,方便用戶更好地確定自己上傳的日志,界面如圖2所示。同時(shí)在本模塊中系統(tǒng)將會(huì)提供刪除功能,對(duì)選定的文件可以進(jìn)行刪除。在刪除之前會(huì)對(duì)用戶傳入的文件名進(jìn)行檢測(cè),避免出現(xiàn)如“..”“/”等導(dǎo)致目錄穿越的危險(xiǎn)符號(hào)。
3.3? ?日志閱讀模塊
本模塊的主要功能是實(shí)現(xiàn)日志的可視化閱讀。針對(duì)當(dāng)下日志量大、難以抓住關(guān)鍵信息的問(wèn)題,日志解析的主要目的是把原始日志文本中的不變部分從可變部分分離出來(lái),并形成一個(gè)良好的結(jié)構(gòu)化日志事件[4]。本系統(tǒng)采取可視化的日志審計(jì),用戶在前端的Client界面選定文件名后,服務(wù)端會(huì)對(duì)傳入的文件名進(jìn)行判斷,如果不存在該文件則會(huì)向前端返回錯(cuò)誤信息;如果存在該文件會(huì)調(diào)用log_read函數(shù),log_read函數(shù)首先將會(huì)通過(guò)readlines對(duì)需要處理的日志文件進(jìn)行分割,隨后通過(guò)Python庫(kù)的apache_log_parser對(duì)每一行日志進(jìn)行處理。針對(duì)日志信息量大的問(wèn)題,在后臺(tái)篩選的過(guò)程中會(huì)除去垃圾信息和不重要的信息,以方便用戶閱讀和審計(jì)。選定日志格式為'%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"',本系統(tǒng)將會(huì)通過(guò)這種格式對(duì)日志文件中的日志信息進(jìn)行切塊。同時(shí)考慮到日志中可能存在很多失敗信息和我們并不需要的垃圾信息,在格式化處理之后,截取對(duì)應(yīng)的信息返回Client進(jìn)行渲染,截取信息通過(guò)Python中的apache_log_parser模塊處理后的關(guān)鍵字進(jìn)行提取。本系統(tǒng)在日志中截取的信息包括Remote_IP(可以及時(shí)獲取訪問(wèn)者的遠(yuǎn)程IP地址,對(duì)有攻擊行為的IP提前做出防范)、Date(確認(rèn)訪問(wèn)請(qǐng)求的具體時(shí)間,對(duì)攻擊事件的具體時(shí)間進(jìn)行溯源)、Method(展示請(qǐng)求方式,判斷用戶行為)、URL(方便根據(jù)攻擊者攻擊的URL進(jìn)行漏洞類型的識(shí)別和漏洞位置的定位)、Status(提供狀態(tài)碼判斷是無(wú)差別掃描或者特殊漏洞利用)、User-Agent(提供UA頭,根據(jù)UA頭查看是否有明顯的掃描特征),具體效果如圖3所示。
3.4? ?自動(dòng)審計(jì)模塊
針對(duì)當(dāng)下日志量大,人工審計(jì)可能會(huì)出現(xiàn)很多遺漏,效率低下的問(wèn)題,本模塊的主要功能是實(shí)現(xiàn)日志的自動(dòng)審計(jì)。
自動(dòng)審計(jì)模塊主要分為兩部分,第一部分是對(duì)惡意日志進(jìn)行分析的模型訓(xùn)練,第二部分是對(duì)接收的日志進(jìn)行預(yù)處理和自動(dòng)審計(jì),即通過(guò)訓(xùn)練完成的模型對(duì)其進(jìn)行預(yù)測(cè)分析。
首先,關(guān)于訓(xùn)練部分,第一步是對(duì)惡意URL的收集。本系統(tǒng)將常見(jiàn)的漏洞測(cè)試工具、漏洞掃描工具和有代表性的Payload組合成訓(xùn)練的惡意樣本,而正常樣本來(lái)自VPS經(jīng)過(guò)篩選后的正常訪問(wèn)日志。第二步是對(duì)樣本的讀取,通過(guò)readline對(duì)每一行數(shù)據(jù)進(jìn)行讀取。為了防止數(shù)據(jù)經(jīng)過(guò)URL編碼之后導(dǎo)致準(zhǔn)確率下降,對(duì)數(shù)據(jù)事先進(jìn)行URL解碼,從而提高準(zhǔn)確率。同時(shí)對(duì)數(shù)據(jù)進(jìn)行分割,去除協(xié)議部分、域名部分等干擾信息。數(shù)據(jù)經(jīng)過(guò)預(yù)處理之后,對(duì)數(shù)據(jù)進(jìn)行標(biāo)記,正常URL標(biāo)記為1,惡意URL標(biāo)記為0,因?yàn)閷?duì)URL的分類可以認(rèn)為是對(duì)文本的分類,所以通過(guò)Sklearn的TfidfVectorizer來(lái)提取文本特征。提取文本特征固然會(huì)給我們帶來(lái)很多額外的信息,但是同時(shí)也增加了時(shí)間復(fù)雜度和模型復(fù)雜度,因此需要進(jìn)行特征降維,而特征選擇和特征提取是降維常用的兩種方法[5]。我們將預(yù)處理過(guò)的URL轉(zhuǎn)化成向量,從而組成矩陣輸入模型中進(jìn)行處理。
本系統(tǒng)通過(guò)設(shè)置TfidfVectorizer中的參數(shù)tokenizer來(lái)指定對(duì)應(yīng)的分詞函數(shù)。本系統(tǒng)的策略是將解碼后的數(shù)據(jù)進(jìn)行以“2”為單位的區(qū)塊劃分,再調(diào)用對(duì)應(yīng)的fit_transform函數(shù)。fit_transform函數(shù)可以先對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練,找到轉(zhuǎn)換數(shù)據(jù)的規(guī)則后,再根據(jù)規(guī)則轉(zhuǎn)換數(shù)據(jù)。將轉(zhuǎn)換完成的數(shù)據(jù)結(jié)合之前的0、1標(biāo)記放入train_test_split函數(shù),同時(shí)設(shè)置參數(shù)test_size為0.2即測(cè)試樣本占比為0.2,從而驗(yàn)證每次訓(xùn)練的精確度。隨后將得到的數(shù)據(jù)放入fit函數(shù)中,從而得到一個(gè)統(tǒng)一轉(zhuǎn)換的規(guī)則模型。最后調(diào)用score函數(shù)輸入測(cè)試集數(shù)據(jù),其中最好的得分為1.0,在默認(rèn)懲罰參數(shù)為1.0的情況下,最終的得分為0.9548697989064961。懲罰系數(shù)C代表支持向量機(jī)對(duì)誤差的容忍程度,C值選擇的好壞直接決定模型泛化能力的高低[6]。該模型準(zhǔn)確度低于預(yù)期,嘗試提高懲罰參數(shù)值,懲罰參數(shù)值和準(zhǔn)確度的關(guān)系如圖4所示。對(duì)于懲罰系數(shù)C而言,其和數(shù)據(jù)擬合精度正相關(guān),即選擇的懲罰系數(shù)C越大,那么分類的準(zhǔn)確度越高[7]。綜合考慮之后,懲罰參數(shù)值設(shè)置為6,隨后將訓(xùn)練完成的模型以Pickle方式進(jìn)行保存。
在預(yù)測(cè)分析部分通過(guò)pickle.load來(lái)加載之前存儲(chǔ)的result.pickle,然后對(duì)輸入的數(shù)據(jù)進(jìn)行解碼。調(diào)用Sklearn模塊中的predict函數(shù)實(shí)現(xiàn)對(duì)已經(jīng)處理好的數(shù)據(jù)進(jìn)行預(yù)測(cè),最后將數(shù)據(jù)返回給Client端。最終結(jié)果如圖5所示。
3.5? ?惡意IP統(tǒng)計(jì)模塊
本模塊的主要功能是實(shí)現(xiàn)對(duì)惡意IP的記錄和統(tǒng)計(jì),通過(guò)自動(dòng)審計(jì)后被認(rèn)為是惡意URL的IP會(huì)由系統(tǒng)存儲(chǔ)到數(shù)據(jù)庫(kù)中。由于本系統(tǒng)采用的MySQL數(shù)據(jù)庫(kù)具備開(kāi)源、簡(jiǎn)單易用等特點(diǎn),因此使用成本較低,更促進(jìn)了其應(yīng)用推廣[8]。
該模塊通過(guò)建立一個(gè)EvilIP類實(shí)現(xiàn)對(duì)IP和URL的臨時(shí)存儲(chǔ),最后統(tǒng)一通過(guò)MySQL中的Insert語(yǔ)句插入數(shù)據(jù)庫(kù)中,再使用count進(jìn)行數(shù)據(jù)統(tǒng)計(jì),結(jié)果如圖6所示。
3.6? ?惡意IP地址查詢模塊
本模塊的主要功能是對(duì)惡意IP地址進(jìn)行查詢。本系統(tǒng)通過(guò)查詢IP的API進(jìn)行查詢,發(fā)送數(shù)據(jù)庫(kù)中的IP,然后對(duì)返回的json數(shù)據(jù)進(jìn)行分析,獲取我們想要的地址信息。同時(shí)設(shè)置sleep函數(shù),避免因?yàn)檎?qǐng)求過(guò)快導(dǎo)致查詢失敗,最后將數(shù)據(jù)返回Client。查詢結(jié)果如圖7所示。
4? ?結(jié)論(Conclusion)
隨著互聯(lián)網(wǎng)的高速發(fā)展,針對(duì)Web服務(wù)的攻擊屢見(jiàn)不鮮,日志中包含系統(tǒng)的很多重要信息,但是巨大的日志量增加了審計(jì)難度,沒(méi)有及時(shí)處理可能會(huì)給企業(yè)帶來(lái)經(jīng)濟(jì)損失。本系統(tǒng)采用Python語(yǔ)言編寫,配合Vue實(shí)現(xiàn)前端設(shè)計(jì),可以使日志文件審計(jì)工作更加簡(jiǎn)潔、高效,并運(yùn)用支持向量機(jī)使系統(tǒng)對(duì)日志中的惡意URL具有一定的甄別能力。本系統(tǒng)可以實(shí)現(xiàn)對(duì)日志的自動(dòng)化審計(jì)和對(duì)惡意IP的提取、存儲(chǔ)、分析,使企業(yè)或者個(gè)人的Web服務(wù)遭受攻擊后能夠及時(shí)確認(rèn)漏洞點(diǎn)所在,并且對(duì)惡意IP溯源。利用本系統(tǒng)能夠降低Web容器在遭受攻擊后帶來(lái)的損失,為日志的自動(dòng)審計(jì)提供了一種良好的解決方案。
參考文獻(xiàn)(References)
[1] 李輝,管曉宏,昝鑫,等.基于支持向量機(jī)的網(wǎng)絡(luò)入侵檢測(cè)[J].計(jì)算機(jī)研究與發(fā)展,2003(06):799-807.
[2] BHATI B S, RAI C S. Analysis of support vector machine-based intrusion detection techniques[J]. Arabian Journal for Science and Engineering, 2020, 45(11):2371-2383.
[3] 劉亞茹,張軍.Vue.js框架在網(wǎng)站前端開(kāi)發(fā)中的研究[J].電腦編程技巧與維護(hù),2022(01):18-19,39.
[4] 鐘雅,郭淵博.基于機(jī)器學(xué)習(xí)的日志解析系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2018,38(02):352-356.
[5] 產(chǎn)院東,郭喬進(jìn),梁中巖,等.基于深度學(xué)習(xí)的入侵檢測(cè)綜述[J].信息化研究,2021,47(04):1-7.
[6] 陳麗芳,楊麗敏,于健.SVM在網(wǎng)絡(luò)安全預(yù)警中的應(yīng)用[J].華北理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2021,43(02):132-140.
[7] 徐輝.基于GA-SVM算法的網(wǎng)絡(luò)入侵檢測(cè)研究[J].長(zhǎng)春工程學(xué)院學(xué)報(bào)(自然科學(xué)版),2021,22(01):101-104.
[8] 范開(kāi)勇,陳宇收.MySQL數(shù)據(jù)庫(kù)性能優(yōu)化研究[J].中國(guó)新通信,2019,21(01):57.
作者簡(jiǎn)介:
王? ?可(2001-),男,本科生.研究領(lǐng)域:信息安全.
康曉鳳(1978-),女,碩士,副教授.研究領(lǐng)域:信息安全.
張百川(2002-),男,本科生.研究領(lǐng)域:信息安全.
蔡超萍(2002-),女,本科生.研究領(lǐng)域:信息安全.
張一凡(2001-),男,本科生.研究領(lǐng)域:信息安全.