微信億級(jí)用戶異常檢測(cè)框架的設(shè)計(jì)與實(shí)踐
月活用戶越高的互聯(lián)網(wǎng)產(chǎn)品,被黑產(chǎn)盯上的可能性就越大。在微信的安全生態(tài)里,正是有網(wǎng)絡(luò)黑產(chǎn)的層出不窮,變化多端,才有了微信安全的不斷進(jìn)化。本文將帶你一窺究竟,微信是怎么做異常檢測(cè)框架的?
如何在大規(guī)模數(shù)據(jù)下檢測(cè)異常用戶一直是學(xué)術(shù)界和工業(yè)界研究的重點(diǎn),而在微信安全的實(shí)際生態(tài)中:
- 一方面,黑產(chǎn)作惡手段多變,為了捕捉黑產(chǎn)多變的惡意模式,若采用有監(jiān)督的方法模型可能需要頻繁更新,維護(hù)成本較高;
- 另一方面,通過對(duì)惡意帳號(hào)進(jìn)行分析,我們發(fā)現(xiàn)惡意用戶往往呈現(xiàn)一定的“聚集性”特征,因此這里需要更多地依賴無監(jiān)督或半監(jiān)督的手段對(duì)惡意用戶進(jìn)行檢測(cè)。
然而,微信每日活躍帳號(hào)數(shù)基本在億級(jí)別,如何在有限的計(jì)算資源下從億級(jí)別帳號(hào)中找出可疑帳號(hào)給聚類方案的設(shè)計(jì)帶來了不小的挑戰(zhàn),而本文則是為了解決這一問題的一個(gè)小小的嘗試。
異常檢測(cè)框架設(shè)計(jì)目標(biāo)及核心思路
設(shè)計(jì)目標(biāo)為了滿足在實(shí)際場(chǎng)景檢測(cè)異常用戶的要求,在設(shè)計(jì)初期,我們提出如下設(shè)計(jì)目標(biāo):
- 主要用于檢測(cè)惡意帳號(hào)可能存在的環(huán)境聚集和屬性聚集;
- 方案需要易于融合現(xiàn)有畫像信息等其他輔助信息;
- 方案需要具有較強(qiáng)的可擴(kuò)展性,可直接用于億級(jí)別用戶基數(shù)下的異常檢測(cè)。
核心思路通?;诰垲惖漠惓S脩魴z測(cè)思路是根據(jù)用戶特征計(jì)算節(jié)點(diǎn)之間的相似度,并基于節(jié)點(diǎn)間相似度構(gòu)建節(jié)點(diǎn)相似度連接圖,接著在得到的圖上做聚類,以發(fā)現(xiàn)惡意群體。
然而,簡(jiǎn)單的分析就會(huì)發(fā)現(xiàn)上述方案在實(shí)際應(yīng)用場(chǎng)景下并不現(xiàn)實(shí),若要對(duì)億級(jí)別用戶兩兩間計(jì)算相似度,其時(shí)間復(fù)雜度和空間消耗基本上是不可接受的。
為了解決這一問題,可將整個(gè)用戶空間劃分為若干子空間,子空間內(nèi)用戶相似度較高,而子空間之間用戶之間的相似度則較低,這樣我們就只需要在每個(gè)用戶子空間上計(jì)算節(jié)點(diǎn)相似度,避免相似度較低的節(jié)點(diǎn)對(duì)之間的相似度計(jì)算 (這些邊對(duì)最終聚類結(jié)果影響較低),這樣就能大大地降低計(jì)算所需的時(shí)間和空間開銷。
基于這一想法,同時(shí)考慮到惡意用戶自然形成的環(huán)境聚集和屬性聚集,我們可以根據(jù)環(huán)境以及用戶屬性對(duì)整個(gè)用戶空間進(jìn)行劃分,只在這些子空間上計(jì)算節(jié)點(diǎn)之間的相似度,并基于得到的用戶相似度圖挖掘惡意用戶群體。
此外,直觀上來分析,如果兩個(gè)用戶聚集的維度越“可疑”,則該維度對(duì)惡意聚集的貢獻(xiàn)度應(yīng)該越高,例如,如果兩個(gè)用戶同在一個(gè)“可疑”的 IP 下,相比一個(gè)正常的 IP 而言,他們之間存在惡意聚集的可能性更高。基于這一直覺,為了在每個(gè)用戶子空間內(nèi)計(jì)算用戶對(duì)之間的相似度,可根據(jù)用戶聚集維度的可疑度給每個(gè)維度賦予不同的權(quán)值,使用所有聚集維度的權(quán)值的加權(quán)和作為用戶間的相似度度量。
注:依據(jù)上述思路,需要在屬性劃分后的子空間計(jì)算兩兩用戶之間的相似度,然而實(shí)際數(shù)據(jù)中特定屬性值下的子空間會(huì)非常大,出于計(jì)算時(shí)間和空間開銷的考慮,實(shí)際實(shí)現(xiàn)上我們會(huì)將特別大的 group 按照一定大小 (如 5000)進(jìn)行拆分,在拆分后的子空間計(jì)算節(jié)點(diǎn)相似度。(實(shí)際實(shí)驗(yàn)結(jié)果表明這種近似并不會(huì)對(duì)結(jié)果造成較大影響)
異常檢測(cè)框架設(shè)計(jì)方案
基于上述思路,異常檢測(cè)方案需要解決如下幾個(gè)問題:
- 如何根據(jù)用戶特征 / 使用怎樣的特征將整個(gè)用戶空間劃分為若干子空間?
- 如何衡量用戶特征是否“可疑”?
- 如何根據(jù)構(gòu)建得到的用戶相似度關(guān)系圖找出異常用戶群體?
為了解決以上三個(gè)問題,經(jīng)過多輪的實(shí)驗(yàn)和迭代,我們形成了一個(gè)較為通用的異常檢測(cè)方案,具體異常檢測(cè)方案框架圖如圖 1 所示:
圖 1 異常用戶檢測(cè)框架
如圖 1 所示,首先,用戶空間劃分模塊根據(jù)“劃分屬性”將整個(gè)用戶空間劃分為若干子空間,后續(xù)節(jié)點(diǎn)間相似度的計(jì)算均在這些子空間內(nèi)部進(jìn)行;惡意屬性檢測(cè)模塊則根據(jù)輸入數(shù)據(jù)自動(dòng)自適應(yīng)地識(shí)別用戶特征中的“可疑”值;用戶空間劃分和惡意屬性檢測(cè)完成后,在每個(gè)用戶子空間上,用戶相似度計(jì)算模塊基于惡意屬性檢測(cè)得到的惡意屬性庫(kù)和相應(yīng)的權(quán)重策略計(jì)算用戶之間兩兩之間的相似度,對(duì)于每個(gè)特征以及其對(duì)應(yīng)的不同的可疑程度,權(quán)重策略模塊會(huì)為其分配相應(yīng)的權(quán)重值,用戶間邊的權(quán)重即為節(jié)點(diǎn)所有聚集項(xiàng)權(quán)重的加權(quán)和,為了避免建邊可能帶來的巨大空間開銷,方案僅會(huì)保留權(quán)值大于一定閾值的邊;得到上一步構(gòu)建得到的用戶相似度關(guān)系圖后,可使用常用的圖聚類算法進(jìn)行聚類,得到可疑的惡意用戶群體。
用戶空間劃分
為了進(jìn)行節(jié)點(diǎn)間相似度的計(jì)算,首先需要將整個(gè)用戶空間劃分到不同的子空間中去,那么這些用于劃分的屬性該如何選取呢?經(jīng)過一系列的實(shí)驗(yàn)和分析,我們將用戶特征劃分為以下兩類:
- 核心特征:核心特征指黑產(chǎn)帳號(hào)若要避免聚集,需要付出較大的成本的特征,主要包括一些環(huán)境特征;
- 支撐特征:支撐特征指黑產(chǎn)帳號(hào)若要避免聚集,改變所需成本較小的特征。
不難發(fā)現(xiàn),對(duì)于上述核心特征,黑產(chǎn)規(guī)避的成本較大,所以在具體的劃分屬性的選取上,我們使用核心特征對(duì)用戶空間進(jìn)行劃分,并在劃分得到的子空間上計(jì)算節(jié)點(diǎn)對(duì)之間的相似度。在子空間上計(jì)算節(jié)點(diǎn)之間的相似度時(shí),我們引入支撐特征進(jìn)行補(bǔ)充,使用核心特征和支撐特征同時(shí)計(jì)算用戶之間的相似度,以提高惡意判斷的準(zhǔn)確率和覆蓋率。
何為“可疑”
可疑屬性提取
在確定劃分屬性后,一個(gè)更為重要的問題是如何確定哪些用戶屬性值是可疑的?這里我們主要對(duì)用戶脫敏后的登錄環(huán)境信息進(jìn)行分析,依賴微信安全中心積累多年的環(huán)境畫像數(shù)據(jù),通過對(duì)用戶屬性值的出現(xiàn)頻次、分布等維度進(jìn)行分析,提取出一些可疑的屬性值。
多粒度的可疑屬性識(shí)別
在進(jìn)行養(yǎng)號(hào)識(shí)別的實(shí)驗(yàn)過程中,我們發(fā)現(xiàn),單純依靠若干天登錄數(shù)據(jù)的局部信息進(jìn)行養(yǎng)號(hào)檢測(cè)往往無法達(dá)到較高的覆蓋率。為了解決這一問題,在可疑屬性提取過程中,我們會(huì)融合安全中心現(xiàn)有的環(huán)境畫像信息以及反垃圾數(shù)據(jù)等全局信息輔助進(jìn)行判斷,局部信息和全局信息的融合有以下兩個(gè)好處:
- 融合局部信息和全局信息,可增大可疑屬性判斷的置信度和覆蓋度,提高算法覆蓋率;
- 增加了用戶相似度計(jì)算設(shè)計(jì)上的靈活度,如若特定帳號(hào)與已封號(hào)帳號(hào)有邊相連,可通過賦予該邊額外的權(quán)重來加大對(duì)已知惡意用戶同環(huán)境帳號(hào)的打擊。
惡意用戶識(shí)別
我們將超過一定閾值的用戶視為惡意用戶,其中,閾值可根據(jù)不同閾值得到的算法的準(zhǔn)確率和覆蓋率選取一個(gè)合適的閾值。
另,處于性能和可擴(kuò)展考慮,我們使用 Connected Components 算法來識(shí)別可疑的用戶團(tuán)體,同時(shí),得到惡意團(tuán)體后我們會(huì)對(duì)團(tuán)體進(jìn)行分析,提取在團(tuán)體維度存在聚集性的屬性值,以增強(qiáng)模型的可解釋性。
從百萬到億——異常檢測(cè)框架性能優(yōu)化之路
初步實(shí)驗(yàn)時(shí),我們隨機(jī)抽取了百萬左右的用戶進(jìn)行實(shí)驗(yàn),為了將所提方案擴(kuò)展到全量?jī)|級(jí)別用戶上,挖掘可疑的用戶群體,我們做了如下優(yōu)化:
Spark 性能優(yōu)化
在基于 Spark 框架實(shí)現(xiàn)上述異常檢測(cè)框架的過程中,我們也碰到了 Spark 大數(shù)據(jù)處理中常見的問題 —— 數(shù)據(jù)傾斜。分析上述異常檢測(cè)方案不難發(fā)現(xiàn),方案實(shí)現(xiàn)中會(huì)涉及大量的 groupByKey,aggregateByKey,reduceByKey 等聚合操作,為了規(guī)避聚合操作中數(shù)據(jù)傾斜對(duì) Spark 性能的影響,實(shí)際實(shí)現(xiàn)中我們主要引入了以下兩個(gè)策略:兩階段聚合和三階段自適應(yīng)聚合。
兩階段聚合
如圖 3 所示,兩階段聚合將聚合操作分為兩個(gè)階段:局部聚合和全局聚合。第一次是局部聚合,先給每個(gè) key 都打上一個(gè)隨機(jī)數(shù),比如 10 以內(nèi)的隨機(jī)數(shù),此時(shí)原先一樣的 key 就變成不一樣的了,比如 (hello, 1) (hello, 1) (hello, 1) (hello, 1) 就會(huì)變成 (1_hello, 1) (1_hello, 1) (2_hello, 1) (2_hello, 1)。接著對(duì)打上隨機(jī)數(shù)后的數(shù)據(jù),執(zhí)行 reduceByKey 等聚合操作,進(jìn)行局部聚合,得到局部聚合結(jié)果 (1_hello, 2) (2_hello, 2)。然后將各個(gè) key 的前綴給去掉,得到 (hello,2),(hello,2),再次進(jìn)行全局聚合操作,即可得到最終結(jié)果 (hello, 4)。
圖 3 兩階段聚合
三階段自適應(yīng)聚合
用戶空間劃分階段我們需要將整個(gè)用戶空間根據(jù)劃分屬性劃分為若干個(gè)子區(qū)間,實(shí)際實(shí)驗(yàn)時(shí)我們發(fā)現(xiàn)在億級(jí)別數(shù)據(jù)下,使用兩階段聚合,也會(huì)出現(xiàn)特定 key 下的數(shù)據(jù)量特別大的情況,導(dǎo)致 Spark 頻繁 GC,程序運(yùn)行速度極其緩慢,甚至根本無法得到聚合后的結(jié)果。
為了解決這一問題,注意到通過劃分屬性進(jìn)行劃分后,仍然會(huì)將特別大的 group 按照一定大小進(jìn)行切割,那么直接在聚合過程中融合這一步驟不就可以了么,這樣就能解決特定屬性值下數(shù)據(jù)特別多的情形,也能極大地提升算法運(yùn)行效率。
三階段自適應(yīng)聚合分為以下四個(gè)階段:
- 隨機(jī)局部聚合:設(shè)定一個(gè)較大的數(shù)(如 100),參照兩階段聚合第一階段操作給每個(gè) key 打上一個(gè)隨機(jī)數(shù),對(duì)打上隨機(jī)數(shù)后的 key 進(jìn)行聚合操作;
- 自適應(yīng)局部聚合:經(jīng)過隨機(jī)局部聚合后,可獲取每個(gè)隨機(jī) key 下的記錄條數(shù),通過單個(gè)隨機(jī) key 下的記錄條數(shù),我們可以對(duì)原 key 下的數(shù)據(jù)條數(shù)進(jìn)行估算,并自適應(yīng)地調(diào)整第二次局部聚合時(shí)每個(gè)原始 key 使用的隨機(jī)數(shù)值;
- 第二輪隨機(jī)局部聚合;根據(jù)自適應(yīng)計(jì)算得到的隨機(jī)數(shù)繼續(xù)給每個(gè) key 打上隨機(jī)數(shù),注意此時(shí)不同 key 使用的隨機(jī)數(shù)值可能是不同的,并對(duì)打上隨機(jī)數(shù)后的 key 進(jìn)行第二輪局部聚合;
- 全局聚合:經(jīng)過第二輪隨機(jī)局部聚合后,若特定 key 下記錄數(shù)超過設(shè)定閾值 (如 5000),則保留該結(jié)果,不再進(jìn)行該階段全局聚合;否則,則將隨機(jī) key 還原為原始 key 值,進(jìn)行最后一階段的全局聚合。
Faster, Faster, Faster
經(jīng)過以上調(diào)優(yōu)后,程序運(yùn)行速度大致提升了 10 倍左右。然而,在實(shí)驗(yàn)中我們發(fā)現(xiàn)當(dāng)對(duì)億級(jí)別用戶進(jìn)行相似度計(jì)算并將邊按閾值過濾后,得到的邊數(shù)仍然在百億級(jí)別,占用內(nèi)存空間超過 2T。那么我們有沒有可能減小這一內(nèi)存占用呢?答案是肯定的。
通過對(duì)整個(gè)異常用戶檢測(cè)流程進(jìn)行細(xì)致的分析,我們發(fā)現(xiàn)我們并不需要對(duì)子空間內(nèi)所有用戶對(duì)進(jìn)行相似度計(jì)算,通過前期實(shí)驗(yàn)我們發(fā)現(xiàn)當(dāng)用戶可疑度超過 0.7 時(shí),基本就可以判定該用戶是惡意用戶。根據(jù)用戶可疑度計(jì)算公式反推,當(dāng)節(jié)點(diǎn)關(guān)聯(lián)邊的權(quán)重超過 18.2 時(shí),其在最后結(jié)果中的權(quán)值就會(huì)超過 0.7,基于這一想法,我們引入了動(dòng)態(tài) Dropping 策略。
動(dòng)態(tài) Dropping 策略
引入 HashMap 保存當(dāng)前子空間每個(gè)節(jié)點(diǎn)的累計(jì)權(quán)重值,初始化為 0.0;按照原始算法依次遍歷子空間下的節(jié)點(diǎn)對(duì),若節(jié)點(diǎn)對(duì)兩個(gè)節(jié)點(diǎn)累計(jì)權(quán)重值均超過閾值(18.2),則跳過該節(jié)點(diǎn)對(duì)權(quán)值計(jì)算,否則則根據(jù)原始算法計(jì)算節(jié)點(diǎn)對(duì)權(quán)重,并累加到 HashMap 中,更新關(guān)聯(lián)節(jié)點(diǎn)的累積權(quán)重值。
引入動(dòng)態(tài) Dropping 策略后,對(duì)于較大的用戶子空間,程序會(huì)跳過超過 90% 的節(jié)點(diǎn)對(duì)的相似度計(jì)算,極大地減少了計(jì)算量;同時(shí),億級(jí)別用戶相似度計(jì)算生成的邊的內(nèi)存占用從原來超過 2T 降到 50G 左右,也極大地降低了程序所需內(nèi)存占用。
圖劃分策略
通過相似度計(jì)算得到的用戶相似度關(guān)系圖節(jié)點(diǎn)分布是極不均勻的,大部分節(jié)點(diǎn)度數(shù)較小,少部分節(jié)點(diǎn)度數(shù)較大,對(duì)于這種分布存在嚴(yán)重傾斜的網(wǎng)絡(luò)圖,圖劃分策略的選擇對(duì)圖算法性能具有極大影響。為了解決這一問題,我們使用 EuroSys 2015 Best Paper 提出的圖劃分算法 HybridCut 對(duì)用戶相似度關(guān)系圖進(jìn)行劃分。
圖 4 HybridCut 圖劃分算法
如圖 4 所示,HybridCut 圖劃分算法根據(jù)節(jié)點(diǎn)度數(shù)的不同選取差異化的處理策略,對(duì)于度數(shù)較低的節(jié)點(diǎn),如節(jié)點(diǎn) 2,3,4,5,6,為了保證局部性,算法會(huì)將其集中放置在一起,而對(duì)于度數(shù)較高的節(jié)點(diǎn),如 1,為了充分利用圖計(jì)算框架并行計(jì)算的能力,算法會(huì)將其對(duì)應(yīng)的邊攤放到各個(gè)機(jī)器上。
通過按節(jié)點(diǎn)度數(shù)對(duì)節(jié)點(diǎn)進(jìn)行差異化的處理,HybridCut 算法在局部性和算法并行性上達(dá)到了較好的均衡。以上僅對(duì) HybridCut 算法基本思路進(jìn)行粗略的介紹,更多算法細(xì)節(jié)請(qǐng)參閱論文 PowerLyra: Differentiated Graph Computation and Partitioning on Skewed Graphs。
總結(jié)和討論
優(yōu)點(diǎn)與不足
優(yōu)點(diǎn)
上述異常用戶檢測(cè)框架具有如下優(yōu)點(diǎn):
- 能夠較好地檢測(cè)惡意用戶可能存在的環(huán)境聚集和屬性聚集,且具有較高的準(zhǔn)確率和覆蓋率;
- 能夠自然地融合畫像信息以及反垃圾信息,通過融合不同粒度的信息,可提高算法的覆蓋率,同時(shí)也給算法提供了更大的設(shè)計(jì)空間,可以按需選擇使用的特征或信息;
- 良好的擴(kuò)展性,可直接擴(kuò)展到億級(jí)別用戶進(jìn)行惡意用戶檢測(cè),且算法具有較高的運(yùn)行效率。
不足
- 無法對(duì)非環(huán)境和屬性聚集的惡意用戶進(jìn)行檢測(cè) (當(dāng)然,這也不在方案的設(shè)計(jì)目標(biāo)里),無法處理惡意用戶使用外掛等手段繞過環(huán)境和屬性聚集檢測(cè)的情況;
- 上述方案權(quán)重策略部分需要人工指定權(quán)重,這無疑增加了人工調(diào)參的工作量,若黑產(chǎn)惡意模式或使用特征發(fā)生較大的變更,則可能需要對(duì)權(quán)重重新進(jìn)行調(diào)整,維護(hù)成本較高。
Next…
- 探索自動(dòng)化的權(quán)重生成策略,以應(yīng)對(duì)可能的特征或黑產(chǎn)模式變更;
- 是否可以根據(jù)聚類過程中的信息生成規(guī)則,用于實(shí)時(shí)惡意打擊;
- 上述方案比較適合用來檢測(cè)惡意用戶可能存在的環(huán)境聚集和屬性聚集,對(duì)于非環(huán)境和屬性聚集的惡意類型則顯得無能為力了 (一種可能的方案是將連續(xù)屬性離散化,不過這樣太不優(yōu)雅了!),因此后續(xù)我們會(huì)嘗試從行為維度對(duì)用戶行為進(jìn)行分析,并構(gòu)建相應(yīng)的打擊模型。
參考文獻(xiàn)
- Chen R, Shi J, Chen Y, et al. PowerLyra: differentiated graph computation and partitioning on skewed graphs[C]// Tenth European Conference on Computer Systems. ACM, 2015:1.
- Spark 性能優(yōu)化指南——高級(jí)篇 https://tech.meituan.com/spark-tuning-pro.html
作者:青原行思(微信安全)/李琦、元東、苗園莉(清華大學(xué)深圳研究生院)
來源:微信公眾號(hào):騰訊大講堂(ID:TX_DJT)
題圖來自PEXELS,基于CC0協(xié)議
看不懂你說的 ?