實用技術乾貨!教你用機器學習提高日常安全運維工作中的效率

作者介紹:黃龍,網易易盾資深安全工程師,專注於互聯網安全,擅長安全攻防對抗和甲方安全建設,擁有CISSP認證,同時也是網易雲課堂《Web安全工程師》微專業核心製作人。

​一、安全運維工作

概述

在整個安全工作中,安全運維是不可或缺的一環,其目的是保證各項安全工作持續有效地運作。除了對外的溝通和業務對接相關工作,大部分安全運維的日常工作相對固定,如漏洞審覈、安全產品運維、日誌審計和應急響應等工作。

安全工程師除了需要具備一些基礎的安全技能,通常還需要具備發現問題的能力和舉一反三的能力,比如在漏洞審覈是發現一個反射型XSS漏洞,需要思考這個問題是否是通用的問題,通過哪些途徑(搜索引擎、業務日誌、掃描器腳本等)能發現和挖掘出同類問題,以達到通過問題發現本質

這些要求和能力所需要的技術,往往也在不斷的發展。

技術發展

隨着互聯網、物聯網、大數據和雲計算的快速發展,整個IT行業的技術棧都在快速發展,這裏我們來簡單看一下安全工程師對日誌進行安全分析的技術發展史。

早期的業務量不多,技術棧簡單,業務複雜度不高,通常日誌的量級還不算太大,往往通過簡單的命令(awk/sort/cat/find等)或者簡單的shell/python/perl腳本,再加上工程師人肉分析來進行處理。比如入侵排查和響應,分析結果和效率往往特別依賴於安全工程師的日誌分析能力、經驗和Linux操作的熟練度以及腳本的編寫使用。

隨着互聯網的發展,業務量快速增加和技術棧的高速發展,日誌越來越多,需要進行日誌分析的平臺也快速提升,HDFS和ELK(Elasticsearch + Logstash,Kibana)就應運而生。HDFS作爲離線分析,安全工程師可以通過簡單的Hive SQL完成一些分析和統計工作;ELK一般作爲集中日誌分析系統,在蒐集、展示和查詢方面非常靈活,更加簡單易用。所以這個時候的日誌分析和問題排查,基本上只依賴於安全工程師的日誌分析能力和安全經驗,而一些hive sql或者es查詢語法,學習成本是非常低的。

隨着日誌量越來越大,一方面日誌量越來越大,日誌分析的效率需要提高;另一方面很多安全分析的需求也不簡單的是一些特徵關鍵字和統計能完成的,可能有些需要依賴於前面的行爲等,這時候安全工程師就需要新的工具來進行支撐。

面臨的問題

當下,安全運維工作有兩個重要指標:效果和效率。

前面我們提到安全運維工程師需要進行安全分析,隨着現在業務的快速發展和技術棧複雜度的提升,工程師每天面對的是海量的數據,很多時候的工作可能都是大海撈針,工程師面對海量的日誌數據,如何快速地定位問題,以及如何挖掘出更多的安全風險都是急需解決的問題

安全工程師在運維安全產品的時候,需要通過自身的能力來提升一些安全產品的效果,如降低WAF的漏報情況,安全運維人員或多或少都做過以下一些工作:

1、比較簡單的做法可能就是不停的蒐集各種攻擊的Payload,進行攻擊測試;

2、除了蒐集Payload外,深入一點的做法一般是通過梳理關鍵字/特徵從ES或者HDFS提取疑似攻擊日誌,進行人工分析;

3、隨着大數據平臺和威脅情報的發展,再進一步的方式會考慮將已經發現攻擊的IP和威脅情報的掃描IP的對應的請求進行梳理,進行二次分析;

4、比較理想的做法是對全量日誌進行分析,提取攻擊行爲日誌,根據日誌提取特徵。

​這裏我們會發現,隨着日誌量的越來越大,依賴人肉分析大量數據是不現實的。雖然抽樣分析和正則或規則匹配也是一種折中方案,但是會存在一定的遺漏風險。這個時候,我們需要通過一些更優的方案和工具,能夠快速高效地從海量數據中發現更多未知的問題,而機器學習很可能就是我們的答案。


二、AI賦能安全運維工作初探

安全與機器學習

目前在安全領域已經有很多方向嘗試藉助機器學習來解決問題,如惡意軟件檢測、違規圖片識別,垃圾郵件識別,UEBA等。

機器學習在垃圾郵件、風控系統和違禁圖片識別方向是效果比較顯著的,比如對違禁圖片進行打標,通過機器學習進行自動分類:

現階段,大部分機器學習僅僅是融入到各種安全產品中,而在基礎安全領域並沒有得到很好的利用。一方面是機器學習本身有一定的成本,在日常運維中使用有一定的門檻;另一方面在基礎安全領域的機器學習的效果受制於樣本的限制,比如在Webshell的檢測中,我們發現現有的Webshell樣本是遠遠不夠的,有些時候我們會在實踐過程中發現,算法的準確性還不如一些簡單的規則。

