Facebook引入Haskell升級Sigma防禦系統

weixin_33763244發表於2015-07-07

Facebook的Sigma防禦系統主要用來主動識別垃圾郵件、釣魚攻擊以及惡意連結等,並自動將其從網路中刪除。隨著網站內容和使用者數量的極速增長,之前設計的Sigma系統漸漸不能滿足網站的需求。Facebook利用兩年時間對Sigma進行了升級,用Haskell語言替代了FXL(Feature eXtraction Language)語言對Sigma進行了重新程式設計。接下來,本文就Sigma升級的相關內容進行簡要介紹。

\\

作為Facebook的防禦系統,Sigma實際上就是一個規則引擎。對於網站上的每一個互動,它都會呼叫一系列相關的規則對這次互動的安全性進行評估。其中,這些規則主要包含了惡意攻擊的相關模式。一旦互動中的內容符合了某個惡意攻擊的規則定義,Sigma就認定其為惡意內容,禁止發到網站中。這樣,Sigma就可以在攻擊發生前識別並加以阻止。為了能夠應對新出現的攻擊模式,Sigma中的規則集需要不斷變化。這就要求Facebook團隊不斷分析網路中的攻擊模式,並相應的修改規則集,以達到防禦新型攻擊的目的。

\\

最初,Sigma採用了Facebook自己推出的FXL語言。作為Facebook為對抗垃圾郵件而在2013年推出的程式語言,FXL能夠滿足當時Sigma的需求。然而,隨著網站的迅速發展,FXL已經很難應對迅速擴大和日益複雜的規則集。它針對使用者自定義的資料型別和模組缺乏某種抽象裝置,而且基於翻譯器的實現使得其處理速度也滿足不了需求。Facebook迫切需要一種能夠在效能和表達性方面有良好表現的程式語言。該語言需要具備以下特性:純函式式和強型別、能夠自動打包和隱藏資料提取動作、在短時間內完成產品中程式碼的升級和更迭、極佳的效能以及支援互動式開發等。通過篩選,Facebook發現Haskell最能符合這些要求——它是一個純函式式、強型別的語言,有著成熟的編譯器和互動式的環境(GHCi);Haskell還擁有所需要的所有抽象裝置、豐富的庫集合以及活躍的開發者社群。然而,Haskell並不能滿足所有的特性需求——自動打包/並行處理資料提取和編譯後程式碼的熱替換。Facebook團隊還需要想辦法解決這些問題。

\\

為了支援自動打包和並行資料提取,Facebook建立了Haxl框架。Haxl能夠把多個資料提取操作進行自動打包和並行執行。目前,Haxl已經開源,其程式碼依託在GitHub中。此外,Facebook團隊在GHC中設計和實現了Applicative donotation,使得編譯器可以自動發掘序列程式碼中的並行性。接下來,有關編譯後程式碼熱交換的問題。每次有新的規則加入到版本庫時,Facebook團隊都希望能夠在Sigma執行中儘快把規則更新到每一臺機器。一般來說,在一個程式執行過程中動態修改其程式碼是一件很難的事情。然而,Facebook團隊通過認真分析,發現了一個關鍵的現象——Sigma接收的請求壽命都很短暫。這樣,系統只需要把新的請求送到新的程式碼,而老的程式碼可以在執行完正在服務的請求後再拋棄即可。Facebook使用了GHC內建的執行時聯結器進行載入和解除安裝程式碼。在解除安裝老版本的程式碼時,垃圾收集器(Garbage Collector,GC)也會參與其中。GC會探測到什麼時候老的程式碼不再被新的請求使用,從而指導相關人員進行安全解除安裝。

\\

解決以上兩個問題後,Facebook就順利採用了Haskell進行Sigma的編寫。在程式碼設計中,Haskell位於兩個C++層中間。因為C++ thrift伺服器更加成熟、高效能,而且支援更多特性,頂層的伺服器層採用C++。在有需要時,它會呼叫下層的Haskell。而在最底層,C++客戶端程式碼負責與其他內部的服務進行通訊。為了減少負擔,Facebook利用Haskell的FFI(Foreign Function Interface)把Haxl資料來源中的每一個C++客戶端封裝起來,方便上層呼叫。

\\

最後,Facebook針對25種最常見的請求型別(基本覆蓋了Sigma 95%左右的典型負載),比較了基於Haskell和FXL的系統的處理能力。結果表明,Haskell在最好情況下能夠比FXL快3倍左右,吞吐量平均高20%-30%。Facebook團隊還在GHC中實現了分配限制機制(Allocation Limit)。該機制會在一個執行緒結束之前對其能夠使用的記憶體數量進行鑑定,防止一個單獨的請求佔用太多的資源。一旦一個執行緒長期佔用最大限額的資源,Haskell會以非同步例外(Asynchronous Exception)的形式來放棄本次請求。而且,Facebook團隊構建了一個互動式的環境和自己的包源Stackage,提高工作效率。

\\

目前,Facebook已經開始使用Haskell編寫而成的Sigma進行大規模對抗垃圾資訊或其他攻擊的活動。據透露,使用Haskell的Sigma工作效能良好,可靠性強。Facebook的軟體工程師Simon Marlow表示,Haskell並不是那麼順理成章的選擇。在這升級過程中,Facebook的後端安全團隊經歷了很多困難,也收穫了很多經驗。

\\

感謝徐川對本文的審校。

\

給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至editors@cn.infoq.com。也歡迎大家通過新浪微博(@InfoQ@丁曉昀),微信(微訊號:InfoQChina)關注我們,並與我們的編輯和其他讀者朋友交流(歡迎加入InfoQ讀者交流群06e1fec4a87eca3142d54d09844c629f.png)。

相關文章