Hyperscan在Suricata中的應(yīng)用【轉(zhuǎn)】

轉(zhuǎn)自:http://syswift.com/260.html

Suricata簡介

Hyperscan作為一款高性能的正則表達(dá)式匹配庫,極適用于部署在IDS/IPS等網(wǎng)絡(luò)解決方案中蝇更。
Suricata(https://suricata-ids.org)是一款免費、開源严蓖、成熟鳞绕、快速、健壯的網(wǎng)絡(luò)威脅檢測引擎胳泉,該引擎能夠進(jìn)行實時入侵檢測(IDS)拐叉,嵌入式入侵防御(IPS),網(wǎng)絡(luò)安全監(jiān)控(NSM)和離線pcap處理扇商。Suricata與其競爭對手Snort類似凤瘦,有著相似的設(shè)計和規(guī)則樣式,同樣涉及到大量純字符串及正則表達(dá)式匹配案铺。本文重點介紹Hyperscan在Suricata中的應(yīng)用蔬芥,主要是單字符串匹配和多字符串匹配的基本原理。

image

Hyperscan的應(yīng)用

自Suricata(3.1 release)開始控汉,Hyperscan在支持的平臺作為其單字符串匹配和多字符串匹配的默認(rèn)選項笔诵。另外也有單正則表達(dá)式匹配的試驗工作。

單字符串匹配

Suricata原先使用BM算法做單字符串匹配姑子,使用Hyperscan后乎婿,由Hyperscan中的Noodle引擎替換相關(guān)工作。Noodle充分發(fā)揮SIMD指令優(yōu)勢街佑,通過對輸入數(shù)據(jù)進(jìn)行快速的預(yù)過濾來實現(xiàn)快速的單字符串匹配谢翎,在AVX2、AVX512上能達(dá)到更快的效果沐旨。預(yù)過濾的基本原理其實是使用樸素的shift-and算法森逮。

例如,對單條字符串規(guī)則/Hyperscan/的單模式匹配磁携,取字符串前2字節(jié)做預(yù)過濾吊宋,構(gòu)建2個16字節(jié)的掩碼:


image

運行時每次讀取16字節(jié)輸入數(shù)據(jù),用2次PCMPEQB指令與上述掩碼做逐字節(jié)比較颜武。假設(shè)運行時讀到輸入數(shù)據(jù)為“MATCHmyHyperscan”璃搜,則2次PCMPEQB的結(jié)果為(表中的1實際應(yīng)為0xFF,為表達(dá)簡便標(biāo)記為1):


image

對上述結(jié)果做“shift-and”鳞上,即LSHIFT+AND指令这吻,得到用2個字節(jié)做預(yù)過濾的結(jié)果:


image

預(yù)過濾結(jié)果中出現(xiàn)“1”的位置才是可能產(chǎn)生真實匹配的位置(我們稱之為Positive),我們對這些位置進(jìn)行確認(rèn)篙议,最終生成一個真實匹配(True Positive)唾糯,或者發(fā)現(xiàn)不是真實匹配(False Positive)怠硼。本例中是一個真實匹配。
對AVX2/AVX512環(huán)境移怯,能夠得到更好的表現(xiàn)香璃,因為對AVX2可以構(gòu)建32字節(jié)掩碼且每次讀取32字節(jié)輸入數(shù)據(jù),對AVX512可以構(gòu)建64字節(jié)掩碼且每次讀取64字節(jié)輸入數(shù)據(jù)舟误,完成同樣的預(yù)過濾目標(biāo)所需的指令數(shù)減少了很多葡秒。

多字符串匹配

Suricata原先使用AC算法做多字符串匹配,使用Hyperscan后嵌溢,由Hyperscan中的Teddy/FDR引擎替換相關(guān)工作眯牧。Teddy通常在輕量級多字符串匹配場景下(2-72條字符串)優(yōu)先使用,F(xiàn)DR則用來應(yīng)對極大量字符串的場景赖草。同樣学少,Teddy和FDR使用SIMD指令對輸入數(shù)據(jù)進(jìn)行快速預(yù)過濾,在多字符串匹配場景下秧骑,比單字符串匹配有更好的效果版确。類似的,其預(yù)過濾的基本原理是使用樸素的shift-or算法乎折。
以Teddy為例阀坏,Teddy通常情況下使用字符串中的后3字節(jié)做預(yù)過濾,對多字符串規(guī)則笆檀,根據(jù)每個字符串的后3字節(jié)進(jìn)行分組忌堂,分組上限為8或16組,為表達(dá)輸入數(shù)據(jù)中每個位置的預(yù)過濾結(jié)果酗洒,前者用1字節(jié)(每位各對應(yīng)一組)士修,后者用2字節(jié)。
例如樱衷,對3條字符串規(guī)則:

<textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="color: rgb(0, 0, 0); font-family: Monaco, MonacoRegular, "Courier New", monospace !important; font-size: 12px !important; line-height: 15px !important; margin: 0px; vertical-align: top; background: rgb(255, 255, 255); border: 0px; transition: all 0.3s ease-in-out 0s; padding: 0px 5px; overflow: hidden; width: 638px; box-sizing: border-box; height: 45px; position: absolute; opacity: 0; border-radius: 0px; box-shadow: none; white-space: pre; word-wrap: normal; resize: none; tab-size: 4; z-index: 0;"></textarea>

/Teddy/

/daddy/

/Hyperscan/

根據(jù)后3字節(jié)分為2組:組0 – “ddy”(0x64, 0x64, 0x79)棋嘲,組1 – “can”(0x63, 0x61, 0x6e)。
再根據(jù)3字節(jié)中的6個4位構(gòu)建出6個16字節(jié)掩碼矩桂,初值全1沸移,每個4位有16種可能取值,對應(yīng)16字節(jié)掩碼中的1字節(jié)侄榴,并在該對應(yīng)字節(jié)的對應(yīng)位(組)上貢獻(xiàn)一個0雹锣。6個掩碼依次對應(yīng)最末字節(jié)低4位、高4位(綠色)癞蚕,倒數(shù)第二字節(jié)低4位蕊爵、高4位(橙色),倒數(shù)第三字節(jié)低4位桦山、高4位(藍(lán)色)攒射。為簡化表達(dá)每字節(jié)只記錄本例中兩組對應(yīng)的兩位:


image

運行時每次讀取16字節(jié)輸入數(shù)據(jù)醋旦,并以上述掩碼用PSHUFB指令逐字節(jié)做映射。假設(shè)運行時讀到輸入數(shù)據(jù)為“TeddyinHyperscan”(54 65 64 64 79 69 6e 48 79 70 65 72 73 63 61 6e)会放,則6次PSHUFB的結(jié)果為:


image

結(jié)果中的”0”表示輸入數(shù)據(jù)中每個位置(列)對規(guī)則集后3字節(jié)是否產(chǎn)生匹配饲齐。相同位置只有高4位和低4位均得到相同組的匹配,才是一個完整字節(jié)的匹配咧最。對相同顏色的掩碼做OR得到:


image

對上述結(jié)果做“shift-or”捂人,第一行不變,第二行做LSHIFT左移1字節(jié)窗市,第三行做LSHIFT左移2字節(jié)先慷,然后做OR得到:


image

此為預(yù)過濾的結(jié)果饮笛,其中的”0”表示在該位置出現(xiàn)與某組連續(xù)后3字節(jié)的匹配咨察,是可能產(chǎn)生真實匹配的位置(Positive)。我們對這些位置進(jìn)行確認(rèn)福青,最終找出與候選組中哪個字符串產(chǎn)生了真實匹配(True Positive)摄狱,或者發(fā)現(xiàn)不是真實匹配(False Positive)。本例中在位置4對組0的“Teddy”无午、位置15對組1的“Hyperscan”產(chǎn)生真實匹配媒役。
同樣的,對AVX2環(huán)境宪迟,我們只需把6個掩碼均復(fù)制擴大一倍至32字節(jié)酣衷,且每次讀取32字節(jié)輸入數(shù)據(jù);對AVX512環(huán)境次泽,把掩碼復(fù)制擴大至64字節(jié)穿仪,每次讀取64字節(jié)輸入數(shù)據(jù)。完成相同過濾目標(biāo)的指令數(shù)也減少了很多意荤。

性能數(shù)據(jù)

測試環(huán)境:Intel? Core i7 6700K CPU @ 4.0 GHz
軟件版本:Hyperscan 4.3.1啊片,Suricata 3.1
規(guī)則集:Emerging Threats public set (“emerging-all-20161102.rules”)
ET Pro set (“etpro-all-20161102.rules”)
輸入PCAP文件:Alexa Top 100 browsing PCAP file
測試中我們衡量的是全部處理時間,包括編譯和運行玖像。原生的Suricata使用AC算法做多字符串匹配(MPM)和BM算法做單字符串匹配(SPM)紫谷,使用Hyperscan全部替換后,在Emerging Threats規(guī)則集上獲得1.95x性能提升捐寥,在ET Pro規(guī)則集上獲得2.15x性能提升笤昨。
我們同樣比較了單獨替換多字符串AC算法及單獨替換單字符串BM算法的性能,可見替換AC的性能要好于替換BM的性能握恳,而二者性能又都介于原生和全部替換之間咬腋。各性能數(shù)據(jù)如下圖所示。

image

這是可以預(yù)見的結(jié)果睡互,因為對多模式匹配的良好支持正是Hyperscan的一大優(yōu)勢根竿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陵像,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寇壳,更是在濱河造成了極大的恐慌醒颖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳炎,死亡現(xiàn)場離奇詭異泞歉,居然都是意外死亡,警方通過查閱死者的電腦和手機匿辩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門腰耙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铲球,你說我怎么就攤上這事挺庞。” “怎么了稼病?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵选侨,是天一觀的道長。 經(jīng)常有香客問我然走,道長援制,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任芍瑞,我火速辦了婚禮晨仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拆檬。我一直安慰自己洪己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布秩仆。 她就那樣靜靜地躺著码泛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澄耍。 梳的紋絲不亂的頭發(fā)上噪珊,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音齐莲,去河邊找鬼痢站。 笑死,一個胖子當(dāng)著我的面吹牛选酗,可吹牛的內(nèi)容都是我干的阵难。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼芒填,長吁一口氣:“原來是場噩夢啊……” “哼呜叫!你這毒婦竟也來了空繁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤朱庆,失蹤者是張志新(化名)和其女友劉穎盛泡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娱颊,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡傲诵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了箱硕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴竹。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剧罩,靈堂內(nèi)的尸體忽然破棺而出栓拜,到底是詐尸還是另有隱情,我是刑警寧澤斑响,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布菱属,位于F島的核電站钳榨,受9級特大地震影響舰罚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薛耻,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一营罢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饼齿,春花似錦饲漾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至证鸥,卻和暖如春僚楞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枉层。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工泉褐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸟蜡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓膜赃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揉忘。 傳聞我的和親對象是個殘疾皇子跳座,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348