前言
防火墻可以比喻為辦公室門口的警衛(wèi),用來檢查進出者的身份。而入侵檢測系統(tǒng)就像是網(wǎng)上的警報器,當發(fā)現(xiàn)入侵者時,指出入侵者的來歷、他們正在做什么。入侵檢測系統(tǒng)被視為防火墻之后的第二道安全閘門。
實驗目的
1.掌握snortIDS工作機理
2.應用snort三種方式工作
3.熟練編寫snort規(guī)則
Snort IDS 概述
Snort IDS(入侵檢測系統(tǒng))是一個強大的網(wǎng)絡入侵檢測系統(tǒng)。它具有實時數(shù)據(jù)流量分析和記錄IP網(wǎng)絡數(shù)據(jù)包的能力,能夠進行協(xié)議分析,對網(wǎng)絡數(shù)據(jù)包內(nèi)容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,Snort是開源的入侵檢測系統(tǒng),并具有很好的擴展性和可移植性。
Snort IDS體系結(jié)構(gòu)

Snort的結(jié)構(gòu)由4大軟件模塊組成,它們分別是:
?。?)數(shù)據(jù)包嗅探模塊——負責監(jiān)聽網(wǎng)絡數(shù)據(jù)包,對網(wǎng)絡進行分;
?。?)預處理模塊——該模塊用相應的插件來檢查原始數(shù)據(jù)包,從中發(fā)現(xiàn)原始數(shù)據(jù)的“行為”,如端口掃描,IP碎片等,數(shù)據(jù)包經(jīng)過預處理后才傳到檢測引擎;
(3)檢測模塊——該模塊是Snort的核心模塊。當數(shù)據(jù)包從預處理器送過來后,檢測引擎依據(jù)預先設置的規(guī)則檢查數(shù)據(jù)包,一旦發(fā)現(xiàn)數(shù)據(jù)包中的內(nèi)容和某條規(guī)則相匹配,就通知報警模塊;
?。?)報警/日志模塊——經(jīng)檢測引擎檢查后的Snort數(shù)據(jù)需要以某種方式輸出。如果檢測引擎中的某條規(guī)則被匹配,則會觸發(fā)一條報警,這條報警信息會通過網(wǎng)絡、UNIXsocket、WindowsPopup(SMB)、SNMP協(xié)議的trap命令傳送給日志文件,甚至可以將報警傳送給第三方插件(如SnortSam),另外報警信息也可以記入SQL數(shù)據(jù)庫。
Snort三種工作方式
Snort擁有三大基本功能:嗅探器、數(shù)據(jù)包記錄器和入侵檢測。嗅探器模式僅從網(wǎng)絡上讀取數(shù)據(jù)包并作為連續(xù)不斷的流顯示在終端上,常用命令snort -dev。數(shù)據(jù)包記錄器模式是把數(shù)據(jù)包記錄到硬盤上,常用命令snort -b。網(wǎng)絡入侵檢測模式是最復雜的,而且是可配置的。我們可以讓Snort分析網(wǎng)絡數(shù)據(jù)流以匹配用戶定義的一些規(guī)則,并根據(jù)檢測結(jié)果采取一定的動作。
Snort規(guī)則
snort規(guī)則定義
Snort使用一種簡單的規(guī)則描述語言,這種描述語言易于擴展,功能也比較強大。Snort規(guī)則是基于文本的,規(guī)則文件按照不同的組進行分類,比如,文件ftp.rules包含了FTP攻擊內(nèi)容?!缸ⅰ筍nort的每條規(guī)則必須在一行中,它的規(guī)則解釋器無法對跨行的規(guī)則進行解析。Snort的每條規(guī)則都可以分成邏輯上的兩個部分:規(guī)則頭和規(guī)則體。
規(guī)則頭
規(guī)則頭包括4個部分:規(guī)則行為;協(xié)議;源信息;目的信息。下圖是對于規(guī)則頭的描述。
snort規(guī)則頭Snort預置的規(guī)則動作有5種:
(1)pass—動作選項pass將忽略當前的包,后繼捕獲的包將被繼續(xù)分析。
?。?)log—動作選項log將按照自己配置的格式記錄包。
?。?)alert—動作選項alert將按照自己配置的格式記錄包,然后進行報警。它的功能強大,但是必須恰當?shù)挠?,因為如果報警記錄過多,從中攫取有效信息的工作量增大,反而會使安全防護工作變得低效。
?。?)dynamic—動作選項dynamic是比較獨特的一種,它保持在一種潛伏狀態(tài),直到activate類型的規(guī)則將其觸發(fā),之后它將像log動作一樣記錄數(shù)據(jù)包。
(5)activate—動作選項activate功能強大,當被規(guī)則觸發(fā)時生成報警,并啟動相關的dynamic類型規(guī)則。在檢測復雜的攻擊,或?qū)?shù)據(jù)進行歸類時,該動作選項相當有用。
除了以上5種預置的規(guī)則動作類型,用戶還可以定制自己的類型。
規(guī)則體
規(guī)則體的作用是在規(guī)則頭信息的基礎上進一步分析,有了它才能確認復雜的攻擊(Snort的規(guī)則定義中可以沒有規(guī)則體)。規(guī)則體由若干個被分別隔開的片斷組成,每個片斷定義了一個選項和相應的選項值。一部分選項是對各種協(xié)議的詳細說明,包括IP、ICMP和TCP協(xié)議,其余的選項是:規(guī)則觸發(fā)時提供給管理員的參考信息,被搜索的關鍵字,Snort規(guī)則的標識和大小寫不敏感選項。
下面是一個規(guī)則實例。
alert tcp !192.168.0.1/24 any ->any 21 (content:"USER";msg: "FTP Login";)
- alert表示規(guī)則動作為報警。
- tcp表示協(xié)議類型為TCP協(xié)議。
- !192.168.0.1/24表示源IP地址不是192.168.0.1/24。
- 第一個any表示源端口為任意端口。
- ->表示發(fā)送方向操作符。
- 第二個any表示目的IP地址為任意IP地址。
- 21表示目的端口為21。
- content:"USER"表示匹配的字符串為“USER”。
- msg:"FTPLogin"表示報警信息為“FTPLogin”。
上面的規(guī)則也可寫成:
此外,還有一個雙向操作符<>,它使Snort對這條規(guī)則中,兩個IP地址/端口之間的數(shù)據(jù)傳輸進行記錄/分析,例如telnet或者POP3對話。下面的規(guī)則表示對一個telnet對話的雙向數(shù)據(jù)傳輸進行記錄:
log 192.168.0.1/24 any <> 192.168.0.1/24 23
activate/dynamic規(guī)則對擴展了snort功能。使用activate/dynamic規(guī)則對,你能夠使用一條規(guī)則激活另一條規(guī)則,當一條特定的規(guī)則啟動,如果你想要snort接著對符合條件的數(shù)據(jù)包進行記錄時,使用activate/dynamic規(guī)則對非常方便。除了一個必需的選項activates外,激活規(guī)則非常類似于報警規(guī)則(alert)。動態(tài)規(guī)則(dynamic)和日志規(guī)則(log)也很相似,不過它需要一個選項:activated_by。動態(tài)規(guī)則還需要另一個選項:count。當一個激活規(guī)則啟動,它就打開由activate/activated_by選項之后的數(shù)字指示的動態(tài)規(guī)則,記錄count個數(shù)據(jù)包。
下面是一條activate/dynamic規(guī)則對的規(guī)則:
activate tcp any any -> any 23(activates:111;msg:"Telnet Login";) dynamic tcp any any -> any 23 (activated_by:111;count:20;)
當發(fā)現(xiàn)Telnet默認使用的23端口有通信,activate規(guī)則會被觸發(fā)并啟動dynamic規(guī)則,然后dynamic規(guī)則將遵循配置,記錄后面的20個數(shù)據(jù)包。在上面的例子里activate規(guī)則的“activates”值為111,dynamic規(guī)則的“activated_by”值為111,這樣就把兩個規(guī)則關聯(lián)起來,而不是因為這兩個規(guī)則有相同的規(guī)則頭。
預處理
預處理器在調(diào)用檢測引擎之前,在數(shù)據(jù)包被解碼之后運行。通過這種機制,Snort可以以一種out of band的方式對數(shù)據(jù)包進行修改或者分析。
預處理器可以使用preprocessor關鍵詞來加載和配置,常用到的預處理器如下:
?。?)HTTPdecode預處器HTTP解碼預處理模塊用來處理HTTPURL字符串,把它們轉(zhuǎn)換為清晰的ASCII字符串。
?。?)端口掃描器portscan端口掃描器會把由單個源IP地址發(fā)起的端口掃描從開始到結(jié)束的全過程記錄到標準日志。
?。?)stream處理器stream處理器為snort提供了TCP數(shù)據(jù)包重組的功能。在配置的端口上,stream處理器能夠?qū)CP數(shù)據(jù)包的細小片段進行重組,使之成為完整的TCP數(shù)據(jù)包,然后snort可以對其可疑行為進行檢查。
?。?)frag2處理器frag2預處理器為snort提供了IP分片重組的功能。frag2預處理器能夠?qū)Ψ制M行重組來定位分片攻擊,它的工作原理是將所有的分片重組構(gòu)造成一個包含完整信息的數(shù)據(jù)包,再將這個包傳給檢測引擎。
Snort應用
Snort采用命令行方式運行。格式為:snort –[options]<filters>。options為選項參數(shù);filters為過濾器。
Snort主要選項參數(shù):
- -A<alert>設置報警方式為full,fast或者none。在full方式下,snort將傳統(tǒng)的報警信息格式寫入報警文件,報警內(nèi)容比較詳細。在fast方式下,snort只將報警時間,報警內(nèi)容,報警IP地址和端口號寫入文件。在none方式下,系統(tǒng)將關閉報警功能。
- -a顯示ARP包。-b以tcpdump的格式將數(shù)據(jù)包記入日志。所有的數(shù)據(jù)包將以二進制格式記錄到snort.log文件中。這個選項提高了snort的操作速度,因為直接以二進制存儲,省略了轉(zhuǎn)換為文本文件的時間,通過-b選項的設置,snort可以在100Mbps的網(wǎng)絡環(huán)境中正常工作。
- -c<cf>使用配置文件<cf>。文件內(nèi)容主要控制系統(tǒng)哪些包需要記入日志,哪些包需要報警,哪些包可以忽略等。
- -C僅抓取包中的ASCII字符。
- -d抓取應用層的數(shù)據(jù)包。
- -D在守護模式下運行snort。
- -e顯示和記錄數(shù)據(jù)鏈路層信息。
- -F<bpf>從文件<bpf>中讀取BPF過濾信息。
- -h<hn>設置<hn>(C類IP地址)為內(nèi)部網(wǎng)絡。當使用這個開關時,所有從外部的流量將會有一個方向箭頭指向右邊,所有從內(nèi)部的流量將會有一個左箭頭。這個選項沒有太大的作用,但是可以使顯示的包的信息格式比較容易察看。
- -i<if>使用網(wǎng)絡接口文件<if>。
- -l<ld>將包信息記錄到目錄<ld>下。設置日志記錄的分層目錄結(jié)構(gòu),按接收包的IP地址將抓取的包存儲在相應的目錄下。
- -n<num>處理完<num>包后退出。
- -N關閉日志功能,報警功能仍然工作。
- -p關閉混雜模式的嗅探(sniffing)。這個選項在網(wǎng)絡嚴重擁塞時十分有效。
- -r<tf>讀取tcpdump生成的文件<tf>,snort將讀取和處理這個文件。
- -s將報警信息記錄到系統(tǒng)日志,日志文件可以出現(xiàn)在/var/log/messages目錄里。
- -v將包信息顯示到終端時,采用詳細模式。這種模式存在一個問題:它的顯示速度比較慢,如果你是在IDS網(wǎng)絡中使用snort,最好不要采用詳細模式,否則會丟失部分包信息。
- -V顯示版本號,并退出。
Filters過濾器
Snort的<filters>是標準的BPF格式的過濾器。
Snort應用了BPF機制,可以在探測器上書寫和執(zhí)行BPF規(guī)則的文件。BPF機制允許用戶書寫快速的包分析規(guī)則,這些規(guī)則主要基于源、目的、和其他的頭信息。通過嗅探和BPF,我們可以只捕獲需要的流量,這樣就減輕了需要處理的數(shù)據(jù)量。
BPF機制很容易理解,可以用于分析TCP、UDP、IP和ICMP協(xié)議。規(guī)則語法很像自然的口語,使用“and”和“or”作為規(guī)則操作符,用“not”作為取反符,此處還可以用括號來告訴引擎將一系列數(shù)據(jù)作為一個整體來處理。例如:ICMP捕獲:icmp。
telnet請求數(shù)據(jù)包捕獲:tcp and dst port 23。記錄所有源自網(wǎng)絡192.168.0.0/24,目的是202.98.0.0/24的IP流量:ip and "src net 192.168.0 " and "dst net 202.98.0 "。
實驗步驟
本練習主機A、B為一組,C、D為一組,E、F為一組。首先使用“快照X”恢復Linux系統(tǒng)環(huán)境。
一.Snort數(shù)據(jù)包嗅探
1.啟動Snort進入實驗平臺,單擊工具欄“控制臺”按鈕,進入IDS工作目錄,運行Snort對網(wǎng)絡接口eth0進行監(jiān)聽,要求如下:
(1)僅捕獲同組主機發(fā)出的icmp回顯請求數(shù)據(jù)包。
?。?)采用詳細模式在終端顯示數(shù)據(jù)包鏈路層、應用層信息。
?。?)對捕獲信息進行日志記錄,日志目錄/var/log/snort。
Snort命令:
snort –i eth0 –dev icmp and src 172.16.0.141 –l /var/log/snort
2.查看Snort日志記錄。
「說明」默認snort日志記錄最后一級目錄會以觸發(fā)數(shù)據(jù)包的源IP命名。可使用組合鍵Ctrl+C停止snort運行。
二.Snort數(shù)據(jù)包記錄
(1)對網(wǎng)絡接口eth0進行監(jiān)聽,僅捕獲同組主機發(fā)出的Telnet請求數(shù)據(jù)包,并將捕獲數(shù)據(jù)包以二進制方式進行存儲到日志文件中/var/log/snort/snort.log)。
Snort命令:
snort –i eth0 –b tcp and src 172.16.0.141 and dst port 23
?。?)當前主機執(zhí)行上述命令,同組主機telnet遠程登錄當前主機。
?。?)停止snort捕獲(Ctrl+C),讀取snort.log文件,查看數(shù)據(jù)包內(nèi)容。Snort命令: snort –F /var/log/snort.log
三.簡單報警規(guī)則
(1)在snort規(guī)則集目錄ids/rules下新建snort規(guī)則集文件new.rules,對來自外部主機的、目標為當前主機80/tcp端口的請求數(shù)據(jù)包進行報警,報警消息自定義。snort規(guī)則:
alert tcp any any -> 172.16.0.142 80 (msg:"Telnet Login")
?。?)編輯snort.conf配置文件,使其包含new.rules規(guī)則集文件,具體操作如下:使用vim(或vi)編輯器打開snort.conf,切換至編輯模式,在最后添加新行包含規(guī)則集文件new.rules。添加包含new.rules規(guī)則集文件語句 include &RULE PATH/new.rules
?。?)以入侵檢測方式啟動snort,進行監(jiān)聽。啟動snort的命令 snort –c snort.conf
以入侵檢測方式啟動snort,同組主機訪問當前主機Web服務。
文章原作者請聯(lián)系我,因為已經(jīng)找不到原文出處。