實際上,並不是所有的場景都適合現階段的機器學習落地,這裏我們先來關注一些適合機器學習的場景,比如大量日誌數據的處理和分析。

前面的分析我們已經知道,面對大量日誌的分析和處理,我們之前使用的初級工具(shell命令、python腳本等)和中級工具(ES搜索、HiveSQL等)等都已經滿足不了我們的需求了,這時候我們就需要使用機器學習這個高級工具了。


三、通過日誌分析發現異常用戶

背景介紹

日誌分析和審計在安全運維工作中經常遇到,這裏我們考慮一個很簡單的日誌審計需求:有一個業務,提供了敏感接口的訪問日誌,需要安全工程師發現哪些人有問題。

針對這類問題,目前比較常見的分析方式主要是基於統計方式,最常見的就是頻次統計,比如每個員工的訪問閾值是100次/天,當超過了100次我們就報警。這類的分析統計實現是比較簡單的,通過時間窗口來實現。

這裏,爲了展示方便,我選取了一個訪問量小的業務,用其中一個功能的訪問日誌做說明。

簡單分析

日誌記錄的主要信息是: 在什麼時間 在什麼地點 對誰 幹了什麼事情

這裏面,每一個維度可以單獨分析,同時也可以聯合分析,很多時候結果完全依賴於運營人員的經驗或者是系統的規則。

通常情況下,我們分析的維度包括:

1、頻率:單個用戶在一段時間範圍內的行爲超過了某個閾值;

2、時域:在特定的時間做這件事情,如在凌晨3點,下載了3份文件;

3、地點:通常情況是IP,這裏可以和威脅情報做Join,也可以根據業務做分析,比如是員工通過一臺美國的服務器訪問了xx系統;

​這些條件還可以組合,綜合一些規則條件來處理。當然,再複雜一點就是一個簡單的日誌行爲分析系統了。

我們考慮一些場景,如果是一些應急的分析需求,日誌量有不小,我們怎麼來快速進行分析呢?或者是已經有很多日誌數據了,因爲數據量太大而沒有利用起來,我們是否能挖掘其中的價值呢?

這裏我們嘗試使用機器學習的算法來進行一些分析。

具體實例——發現異常用戶

很多時候,我們的需求是發現異常用戶行爲,所以需要有工具幫助我們快速提取異常的用戶行爲。有過日誌分析經驗的同學應該會有這樣的經驗:通常情況下,大部分的用戶基本都是正常請求;有部分用戶的請求是異常;但是異常的情況之間往往有很大的差異。簡單來說就是正常的人都差不多,奇葩的人可能有各種奇葩。那麼,我們怎麼去提取這些“奇葩”呢?

最理想的情況就是通過機器學習的算法,直接區分出正常和異常的用戶。正如我們前面提到的,異常的情況可能是多種多樣,所以這裏我們不能簡單的進行二分類,而是考慮使用聚類算法,先進行分類,再針對各類的用戶進行針對性的分析,這裏我們嘗試使用K-Means算法。

上圖就是通過K-Means算法分簇效果展示,通過圖表相信大家比較容易理解。

很多時候一開始分析日誌時,我們並不清楚正常訪問和異常訪問具體的特徵和區別,所以這裏使用 K-Means算法,K-Means本身是無監督學習算法,所以我們在使用時並不需要花費大量的時間來蒐集樣本,並進行模型訓練(終於不用像識別圖片驗證碼那樣整理一大堆的樣本文件了)。

另外一個很重要的原因就是K-Means算法非常容易實現,上手也比較容易,簡單的來說就是先根據請求的特性進行分類,然後我們去掉正常的請求(通常情況下數量最多的一簇),針對其他簇(異常)進行深入分析。

K-Means算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分爲K個簇。讓簇內的點儘量緊密的連在一起,而讓簇間的距離儘量的大。

有關“簇”和“質心”參考下圖:

這裏具體的原理我們暫時不做解釋,感興趣的同學可以通過搜索引擎自行了解。

算法實踐

爲了大家方便了解,我們提取了部分數據做一個簡單的分析演示。

這是某個系統,敏感接口的訪問日誌(IP地址和頁面信息已經做了脫敏處理),我們現在簡單的從用戶的訪問頻次來進行分析。

我們現在主要目的是區分正常用戶和異常用戶,這裏我們並沒有之前的用戶數據參考,所以選擇非監督學習的K-Means算法。

提取特徵

首先是提取特徵,爲了方便演示,我們這裏僅使用單個維度特徵(用戶每天的訪問次數):

