實用技術乾貨!教你用機器學習提高日常安全運維工作中的效率
作者介紹:黃龍,網易易盾資深安全工程師,專注於網際網路安全,擅長安全攻防對抗和甲方安全建設,擁有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的漏報情況,安全運維人員或多或少都做過以下一些工作:
- 比較簡單的做法可能就是不停的蒐集各種攻擊的Payload,進行攻擊測試;
- 除了蒐集Payload外,深入一點的做法一般是通過梳理關鍵字/特徵從ES或者HDFS提取疑似攻擊日誌,進行人工分析;
- 隨著大資料平臺和威脅情報的發展,再進一步的方式會考慮將已經發現攻擊的IP和威脅情報的掃描IP的對應的請求進行梳理,進行二次分析;
- 比較理想的做法是對全量日誌進行分析,提取攻擊行為日誌,根據日誌提取特徵。
這裡我們會發現,隨著日誌量的越來越大,依賴人肉分析大量資料是不現實的。雖然抽樣分析和正則或規則匹配也是一種折中方案,但是會存在一定的遺漏風險。這個時候,我們需要通過一些更優的方案和工具,能夠快速高效地從海量資料中發現更多未知的問題,而機器學習很可能就是我們的答案。
二、AI賦能安全運維工作初探
安全與機器學習
目前在安全領域已經有很多方向嘗試藉助機器學習來解決問題,如惡意軟體檢測、違規圖片識別,垃圾郵件識別,UEBA等。
機器學習在垃圾郵件、風控系統和違禁圖片識別方向是效果比較顯著的,比如對違禁圖片進行打標,通過機器學習進行自動分類:
現階段,大部分機器學習僅僅是融入到各種安全產品中,而在基礎安全領域並沒有得到很好的利用。一方面是機器學習本身有一定的成本,在日常運維中使用有一定的門檻;另一方面在基礎安全領域的機器學習的效果受制於樣本的限制,比如在Webshell的檢測中,我們發現現有的Webshell樣本是遠遠不夠的,有些時候我們會在實踐過程中發現,演算法的準確性還不如一些簡單的規則。
實際上,並不是所有的場景都適合現階段的機器學習落地,這裡我們先來關注一些適合機器學習的場景,比如大量日誌資料的處理和分析。
前面的分析我們已經知道,面對大量日誌的分析和處理,我們之前使用的初級工具(shell命令、python指令碼等)和中級工具(ES搜尋、HiveSQL等)等都已經滿足不了我們的需求了,這時候我們就需要使用機器學習這個高階工具了。
三、通過日誌分析發現異常使用者
背景介紹
日誌分析和審計在安全運維工作中經常遇到,這裡我們考慮一個很簡單的日誌審計需求:有一個業務,提供了敏感介面的訪問日誌,需要安全工程師發現哪些人有問題。
針對這類問題,目前比較常見的分析方式主要是基於統計方式,最常見的就是頻次統計,比如每個員工的訪問閾值是100次/天,當超過了100次我們就報警。這類的分析統計實現是比較簡單的,通過時間視窗來實現。
這裡,為了展示方便,我選取了一個訪問量小的業務,用其中一個功能的訪問日誌做說明。
簡單分析
日誌記錄的主要資訊是:誰在什麼時間在什麼地點 對誰幹了什麼事情?
這裡面,每一個維度可以單獨分析,同時也可以聯合分析,很多時候結果完全依賴於運營人員的經驗或者是系統的規則。
通常情況下,我們分析的維度包括:
- 頻率:單個使用者在一段時間範圍內的行為超過了某個閾值;
- 時域:在特定的時間做這件事情,如在凌晨3點,下載了3份檔案;
- 地點:通常情況是IP,這裡可以和威脅情報做Join,也可以根據業務做分析,比如是員工通過一臺美國的伺服器訪問了xx系統;
這些條件還可以組合,綜合一些規則條件來處理。當然,再複雜一點就是一個簡單的日誌行為分析系統了。
我們考慮一些場景,如果是一些應急的分析需求,日誌量有不小,我們怎麼來快速進行分析呢?或者是已經有很多日誌資料了,因為資料量太大而沒有利用起來,我們是否能挖掘其中的價值呢?
這裡我們嘗試使用機器學習的演算法來進行一些分析。
具體例項——發現異常使用者
很多時候,我們的需求是發現異常使用者行為,所以需要有工具幫助我們快速提取異常的使用者行為。有過日誌分析經驗的同學應該會有這樣的經驗:通常情況下,大部分的使用者基本都是正常請求;有部分使用者的請求是異常;但是異常的情況之間往往有很大的差異。簡單來說就是正常的人都差不多,奇葩的人可能有各種奇葩。那麼,我們怎麼去提取這些“奇葩”呢?
最理想的情況就是通過機器學習的演算法,直接區分出正常和異常的使用者。正如我們前面提到的,異常的情況可能是多種多樣,所以這裡我們不能簡單的進行二分類,而是考慮使用聚類演算法,先進行分類,再針對各類的使用者進行鍼對性的分析,這裡我們嘗試使用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攻擊通常如下:
- 很可能包含一些HTML標籤或者事件屬性,比如html標籤<script>, <img>, <style>等,比如事件屬性 onerror, onload等所有on事件, src, href等;
- 通常情況下,需要閉合,比如 ‘, “, </script>, </textarea>等;
- 可能包含一些探測關鍵字/函式,比如 xss, alert(1), document.cookie等;
- 通常情況下,在js中需要連線字元,比如註釋後面//, 比如連線可執行js程式碼 ;, -,+, /,*, ^, &等;
- 去掉閉合支付之後,是一些可解析執行的js語句或者html語句。
- ……
從安全工程師的角度去分析,我們能發現很多特徵,但是這裡我們需要學習如何把這些特徵轉換為機器能夠識別的特徵。
作為文字特徵的提取,首先是分詞,然後對分詞的特徵進行處理。再想辦法把這些特徵進行處理,讓他們變成機器能識別的特徵向量。比較簡單的特徵提取方式就是直接針對敏感字元/關鍵字的個數進行統計和分析,這個更符合統計學的思路,感興趣的朋友可以參考《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比較適合二分類問題,即我們所說的好/壞的情況。
而在python中,我們通過直接引入sklearn的svm演算法實現即可直接呼叫:
通過已有的資料測試,SVM資料的準確率基本上是98%,召回率是97%。
這時候我們就開始對日誌進行分析,通過SVM的訓練模型進行查詢,確實發現了很多我們之前沒有發現的情況。
對發現的日誌進行人工分析,有些場景的誤報比較多,特別是引數值包含http請求的情況,這個和我們之前提取的特徵有密切關係。
這裡我們通過其他維度分析出的日誌對比可以發現,目前我們使用Word2vec+SVM的演算法還是存在一些漏報的情況:
後續
通過前面的機器學習演算法,幫助我們順利從日誌中發現了更多的XSS攻擊,雖然還存在一些漏報和誤報的情況,但是已經比之前的一些簡單的規則好了很多。
SVM演算法的實現比較簡單,而且效能資源消耗低,不過缺點可能是泛化能力相對較弱,發現問題有限,並不是特別的“智慧”,這點通過我們分析的SVM漏報結果就可以發現。
感興趣的朋友可以考慮一下特徵優化和嘗試下其他的演算法。
六、總結
隨著資料的爆發和算力價效比的提升,相信未來機器學習會越來越普及。我們完全把演算法看作一個高階工具(並沒有去講解演算法本身的複雜原理),來提升安全運維工作的價值。在現實中,上述的技術已經作為基礎,應用到網易易盾使用者行為分析和對外的售賣的WAF產品中。
建議
瞭解機器學習,嘗試通過機器學習的視角去了解和解決問題,把機器學習的各種演算法當作一個解決問題的工具,就像木工使用錘子一樣,先用起來,再慢慢去了解其原理。
在嘗試機器學習演算法時要考慮幾個條件:
- 資料量是否較大;
- 樣本是否足夠;
- 安全工程師判斷成本(是否直觀):比如違禁圖片的標籤是很容易判斷的,而人機識別提取的行為資料是運營很難直接判斷的,所以後者的成本遠比違禁圖片識別高;
- 另外,在運維環節可以多嘗試機器學習的演算法和模型(離線),不建議線上上落地。線上落地需要比較專業的工程化和機器學習團隊來處理,涉及到成本、效果保證、執行效率、處理結果的相關性以及回放資料對比等一些列因素;
參考:
- https://www.jianshu.com/p/942d1beb7fdd
- 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/
- 《Web安全之機器學習入門》
相關文章
- 提高 MongoDB 運維效率的實用技巧2023-04-19MongoDB運維
- 用數字孿生技術提高機器人教學效率2022-07-26機器人
- 用行雲管家實現IT統一運維管理,提高運維效率2023-11-29運維
- 乾貨分享:容器 PaaS 新技術架構下的運維實踐2018-11-22架構運維
- 運維乾貨 | 12 個實用的 Vim 使用技巧2018-11-23運維
- 【機器學習】機器學習面試乾貨精講2018-03-29機器學習面試
- shell-【技術乾貨】工作中編寫shell指令碼實踐2019-09-06指令碼
- 超實用的乾貨分享給大家,提高工作效率的Excel技巧!2018-11-08Excel
- 乾貨!運維必知的9種高效能技術架構2019-02-20運維架構
- 自學linux運維改怎麼學習Linux運維技術?2021-05-24Linux運維
- 學習Linux運維技術的都有哪些人?運維基礎2021-03-12Linux運維
- 如何快速應用機器學習技術?2018-05-11機器學習
- 如何提高網路安全技術?如何更好學習web安全2021-03-17Web
- 【乾貨】機器學習和深度學習概念入門2018-12-31機器學習深度學習
- Android日常學習:Android Hook技術小實踐2019-11-14AndroidHook
- 只有老運維人才能懂的運維乾貨2020-07-27運維
- 從百度運維實踐談“基於機器學習的智慧運維”2018-03-16運維機器學習
- ES6 在日常工作中的運用2018-03-24
- 機器學習-搜尋技術:從技術發展到應用實戰的全面指南2023-12-13機器學習
- 機器學習的技術原理、應用與挑戰2024-04-01機器學習
- 學術乾貨|深入淺出解讀 Java 虛擬機器的差別測試技術2019-01-07Java虛擬機
- 機器學習-ROC曲線:技術解析與實戰應用2023-12-04機器學習
- 分享一個提高運維效率的 Python 指令碼2023-05-09運維Python指令碼
- 【乾貨】Linux運維人員必備的實用工具!2023-12-28Linux運維
- 虛擬機器上學習Linux運維?學linux有什麼用2019-12-23虛擬機Linux運維
- 學習運維技術要掌握哪些知識點?2020-11-19運維
- Linux運維可以自學嗎?Linux運維技術2020-09-02Linux運維
- 乾貨!學習 Python 的 14 張思維導圖2019-01-25Python
- 【機器學習】乾貨丨機器學習知識點;機器學習模型的“可解釋性”到底有多重要?2018-03-14機器學習模型
- 乾貨分享|僅需六步,加速提高DevOps效率2021-01-08dev
- 怎樣才能快速學習Linux技術?高效學linux運維2021-04-02Linux運維
- 如何提高Java學習效率2020-09-25Java
- 如何以零基礎快速學習Linux運維技術?Linux技術2020-09-03Linux運維
- Shell在日常工作中的應用實踐2023-04-20
- 乾貨 | 知識圖譜的技術與應用2019-11-20
- Shell陣列是什麼?Linux運維技術學習2020-08-20陣列Linux運維
- 會Linux技術可以做什麼?Linux運維學習2020-07-14Linux運維
- 機器學習在美團配送系統的實踐:用技術還原真實世界2018-12-16機器學習