盡管有許多IT界的專家懷疑入侵檢測系統(tǒng)存在的必要性,但是現(xiàn)在到了為你的企業(yè)建立入侵檢測系統(tǒng)的 時(shí)候了。也許還有許多人認(rèn)為對付惡意的攻擊防火墻已經(jīng)足夠了,但在IT界,安全問題目前已經(jīng)受到了如此廣 泛的關(guān)注,已經(jīng)到了有必要采用入侵檢測系統(tǒng)的地步了。Snort是一種入侵檢測系統(tǒng),它小巧免費(fèi),具有很好的 配置性和可移植性,是基于網(wǎng)絡(luò)的入侵檢測系統(tǒng),也可以稱之為NIDS。除此之外,它還可以用來截獲網(wǎng)絡(luò)中的 數(shù)據(jù)包并做為數(shù)據(jù)包的日志。
Snort經(jīng)常被稱為輕量級的入侵檢測系統(tǒng)。Snort被標(biāo)以輕量級的稱號是因?yàn)樗紫仁窃O(shè)計(jì)給小網(wǎng)絡(luò)段使 用的。基于規(guī)則的體系結(jié)構(gòu)使Snort非常靈活,它的設(shè)計(jì)者將它設(shè)計(jì)的很容易插入和擴(kuò)充新的規(guī)則,這樣它就能 夠?qū)Ω赌切┬鲁霈F(xiàn)的威脅。本文詳細(xì)討論了Snort的安裝及其體系結(jié)構(gòu)和規(guī)則,以及如何運(yùn)行它。
1.安裝
Snort是由Martin Roesch編寫的,你可以從http://www.snort.org/下載。在本 文完成時(shí),它的最新版本是1.7。該網(wǎng)站除了提供源碼下載外還將提供適用于常用平臺的二進(jìn)制版本。但在下載 和安裝Snort之前,請先安裝libpcap的0.5以上版本,libpcap的最新版本是0.6.2。它支持夸平臺捕獲數(shù)據(jù)包并 可以對其進(jìn)行分析。Libpcap還有支持一些BSD平臺的版本。你可以從http://www.tcpdumpl.org下載到最新版本 的libcap。
安裝Snort很簡單。如同安裝其它典型的UNIX工具一樣,安裝步驟包括./configure,接 下來是make。我常常喜歡查看配置的選項(xiàng),通過./configure –help就可以看到所有的選項(xiàng)了。最后用make install將會安裝所有的Snort文件。此時(shí),你還沒有完全做好準(zhǔn)備運(yùn)行Snort,在運(yùn)行Snort之前,你得先創(chuàng)建 它的規(guī)則文件。在寫規(guī)則文件之前,我們還是先來看看Snort的體系結(jié)構(gòu)。
2.Snort的體系結(jié)構(gòu)
Snort的體系結(jié)構(gòu)由三個主要的部分組成。在圖1中顯示的是這些部分的簡化表示。對它們的描述如下:
1、包解碼:Snort的包解碼支持以太網(wǎng)和SLIP及PPP媒體介質(zhì)。包解碼所做的所有工作就是為探測引擎 準(zhǔn)備數(shù)據(jù)。
2、探測引擎:探測引擎是Snort的心臟。它主要負(fù)責(zé)的工作是:按照啟動時(shí)加載的規(guī)則,對每個數(shù)據(jù)包 進(jìn)行分析。探測引擎將Snort規(guī)則分解為鏈表頭和鏈表選項(xiàng)進(jìn)行引用。鏈表頭由諸如源/目標(biāo)ip地址及端口號這 些普通信息標(biāo)識。鏈表選項(xiàng)定義一些更詳細(xì)的信息如TCP標(biāo)志、ICMP代碼類型、特定的內(nèi)容類型、負(fù)載容量等。 探測引擎按照Snort規(guī)則文件中定義的規(guī)則依次的分析每個數(shù)據(jù)包。與數(shù)據(jù)包中數(shù)據(jù)匹配的第一條規(guī)則觸發(fā)在規(guī) 則定義中指定的動作。凡是與規(guī)則不匹配的數(shù)據(jù)包都被丟棄。探測引擎中的關(guān)鍵部分是plugin模塊如端口掃描 模塊等,它增加的一些分析能力增強(qiáng)了Snort的功能。
3、日志記錄/告警系統(tǒng):告警和日志是兩個分離的子系統(tǒng)。日志允許你將包解碼收集到的信息以可讀的 格式或以tcpdump格式記錄下來。你可以配置告警系統(tǒng),使其將告警信息發(fā)送到syslog、flat文件、Unix套接字 或數(shù)據(jù)庫中。在進(jìn)行測試或在入侵學(xué)習(xí)過程當(dāng)中,你還可以關(guān)掉告警。缺省情況下,所有的日志將會寫到 /var/log/Snort文件夾中,告警文件將會寫到/var/log/Snort/alerts文件中。
3.Snort規(guī)則
Snort規(guī)則文件是一個ASCII文本文件,可以用常用的的文本編輯器對其進(jìn)行編輯。規(guī)則文件的內(nèi)容由以 下幾部分組成:
變量定義:在這里定義的變量可以在創(chuàng)建Snort規(guī)則時(shí)使用。
Snort規(guī)則:在入侵檢測時(shí)起作用的規(guī)則,這些規(guī)則應(yīng)包括了總體的入侵檢測策略。在本文的后面給出了一 個Snort規(guī)則。
預(yù)處理器:即插件,用來擴(kuò)展Snort的功能。如用portscan來檢測端口掃描。
包含文件Include Files:可以包括其它Snort規(guī)則文件。
輸出模塊:Snort管理員通過它來指定記錄日志和告警的輸出。當(dāng)Snort調(diào)用告警及日志子系統(tǒng)時(shí)會執(zhí)行輸 出模塊。
Snort規(guī)則邏輯上可以分為兩個部分:規(guī)則的頭部和規(guī)則選項(xiàng)部分。對Snort規(guī)則的描述必須在一行之內(nèi) 完成,另外它必須包含IP地址,以便在不能按照主機(jī)名進(jìn)行查找使用。圖2顯示了Snort規(guī)則的頭及選項(xiàng)的細(xì)節(jié) 。
圖2. 規(guī)則表的結(jié)構(gòu)組成
在Snort的主頁中,讀者對Snort的規(guī)則細(xì)節(jié)中最感興趣的鏈接是“Writing Snort Rules"。另外, Snort的發(fā)行版本中提供的RULES.SAMPLE是一個非常不錯的文檔。你可以參照它為你的工作環(huán)境構(gòu)建Snort規(guī)則 。在寫規(guī)則前,建議你先寫出網(wǎng)絡(luò)入侵檢測策略。這包括先定義出進(jìn)行日志記錄、忽略或發(fā)出告警信息的事件 。下面給出一個非常簡單的規(guī)則:
##
#Define our network and other network
#
var OURNET 208.177.13.0/24
var OTHERNET !$OURNET
var NIDSHOST 208.177.13.251
var PORTS 10
var SECS 3
##
# Log rules
##
log tcp $OTHERNET any -> $OURNET 23
log tcp $OTHERNET any -> $OURNET 21
log tcp $OTHERNET any -> $OURNET 79
##
#Alert Rules
##
alert udp any any -> $OURNET 53 (msg:"UDP IDS/DNS-version-query";
content:"version";)
alert tcp any any -> $OURNET 53 (msg:"TCP IDS/DNS-version-query";
content:"version";)
alert tcp any any -> $OURNET 80 (msg:"PHF attempt";
content:"/cgi-bin/phf";)
##
# Load portscan pre-processor for portscan alerts
##
preprocessor portscan: $OTHERNET $PORTS $SECS
/var/log/snort/pscan_alerts
preprocessor portscan-ignorehosts: $OURNET
##
# Pass Rules (Ignore)
##
pass tcp $OURNET any -> $OTHERNET 80
pass udp any 1024: <> any 1024:
pass tcp any 22 -> $NIDSHOST 22
該規(guī)則要求,記錄下網(wǎng)絡(luò)外部主機(jī)所做的下列行為:
Telnet、FTP通信、finger。
對以下行為發(fā)出告警:
從本網(wǎng)以外的機(jī)器中發(fā)出的端口掃描行為,并將告警信息寫入到/var/log/snort/pscan_alerts文件中 ;
所有的PHF請求
DNS版本查詢
忽略以下信息:
對1024以上UDP端口的訪問;
從本網(wǎng)內(nèi)發(fā)出的WEB瀏覽通信及網(wǎng)絡(luò)入侵檢測系統(tǒng)間的ssh通信;
4.運(yùn)行Snort
Snort可以以包竊聽器方式、包日志記錄器和入侵檢測系統(tǒng)三種方式運(yùn)行。如果以包竊聽器的方式運(yùn)行 ,TCP/UDP/ICMP的頭信息及應(yīng)用數(shù)據(jù)在標(biāo)準(zhǔn)輸出設(shè)備中輸出:
# Snort -vd
當(dāng)Snort作為包記錄器使用時(shí),它將應(yīng)用及協(xié)議的頭信息記錄到/var/log/today.log中:
# Snort -dev -l /var/log/today.log
做為一個網(wǎng)絡(luò)入侵檢測系統(tǒng),Snort在le0接口進(jìn)行監(jiān)聽,配置文件為/etc/Snort.rules,并以后臺進(jìn)程 的方式運(yùn)行:
# Snort -D -i le0 -c /etc/Snort.rules
Snort并不會按著規(guī)則在配置文件中出現(xiàn)的次序來對其進(jìn)行評估,在默認(rèn)的情況下它是按照 Alert,Pass,Log的次序?qū)σ?guī)則進(jìn)行評估的。用命令行標(biāo)志-o可以改變評估的次序?yàn)镻ass,Alert,Log。-A選項(xiàng)指 定了告警模式,共有四種方式可供選擇:full,fast,none和unsock。Full,none,fast這幾種方式的含義很明白 ,unsock選項(xiàng)可以使Snort將告警信息通過UNIX的套接字發(fā)往一個負(fù)責(zé)處理告警信息的主機(jī),在該主機(jī)上有一個 程序在套接字上進(jìn)行監(jiān)聽。有關(guān)該選項(xiàng)的細(xì)節(jié)可以通過snort的man獲得更多的內(nèi)容。通過Snort的告警方式,你 可以在告警信息中對當(dāng)前的情況進(jìn)行詳細(xì)的描述。
必須要對snort的配置進(jìn)行驗(yàn)證,驗(yàn)證的方法是 再檢查一遍入侵檢測規(guī)則。對于入侵檢測的策略,你可以進(jìn)行一些指定的測試并觀察日志和告警。對于我們上 面列出的策略,我們可以運(yùn)行Telnet,FTP和finger。你可以使用諸如scanner之類的工具,如一些可以很容易得 到的掃描器,如nmap都是不錯的。商業(yè)用途的掃描器如network Associates發(fā)行的Cybercop和Internet Security System的ISS可以幫助你自動的完成這些過程。Netcat是另外一個功能強(qiáng)大的工具,你可以從 http://www.atstake.com/research%20tools/下載。總之,你可以用幾個簡單的腳本語句對你的系統(tǒng)進(jìn)行攻擊 。但是你一定要小心,運(yùn)行這些腳本意味著你信任這些腳本。下面顯示了幾個簡單的告警。其中包括三個常見 的攻擊:IIS Unicode攻擊,SYN/Fin掃描和portscan。
表2. 常見的告警信息
[**] spp_http_decode: IIS Unicode attack detected [**]
03/07-11:10:40.910903 192.168.0.1:3607 ->192.168.1.2:80
TCP TTL:249 TOS:0x0 ID:22898 IpLen:20 DgmLen:1022 DF
***AP*** Seq: 0x552997B8 Ack: 0xE39D7CB1 Win: 0x4470 TcpLen:20
[**] IDS198/SYN FIN Scan [**]
03/13-01:38:45.254726 192.168.1.3:53 -> 192.168.0.1:53
TCP TTL:23 TOS:0x0 ID:39426 IpLen:20 DgmLen:40
******SF Seq: 0x4D622A79 Ack: 0x7EEF29AF Win: 0x404 TcpLen:
03/15-19:36:23.468056
[**] spp_portscan: PORTSCAN DETECTED from 192.168.2.25 (THRESHOLD 3
connections exceeded in 4 seconds) [**]
03/15-19:36:39.561360
[**] spp_portscan: portscan status from 192.168.3.25: 5 connections
across 1
hosts: TCP(0),UDP(5) [**]