我們可以先直接通過折線圖看一下各個用戶的訪問情況:

因爲這個特徵本身是數字特徵,所以可以直接作爲算法的特徵,又是單一維度,也省掉了特徵轉換的一個過程。

提取完特徵,我們藉助K-Means算法來進行分類,算法會根據業務情況將數據分爲幾類,到底分爲幾類需要用戶指定,那到底幾類比較合理呢?我們可以通過一些方法幫我們決定。

比較直觀和常用的方法時肘部法則(Elbow Method),我們來看一下運行的結果:

我們可以看到,通過畫K與cost function的關係曲線圖,如左圖所示,肘部的值(cost function開始時下降很快,在肘部開始平緩)做爲K值,K=4。

PS:並不是所有的問題都可以通過畫肘部圖來解決,這裏使用肘部圖是爲了方便讓大家觀察。

這裏,我們直接調用sklearn中的KMeans算法:

分類完成,發現異常情況

通過K-Means分類,我們可以發現這四類的情況

0簇的用戶最多,139個,根據我們的經驗判斷這139個用戶是正常的。所以我們的重點可以放在後面3個簇中,即關注用戶25,28,49,52的行爲。

這裏我們觀察一下這4個異常用戶的訪問情況,我們可以看到這幾個異常用戶確實是可疑用戶,和我們之前通過閾值分析結果匹配,並且還有些行爲特定,如突然某一天的訪問量都突然增多。

說明:

K-Means很多時候只能幫助我們進行分簇,並不能直接解決問題,分類之後的工作還是需要安全工程師人工進行分析。

如果面對海量的用戶訪問數據,通常情況下正常用戶的訪問佔大部分(特別是內部系統),所以使用算法能夠幫助我們排除大量正常的數據,讓安全工程師更專注於異常的數據分析,可以大大的提高我們的分析效率。

後續

在一些UBA/UEBA的產品中,也是使用了K-Means算法或者其他的聚類算法。當然,在實際情況中遠遠不止這些工作,從特徵提取到模型訓練,交叉對比等機器學習有一套完整的工程化流程。

同時,我們也需要注意,並非所有的異常都是有安全問題的,這裏就需要安全運營通過對業務的敏感性,以及和業務對接的方式去分析和排查。


四、WAF漏報問題優化

背景介紹

前段時間在護網行動發現, WAF(Web Application Firewall)基本已經成爲各個公司的標配了。我們都知道WAF確實能幫助我們攔截很多Web應用攻擊,作爲運維人員,都會面對一個觸及靈魂的問題:如何評估WAF的攔截效果?漏報率怎麼樣,誤報率怎麼樣?

我想想大部分運維人員都會有自己的測試工具,包含蒐集的一些特定的攻擊測試樣例,定期做一些評估測試,如:

通常情況下,有基礎的測試用例和持續的運營,誤報我們比較容易發現和及時處理。但是漏報的問題大家很難評估,儘管我們已經梳理了各種攻擊和漏洞利用的場景。

但是在複雜的互聯網環境和雲環境,如果我們仔細分析日誌,還是會發現有不少漏過的情況。

正如我們前面提到的,除了Payload蒐集和簡單關鍵字提取外,常見的做法就是可疑請求打標。簡單來講就是將所有已經攔截過的請求的IP,在一定時間需求內的請求都打上可疑的標籤,當然IP維度還可以包含一些威脅情報的掃描IP,或者是全量日誌直接分析。

這裏,我們的目的就是從這些可疑或者全量日誌中,提取出特定的攻擊日誌,以降低我們的人工分析量。

具體實例——XSS攻擊日誌挖掘

很多時候我們想提升我們WAF的攔截效果,降低漏報,就需要對日誌進行分析和攻擊行爲提取,並轉換爲攔截規則。

前面我們已經講了使用K-Means可以幫助我們進行分類的方法,這裏我們換一個思路,我們針對XSS這個類型的漏報日誌進行提取。

五、算法實踐

樣本蒐集

在WAF的運維期間,已經蒐集了很多XSS攻擊的Payload和日誌,這裏我們再整理一些正常的請求日誌。 

這樣我們就已經有了正樣本和負樣本,可以嘗試通過監督度學習,從請求日誌中挖掘我們的漏網之魚。

特徵提取

因爲需要發現XSS攻擊,所以我們首先需要簡單地梳理一下XSS Payload的特徵,XSS攻擊通常如下:

1、很可能包含一些HTML標籤或者事件屬性,比如html標籤, , 等,比如事件屬性 onerror, onload等所有on事件, src, href等;

2、通常情況下,需要閉合,比如 ‘, “, , 等;

3、可能包含一些探測關鍵字/函數,比如 xss, alert(1), document.cookie等;

