1、前言
最近工作需要對網(wǎng)站的關(guān)鍵字進(jìn)行檢測,找出敏感詞。這個過程需要對報(bào)文進(jìn)行收集、解碼、檢測和記錄日志。當(dāng)前只是簡單實(shí)現(xiàn)功能,根據(jù)關(guān)鍵字進(jìn)行簡單的匹配,而沒有進(jìn)行關(guān)鍵字的語義分析。導(dǎo)致的結(jié)果就是JAVA可以匹配AV這個敏感關(guān)鍵字。報(bào)文檢測這方面,開源項(xiàng)目已經(jīng)做得非常好了,我所了解的有snort、suircata、bro,這三個都是非常優(yōu)秀的IDS(入侵檢測系統(tǒng))。由于對bro沒有深入了解,我們對比了snort和suricata,結(jié)合suricata的多線程和模塊化,全面兼容snort規(guī)則,我們選用了suricata進(jìn)行關(guān)鍵字檢測。
剛開始接觸suricata的時候,壓根不知道這個單詞怎么發(fā)音,于是乎趕緊再詞典上查一下。suircata是一款支持IDS、IPS和NSM的系統(tǒng)。關(guān)于suircata的詳細(xì)介紹可以參考官網(wǎng):https://suricata-ids.org/。
備注:
IDS:英文“Intrusion Detection Systems”的縮寫,中文意思是“入侵檢測系統(tǒng)”。依照一定的安全策略,通過軟、硬件,對網(wǎng)絡(luò)、系統(tǒng)的運(yùn)行狀況進(jìn)行監(jiān)視,盡可能發(fā)現(xiàn)各種攻擊企圖、攻擊行為或者攻擊結(jié)果,以保證網(wǎng)絡(luò)系統(tǒng)資源的機(jī)密性、完整性和可用性。
IPS是英文“Intrusion Prevention System”的縮寫,中文意思是入侵防御系統(tǒng)。隨著網(wǎng)絡(luò)攻擊技術(shù)的不斷提高和網(wǎng)絡(luò)安全漏洞的不斷發(fā)現(xiàn),傳統(tǒng)防火墻技術(shù)加傳統(tǒng)IDS的技術(shù),已經(jīng)無法應(yīng)對一些安全威脅。在這種情況下,IPS技術(shù)應(yīng)運(yùn)而生,IPS技術(shù)可以深度感知并檢測流經(jīng)的數(shù)據(jù)流量,對惡意報(bào)文進(jìn)行丟棄以阻斷攻擊,對濫用報(bào)文進(jìn)行限流以保護(hù)網(wǎng)絡(luò)帶寬資源。
NSM:英文“network security monitoring”的縮寫,中文意思是“網(wǎng)絡(luò)安全監(jiān)控”。
2、總體架構(gòu)
報(bào)文檢測系統(tǒng)通常四大部分,報(bào)文獲取、報(bào)文解碼、報(bào)文檢測、日志記錄;suricata不同的功能安裝模塊劃分,一個模塊的輸出是另一個模塊的輸入,suricata通過線程將模塊串聯(lián)起來。

接下來以IDS為例來說明suircata的線程與模塊之間是如何連接起來的。
首先注冊runmods,運(yùn)行方式指定suricata獲取報(bào)文的方式,例如libpcap、netmap、af-packet等,代碼如下圖所示:

 

然后再根據(jù)設(shè)置suricata的工作模式,找到對應(yīng)獲取報(bào)文的處理模塊。suircata默認(rèn)是通過af-packet mmap獲取報(bào)文,然后調(diào)用獲取報(bào)文模塊當(dāng)然入口函數(shù),
入口函數(shù)中函數(shù)添加了解碼模塊、流處理模塊(檢測報(bào)文)、日志處理模塊。通過slot鏈條安裝注冊順序串聯(lián)起來。每一個線程都包含一個slot的鏈表,每個結(jié)點(diǎn)都懸掛著不同的模塊,程序執(zhí)行的時候會遍歷slot鏈表,按照加入鏈表的熟悉執(zhí)行模塊。

創(chuàng)建線程,并將模塊添加到slot鏈表過程代碼如下所示: