Snort

網路入侵檢測防禦系統

在1998年,Marty Roesch先生用C語言開發了開放源代碼(Open Source)的入侵檢測系統Snort.直至今天,Snort已發展成為一個多平台(Multi-Platform),實時(Real-Time)流量分析,網路IP數據包(Pocket)記錄等特性的強大的網路入侵檢測/防禦系統(Network Intrusion Detection/Prevention System),即NIDS/NIPS.Snort符合通用公共許可(GPL——GNU General Pubic License),在網上可以通過免費下載獲得Snort,並且只需要幾分鐘就可以安裝並開始使用它。snort基於libpcap。

簡介


Snort有三種工作模式:嗅探器、數據包記錄器、網路入侵檢測系統。嗅探器模式僅僅是從網路上讀取數據包並作為連續不斷的流顯示在終端上。數據包記錄器模式把數據包記錄到硬碟上。網路入侵檢測模式是最複雜的,而且是可配置的。我們可以讓snort分析網路數據流以匹配用戶定義的一些規則,並根據檢測結果採取一定的動作。

原理


Snort能夠對網路上的數據包進行抓包分析,但區別於其它嗅探器的是,它能根據所定義的規則進行響應及處理。Snort 通過對獲取的數據包,進行各規則的分析后,根據規則鏈,可採取Activation(報警並啟動另外一個動態規則鏈)、Dynamic(由其它的規則包調用)、Alert(報警),Pass(忽略),Log(不報警但記錄網路流量)五種響應的機制。
Snort有數據包嗅探,數據包分析,數據包檢測,響應處理等多種功能,每個模塊實現不同的功能,各模塊都是用插件的方式和Snort相結合,功能擴展方便。例如,預處理插件的功能就是在規則匹配誤用檢測之前運行,完成TIP碎片重組,http解碼,telnet解碼等功能,處理插件完成檢查協議各欄位,關閉連接,攻擊響應等功能,輸出插件將得理后的各種情況以日誌或警告的方式輸出。

工作過程


Snort通過在網路TCP/IP的5層結構的數據鏈路層進行抓取網路數據包,抓包時需將網卡設置為混雜模式,根據操作系統的不同採用libpcapwinpcap函數從網路中捕獲數據包;然後將捕獲的數據包送到包解碼器進行解碼。網路中的數據包有可能是乙太網包、令牌環包、TCP/IP包、802.11包等格式。在這一過程包解碼器將其解碼成Snort認識的統一的格式;之後就將數據包送到預處理器進行處理,預處理包括能分片的數據包進行重新組裝,處理一些明顯的錯誤等問題。預處理的過程主要是通過插件來完成,比如Http預處理器完成對Http請求解碼的規格化,Frag2事務處理器完成數據包的組裝,Stream4預處理器用來使Snort狀態化,埠掃描預處理器能檢測埠掃描的能力等;對數據包進行了解碼,過濾,預處理后,進入了Snort的最重要一環,進行規則的建立及根據規則進行檢測。規則檢測是Snort中最重要的部分,作用是檢測數據包中是否包含有入侵行為。例如規則alert tcp any any ->202.12.1.0/24 80(msg:”misc large tcp packet”;dsize:>3000;)這條規則的意思是,當一個流入202.12.1.0這個網段的TCP包長度超過3000B時就發出警報。規則語法涉及到協議的類型、內容、長度、報頭等各種要素。處理規則文件的時候,用三維鏈表來存規則信息以便和後面的數據包進行匹配,三維鏈表一旦構建好了,就通過某種方法查找三維鏈表並進行匹配和發生響應。規則檢測的處理能力需要根據規則的數量,運行Snort機器的性能,網路負載等因素決定;最後一步就是輸出模塊,經過檢測后的數據包需要以各種形式將結果進行輸出,輸出形式可以是輸出到alert文件、其它日誌文件、資料庫UNIX域或Socket等。

部署


Snort的部署非常靈活,很多操作系統上都可以運行,可以運行在window xp,windows2003linux等操作系統上。用戶在操作系統平台選擇上應考慮其安全性,穩定性,同時還要考慮與其它應用程序的協同工作的要求。如果入侵檢測系統本身都不穩定容易受到攻擊,就不能很好的去檢測其它安全攻擊漏洞了。在Linux與Windows操作系統相比較之下,Linux更加健壯,安全和穩定。Snort的運行,主要是通過各插件協同工作才使其功能強大,所以在部署時選擇合適的資料庫,Web伺服器,圖形處理程序軟體及版本也非常重要。Snort部署時一般是由感測器層、伺服器層、管理員控制台層三層結構組成。感測器層層就是一個網路數據包的嗅探器層,收集網路數據包交給伺服器層進行處理,管理員控制台層則主要是顯示檢測分析結果。部署Snort時可根據企業網路規模的大小,採用三層結構分別部署或採用三層結構集成在一台機器上進行部署,也可採用伺服器層與控制台集成的兩層結構。

運行


Snort的有三種模式的運行方式:嗅探器模式,包記錄器模式,和網路入侵檢測系統模式。嗅探器模式僅僅是從捕獲網路數據包顯示在終端上,包記錄器模式則是把捕獲的數據包存儲到磁碟,入侵檢測模式則是最複雜的能對數據包進行分析、按規則進行檢測、做出響應。

不足


Snort入侵檢測系統適應多種平台,源代碼開放,使用免費,受眾多用戶喜愛,但也有不少缺點。Snort之所以說他是輕量型就是說他的功能還不夠完善,比如與其它產品產生聯動等方面還有待改進;Snort由各功能插件協同工作,安裝複雜,各軟體插件有時會因版本等問題影響程序運行;Snort對所有流量的數據根據規則進行匹配,有時會產生很多合法程序的誤報。

條目


Snort最重要的用途還是作為網路入侵檢測系統(NIDS)。
使用簡介
Snort並非複雜難以操作的軟體。 Snort可以三個模式進行運作:
偵測模式(Sniffer Mode):此模式下,Snort將在現有的網域內擷取封包,並顯示在熒幕上。
封包紀錄模式(packet logger mode):此模式下,Snort將已擷取的封包存入儲存媒體中(如硬碟)。
上線模式(inline mode):此模式下,Snort可對擷取到的封包做分析的動作,並根據一定的規則來判斷是否有網路攻擊行為的出現。
基本指令:偵測模式
若你想要在螢幕上顯示網路封包的標頭檔(header)內容,請使用
./snort -v
如果想要在螢幕上顯示正在傳輸的封包標頭檔內容,請使用
./snort -vd
如果除了以上顯示的內容之外,欲另外顯示數據鏈路層(Data link layer)的資料的話,請使用
./snort -vde

封包記錄


在記錄封包之前,您必須先指定一個目錄來儲存該資料。舉例而言,若您在您目前的目錄下建立了一個名為log的目錄,欲存紀錄資料於該目錄下的話,請使用
./snort -dev -l ./log
若想要以二進位碼(binary code)的方式來儲存封包資料的話,請使用
./snort -l ./log -b
若欲讀取某已儲存的封包記錄檔案(假設其檔名為packet.log),請使用
./snort -dvrpacket.log
若欲讀取該檔案中特定網路協定的資訊(假設是tcp協定),請使用
./snort -dvr packet.log tcp

入侵偵測


若欲使用入侵偵測模式,請使用
./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
其中snort.conf是封包的簽章檔案
若不需要得知資料連結層的資訊,請使用
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf
以下是Snort在入侵偵測模式的指令選項:
-A fast快速警告模式
-A full完整警告模式(預設)
-A unsock將警告訊息送至UNIX的socket上,供其他裝置檢視
-A none關閉警告功能
-A console將警告訊息送至終端機(Console)
線上模式
封包的抓取不透過libcap,而是透過防火牆,並可告知防火牆是否讓此封包通過。啟用線上模式使用./snort -Qd -h 192.168.0.0/16 -l ./log -c snort.conf
防火牆的設定
* Linux
o iptables -t nat -A PREROUTING -j QUEUE
編輯Snort偵測規則
以下是一種編輯偵測規則(Snort rule)的例子:
alert tcp any any ->192.168.1.0/24 111
依次分為以下幾個部份:
標頭
標頭的部份指的是此規則欲執行的動作。以上的例子為"alert",即警示。完整的標頭選項列表如下:
alert產生警示
log紀錄該封包
pass忽略該封包
activate產生警示,並開啟另一個動態規則
dynamic被activate指令觸發后所執行的規則
drop讓iptable丟棄該類型封包並記錄下來
reject讓iptable丟棄該類型封包,並送出TCP重新啟動(TCP Reset)的封包
sdrop讓iptable丟棄該類型封包,但不記錄
通訊協定指出執行該規則的協定為何。上述的例子是tcp協定。
目前snort支援四種通訊協定:
tcp, udp, icmp, ip
並計劃在未來支援以下的協定:
ARP, IGRP, GRE, OSPF, RIP, IPX等等
進階規則編輯
Includes: include允許指令的規則檔包含其他的規則檔。
include:
請注意,在該行結尾處沒有分號。被包含的規則檔會把任何預設的變數值替換為其本身的變數。
Variables :
在Snort中定義的變數。
var:
例子: var NET 192.168.1.0/24 alert tcp any any -> $NET any (flags: S; msg: "FIN packet";)
變數名稱可以用多種方法修改。可以在"$"符號之後定義變數。 "?"和"-"可用於變數修改符號。 $var -定義變數。 $(var) -用變數"var"的值替換。 $(var:-default) -用變數"var"的值替換。若"var"沒有定義,則使用"default"替換。 $(var:?messageXXX) -用變數"var"的值替換,或列印出錯誤訊息"messageXXX"。例子: var NET $(NET:-192.168.1.0/24) log tcp any any -> $(NET:?NET is undefined!) 23
Config
Snort的很多配置和命令行選項都可以在配置檔中設置。
config [: ]

主要指令


order改變規則順序( snort -o )
alertfile建立警告輸出檔,例如:config alertfile: alertlog
classification將規則分類。
decode_arp開啟arp解碼功能。 (snort -a)
dump_chars_only開啟字元擷取功能。 (snort -C)
dump_payload擷取應用層資料。 (snort -d)
decode_data_link解碼資料連結層的標頭檔。 (snort -e)
bpf_file指定BPF篩檢程式(snort -F)。例如:config bpf_file: filename.bpf
set_gid改變GID (snort -g)。例如:config set_gid: snort_group
daemon以背景方式執行。 (snort -D)
reference_net設置該區域的網路。 (snort -h)。例如:config reference_net:192.168.1.0/24
interface設置網路介面(snort –i)。例如:config interface: xl0
alert_with_interface_name警示時附加上介面資訊。 (snort -I)
logdir設置記錄目錄(snort -l)。例如:config logdir: /var/log/snort
umask設置snort輸出檔的許可權。 (snort -m). Example: config umask: 022
pkt_count處理n個封包后,退出。 (snort -n). Example: config pkt_count: 13
nolog關閉記錄功能(警示仍然運作)。 (snort -N)
quiet安靜模式,不顯示狀態報告。 (snort -q)
checksum_mode計算checksum的協定類型。類型值:none, noip, notcp, noicmp, noudp, all
utc在時間紀錄上,用UTC時間代替本地時間。 (snort -U)
verbose將詳細記錄資訊列印到標準輸出。 (snort -v)
dump_payload_verbose擷取資料連結層的封包( snort -X )
show_year在時間紀錄上顯示年份。 (snort -y)
stateful為stream4設置保證模式。
min_ttl設置一個snort內部的ttl值以忽略所有的流量。
disable_decode_alerts關閉解碼時發出的警示。
disable_tcpopt_experimental_alerts關閉tcp實驗選項所發出的警示。
disable_tcpopt_obsolete_alerts關閉tcp過時選項所發出的警示。
disable_tcpopt_ttcp_alerts關閉ttcp選項所發出的警示。
disable_tcpopt_alerts關閉選項長度確認警示。
disable_ipopt_alerts關閉IP選項長度確認警示。
detection配置偵測引擎。 (例如:search-method lowmem)
reference幫Snort加入一個新的參考系統。