4、通常情況下,在js中需要連接字符,比如註釋後面//, 比如連接可執行js代碼 ;, -,+, /,*, ^, &等;

5、去掉閉合支付之後,是一些可解析執行的js語句或者html語句。

6、……

從安全工程師的角度去分析,我們能發現很多特徵,但是這裏我們需要學習如何把這些特徵轉換爲機器能夠識別的特徵。

作爲文本特徵的提取,首先是分詞,然後對分詞的特徵進行處理。再想辦法把這些特徵進行處理,讓他們變成機器能識別的特徵向量。比較簡單的特徵提取方式就是直接針對敏感字符/關鍵字的個數進行統計和分析,這個更符合統計學的思路,感興趣的朋友可以參考《Web安全之機器學習入門》。

這裏我們嘗試另一種思路,選擇嵌入式詞向量(Word embedding),嵌入式詞向量就是通過學習文本來用詞向量表徵詞的語義信息,通過將詞嵌入空間使得語義相似的詞在空間內的距離接近。

因爲XSS攻擊通常執行的是HTML/JavaScript腳本,是具有一些語義的關聯。這裏我們可以使用嵌入式詞向量模型,建立一個XSS的語義模型,讓機器能夠理解< script>、alert()這樣的語言,這樣看起來更符合人類分析的模式。

首先我們進行分詞:

然後取正樣例中出現次數最多的300個詞,構成詞彙表(其他詞統一用特定的字符如“NSRC”替代),使用gensim模塊的word2vec類處理。

我們可以看看XSS Payload的部分分詞情況:

分類完成,挖掘XSS攻擊

同樣的,我們把正常樣本也進行類似的處理,然後這裏我們使用支持向量機(Support Vector Machines, SVM)算法進行識別。SVM比較適合二分類問題,即我們所說的好/壞的情況。

同樣的,我們把正常樣本也進行類似的處理,然後這裏我們使用支持向量機(Support Vector Machines, SVM)算法進行識別。SVM比較適合二分類問題,即我們所說的好/壞的情況。

SVM是一種監督學習算法,在學習複雜的非線性方程時,能夠提供一種更爲清晰和更加強大的方式。之前很多有使用SVM進行圖片驗證碼識別,識別的效果也是挺不錯的。

而在python中,我們通過直接引入sklearn的svm算法實現即可直接調用:

通過已有的數據測試,SVM數據的準確率基本上是98%,召回率是97%。

這時候我們就開始對日誌進行分析,通過SVM的訓練模型進行查找,確實發現了很多我們之前沒有發現的情況。

對發現的日誌進行人工分析,有些場景的誤報比較多,特別是參數值包含http請求的情況,這個和我們之前提取的特徵有密切關係。

這裏我們通過其他維度分析出的日誌對比可以發現,目前我們使用Word2vec+SVM的算法還是存在一些漏報的情況:

後續

通過前面的機器學習算法,幫助我們順利從日誌中發現了更多的XSS攻擊,雖然還存在一些漏報和誤報的情況,但是已經比之前的一些簡單的規則好了很多。

SVM算法的實現比較簡單,而且性能資源消耗低,不過缺點可能是泛化能力相對較弱,發現問題有限,並不是特別的“智能”,這點通過我們分析的SVM漏報結果就可以發現。

感興趣的朋友可以考慮一下特徵優化和嘗試下其他的算法。

六、總結

​隨着數據的爆發和算力性價比的提升,相信未來機器學習會越來越普及。我們完全把算法看作一個高級工具(並沒有去講解算法本身的複雜原理),來提升安全運維工作的價值。在現實中,上述的技術已經作爲基礎,應用到網易易盾用戶行爲分析和對外的售賣的WAF產品中。

建議

瞭解機器學習,嘗試通過機器學習的視角去了解和解決問題,把機器學習的各種算法當作一個解決問題的工具,就像木工使用錘子一樣,先用起來,再慢慢去了解其原理。

在嘗試機器學習算法時要考慮幾個條件:

1、數據量是否較大;

2、樣本是否足夠;

3、安全工程師判斷成本(是否直觀):比如違禁圖片的標籤是很容易判斷的,而人機識別提取的行爲數據是運營很難直接判斷的,所以後者的成本遠比違禁圖片識別高;

另外,在運維環節可以多嘗試機器學習的算法和模型(離線),不建議在線上落地。線上落地需要比較專業的工程化和機器學習團隊來處理,涉及到成本、效果保證、執行效率、處理結果的相關性以及回放數據對比等一些列因素;

參考:

1、https://www.jianshu.com/p/942d1beb7fdd

2、http://www.webber.tech/posts/%E4%BD%BF%E7%94%A8%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E6%A3%80%E6%B5%8BXSS/

3、《Web安全之機器學習入門》

​​

點擊免費體驗網易易盾音視頻安全解決方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章