1.簡介
在網絡日益普及的今天,網絡安全變的越來越重要,作為網絡安全的一個重要組成部分網絡入侵檢測系統(Network Intrusion Detection System,NIDS)也越來越顯示出其重要性。NIDS用來監視網絡數據流動情況,當入侵發生時能夠提供報警?,F在已經出現了很多商業的NIDS,但是它們大多比較復雜,比較難以掌握,而且比較昂貴,比較小的公司無法承受。本文將介紹一個出色的免費NIDS系統---snort,它基于GPL,作者是Martin Roesch。最新版本是1.70版。本文將介紹snort的技術特點及如何使用snort作為NIDS。
2.SNORT的特點
snort是一個強大的輕量級的網絡入侵檢測系統。它具有實時數據流量分析和日志IP網絡數據包的能力,能夠進行協議分析,對內容進行搜索/匹配。它能夠檢測各種不同的攻擊方式,對攻擊進行實時報警。此外,snort具有很好的擴展性和可移植性。還有,這個軟件遵循通用公共許可證GPL,所以只要遵守GPL任何組織和個人都可以自由使用。
snort是一個輕量級的入侵檢測系統
snort雖然功能強大,但是其代碼極為簡潔、短小,其源代碼壓縮包只有大約110KB。
snort的可移植性很好
snort的跨平臺性能極佳,目前已經支持Linux,Solaris,BSD,IRIX,HP-UX,WinY2K等系統。
snort的功能非常強大
snort具有實時流量分析和日志IP網絡數據包的能力。能夠快速地檢測網絡攻擊,及時地發出報警。snort的報警機制很豐富,例如:syslog、用戶指定的文件、一個UNIX套接字,還有使用SAMBA協議向Windows客戶程序發出WinPopup消息。利用XML插件,snort可以使用SNML(簡單網絡標記語言,simple network markup language)把日志存放到一個文件或者適時報警。
snort能夠進行協議分析,內容的搜索/匹配?,F在snort能夠分析的協議有TCP、UDP和ICMP。將來,可能提供對ARP、ICRP、GRE、OSPF、RIP、IPX等協議的支持。它能夠檢測多種方式的攻擊和探測,例如:緩沖區溢出、秘密端口掃描、CGI攻擊、SMB探測、探測操作系統指紋特征的企圖等等。
snort的日志格式既可以是tcpdump式的二進制格式,也可以解碼成ASCII字符形式,更加便于用戶尤其是新手檢查。使用數據庫輸出插件,snort可以把日志記入數據庫,當前支持的數據庫包括:Postgresql、MySQL、任何unixODBC數據庫,還有Oracle(對Oracle的支持目前處于測試階段)。
使用TCP流插件(tcpstream),snort可以對TCP包進行重組。snort能夠對IP包的內容進行匹配,但是對于TCP攻擊,如果攻擊者使用一個程序,每次發送只有一個字節的TCP包,完全可以避開snort的模式匹配。而被攻擊的主機的TCP協議棧會重組這些數據,將其送給在目標端口上監聽的進程,從而使攻擊包逃過snort的監視。使用TCP流插件,可以對TCP包進行緩沖,然后進行匹配,使snort具備了對付上面這種攻擊的能力。
使用spade(Statistical Packet Anomaly Detection Engine)插件,snort能夠報告非正常的可疑包,從而對端口掃描進行有效的檢測。
snort還有很強的系統防護能力。使用FlexResp功能,snort能夠主動斷開惡意連接。
擴展性能較好,對于新的攻擊威脅反應迅速
作為一個輕量級的網絡入侵檢測系統,snort有足夠的擴展能力。它使用一種簡單的規則描述語言。最基本的規則只是包含四個個域:處理動作、協議、方向、注意的端口。例如:
log tcp any any -> 10.1.1.0/24 79 。
還有一些功能選項可以組合使用,實現更為復雜的功能。將有一篇單獨的文章討論如何寫snort規則。用戶可以從http://www.snort.org得到其規則集。另外,著名的黑客Max Vision在http://www.whitehats.com提供在線的技術支持。
snort支持插件,可以使用具有特定功能的報告、檢測子系統插件對其功能進行擴展。snort當前支持的插件包括:數據庫日志輸出插件、碎數據包檢測插件、端口掃描檢測插件、HTTP URI normalization插件、XML插件等。
snort的規則語言非常簡單,能夠對新的網絡攻擊做出很快的反應。發現新的攻擊后,可以很快根據Bugtraq郵件列表,找出特征碼,寫出檢測規則。因為其規則語言簡單,所以很容易上手,節省人員的培訓費用。
遵循公共通用許可證GPL
snort遵循GPL,所以任何企業、個人、組織都可以免費使用它作為自己的NIDS。
3.安裝
如何獲得snort
可以從snort的站點http://www.snort.org獲得其源代碼或者RPM包。使用源代碼安裝snort需要libpcap庫,可以從ftp://ftp.ee.lbl.gov下載,
安裝snort
RPM包,可以使用下面的命令進行安裝:
bash#rpm -ihv --nodeps snort-1.7-1.i386.rpm
源代碼:
解壓libpcap包:
bash#uncompress libpcap.tar.Z
bash#tar xvf libpcap.tar
編譯libpcap庫:
bash#./configure
bash#make
解壓snort-1.7.0.tar.gz
bash#tar zxvf snort-1.7.0.tar.gz
進入到其所在目錄,編譯snort:
bash# ./configure --with-libpcap-includes=/path/to/your/libcap/headers
bash# make
bash# make install
configure腳本還有一些選項:
--enable-smbalerts編譯SMB報警代碼;
--enable-flexresp編譯Flexible Response代碼;
--with-mysql=DIR支持mysql數據庫;
--with-postgresql=DIR支持postsql數據庫;
--with-odbc=DIR支持ODBC數據庫;
--enable-openssl支持SSL。
可以根據自己的實際情況選擇這些選項。
4.使用
現在,snort已經安裝完成。我們將在這一節討論如何使用snort。作為一個網絡入侵檢測的軟件,snort有三種用途:數據包嗅探器(packet sniffer)、數據包分析器(packet analyser)以及網絡入侵檢測系統。讓我們從最簡單的命令開始,輸入一個簡單的命令列出所有的命令行開關。
bash# snort -?
-*> Snort! <*-
Version 1.7
By Martin Roesch (roesch@clark.net, www.snort.org)
USAGE: snort [-options]
Options:
-A 設置報警模式:
fast、full、none(只是使用報警文件)、
unsock(使用UNIX套接字記入日志,出于測試階段)
-a 顯示ARP(Address Resolution Protocol,地址解析協議)包
-b 日志文件使用tcpdump格式(更快)
-c 使用規則文件rules
-C 只使用字符方式打印負載信息(不使用hex方式)
-d 復制應用層
-D 在后臺運行snort(精靈狀態)
-e 顯示第二層(數據鏈路層)包頭信息
-F Read BPF filters from file
-g 初始化完成后,使snort的gid為gname
-h Home網絡為hn
-i 在接口if上監聽
-I 把界面名加入到報警輸出界面。
-l 設置目錄ld為日志目錄
-M
把SMB消息發送到文件wrkst列出的工作站中
(Requires smbclient to be in PATH)
-n 收到cnt個包后退出
-N 關閉日志功能(警報功能仍然有效)
-o 把規則測試順序修改為:Pass|Alert|Log
-O 打亂被日志的IP地址
-p 關閉混雜嗅探模式
-P 設置復制的包的長度為snaplen(默認: 1514)
-q 安靜模式。不輸出banner和狀態報告。
-r 讀取并處理tcpdump文件tf(回放功能)
-s 把所有警告信息記入syslog
-S 設置規則文件中的n的值等于v的值
-t
初始化完成后Chroot到dir目錄
-u 初始化完成后,把snort的uid設置為uname
-v 設置冗余模式
-V 顯示版本號
-X 從鏈路層開始復制包的數據
-? 顯示幫助信息
<包過濾選項>基于BPF,可參考TCPDump
作為嗅探器
所謂的嗅探器模式就是snort從網絡上讀出數據包然后顯示在你的控制臺上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息打印在屏幕上,只需要輸入下面的命令:
./snort -v
使用這個命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應用層的數據,可以使用:
./snort -vd
這條命令使snort在輸出包頭信息的同時顯示包的數據信息。如果你還要顯示數據鏈路層的信息,就使用下面的命令:
./snort -vde
注意這些選項開關還可以分開寫或者任意結合在一塊。例如:下面的命令就和上面最后的一條命令等價:
./snort -d -v -e
記錄數據包
如果要把所有的包記錄到硬盤上,你需要指定一個日志目錄,snort就會自動對數據包進行日志:
./snort -dev -l ./log
當然,./log目錄必須存在,否則snort就會報告錯誤信息并退出。當snort在這種模式下運行,它會日志所有看到的包將其放到一個目錄中,這個目錄以數據包目的主機的IP地址命名,例如1192.168.10.1
如果你只指定了-l命令開關,而沒有設置目錄名,snort有時會使用遠程主機的IP地址作為目錄,有時會使用本地主機IP地址作為目錄名。為了只對本地網絡進行日志,你需要給出home net:
./snort -dev -l ./log -h 192.168.1.0/24
這個命令告訴snort把進入C類網絡192.168.1的所有包的數據鏈路、TCP/IP以及應用層的數據記錄到目錄./log中。
如果你的網絡速度很快,或者你想使日志更加緊湊以便以后的分析,那么應該使用二進制的日志文件格式。所謂的二進制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包日志到一個單一的二進制文件中:
./snort -l ./log -b
注意此處的命令行和上面的有很大的不同。我們勿需指定home network,因為所有的東西都被記錄到一個單一的文件。你也不必冗余模式或者使用-d、-e功能選項,因為數據包中的所有內容都會被記錄到日志文件中。
你可以使用任何支持tcpdump二進制格式的嗅探器程序從這個文件中讀出數據包,例如:tcpdump或者Ethereal。使用-r功能開關,也能使snort讀出包的數據。snort在所有運行模式下都能夠處理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一個tcpdump格式的二進制文件中的包打印到屏幕上,可以輸入下面的命令:
./snort -dv -r packet.log
在日志包和入侵檢測模式下,通過BPF(BSD Packet Filter)接口,你可以使用許多方式維護日志文件中的數據。例如,你只想從日志文件中提取ICMP包,只需要輸入下面的命令行:
./snort -dvr packet.log icmp
作為入侵檢測系統
snort最重要的用途還是作為網絡入侵檢測系統(NIDS),使用下面命令行可以啟動這種模式:
./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
snort.conf是規則集文件。snort會對每個包和規則集進行匹配,發現這樣的包就采取相應的行動。如果你不指定輸出目錄,snort就輸出到/var/log/snort目錄。
注意:如果你想長期使用snort作為自己的入侵檢測系統,最好不要使用-v選項。因為使用這個選項,使snort向屏幕上輸出一些信息,會大大降低snort的處理速度,從而在向顯示器輸出的過程中丟棄一些包。
此外,在絕大多數情況下,也沒有必要記錄數據鏈路層的包頭,所以-e選項也可以不用:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf
這是使用snort作為網絡入侵檢測系統最基本的形式,日志符合規則的包,以ASCII形式保存在有層次的目錄結構中。
網絡入侵檢測模式下的輸出選項
在NIDS模式下,有很多的方式來配置snort的輸出。在默認情況下,snort以ASCII格式記錄日志,使用full報警機制。如果使用full報警機制,snort會在包頭之后打印報警消息。如果你不需要日志包,可以使用-N選項。
snort有6種報警機制:full、fast、socket、syslog、smb(winpopup)和none。其中有4個可以在命令行狀態下使用-A選項設置。這4個是:
-A fast:報警信息包括:一個時間戳(timestamp)、報警消息、源/目的IP地址和端口。
-A full:是默認的報警模式
-A unsock:把報警發送到一個UNIX套接字,需要有一個程序進行監聽,這樣可以實現適時的報警
-A none:關閉報警機制
使用-s選項可以使snort把報警消息發送到syslog,默認的設備是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。
snort還可以使用SMB報警機制,通過SAMBA把報警消息發送到Windows主機。為了使用這個報警機制,在運行./configure腳本時,必須使用--enable-smbalerts選項。
下面是一些輸出配置的例子:
使用默認的日志方式(以解碼的ASCII格式)并且把報警發給syslog:./snort -c snort.conf -l ./log -s -h 192.168.1.0/24
使用二進制日志格式和SMB報警機制:./snort -c snort.conf -b -M WORKSTATIONS
snort規則簡介
snort最重要的用途是作為網絡入侵檢測系統,它有自己的規則語言。從語法上看,這種規則語言非常簡單,但是對于入侵檢測來說它足夠強大。對于匹配特定規則的數據包,snort有三種處理動作:pass、log、alert。
pass:放行數據包
log:把數據包記錄到日志文件
alert:產生報警消息并日志數據包
snort的每條規則都可以分成邏輯上的兩個部分:規則頭和規則選項。規則頭包括:規則行動(rule's action)、協議(protocol)、源/目的IP地址、子網掩碼以及源/目的端口。規則選項包含報警消息和異常包的信息(特征碼),使用這些特征碼來決定是否采取規則規定的行動。最基本的規則只是包含四個個域:處理動作、協議、方向、注意的端口。例如:
log tcp any any -> 10.1.1.0/24 79
這條規則表示:讓snort記錄從外部網絡到C類網址10.l.1所有數據包。
snort規則中還可以有規則選項(rule option),使用規則選項可以定義更為復雜的行為,實現更加強大的功能。下面是一條含有規則選項的規則(注意整個規則應該在一行,是出于版面的原因才分成兩行):
alert tcp any any -> 10.1.1.0/24 80 (content:
"/cgi-bin/phf";msg "PHF probe!")
這條規則用來檢測對本地網絡web服務器的PHF服務的探測,一旦檢測到這種探測數據包,snort就發出報警消息,并把整個探測包記錄到日志。
在規則中,IP地址的定義也有很大的靈活性。使用any關鍵詞表示任何IP地址或者端口。一般地,IP地址可以使用xx.xx.xx.xx/子網掩碼的形式定義,其中xx.xx.xx.xx是由.分割的四個字節的數字。注意不能使用域名方式,snort不對域名進行解析,當然是出于效率的考慮^_^。還可以使用非操作符!對IP地址和端口進行操作,這個操作符就是邏輯非的意思。對于端口,還可以使用操作符:限制端口的范圍。例如:
alert tcp !10.1.1.0/24 any -> 10.1.1.0/24 6000:6010 (msg: "X traffic";)
這條規則使snort對于從外部網絡到內部網絡X-window服務端口的數據包發出報警。
在snort當前版本(1.7)中有23個規則選項關鍵詞,隨著snort不斷地加入對更多協議的支持以及功能的擴展,會有更多的功能選項加入其中。這些功能選項可以以任意的方式進行組合,對數據包進行分類和檢測?,F在,snort支持的選項包括:msg、logto、ttl、tos、id、ipoption、fragbits、dsize、flags、seq、ack、itype、icode、icmp_id、content、content-list、offset、depth、nocase、session、rpc、resp、react。每條規則中,各規則選項之間是邏輯與的關系。只有規則中的所有測試選項(例如:ttl、tos、id、ipoption等)都為真,snort才會采取規則動作。
如何編寫規則
由于snort的規則語言語法非常簡單,所以可以對新發現的攻擊作出快速的反應,迅速開發新的snort規則。編寫新的規則,最重要的是知道新攻擊的特征碼。要得到一個新的攻擊的特征碼,一般的方法就是進行實際的測試。對一個測試網絡進行攻擊,使用snort記錄在攻擊主機和測試網絡之間的數據流。然后,對記錄的數據進行分析得到其唯一的特征碼,最后把得到的特征碼加入到規則中。我們以IMAP緩沖區溢出為例進行說明,圖8是一個假想的IMAP緩沖區溢出攻擊被記錄下的數據包:
052499-22:27:58.403313 192.168.1.4:1034 -> 192.168.1.3:143
TCP TTL:64 TOS:0x0 DF
***PA* Seq: 0x5295B44E Ack: 0x1B4F8970 Win: 0x7D78
90 90 90 90 90 90 90 90 90 90 90 90 90 90 EB 3B ...............;
5E 89 76 08 31 ED 31 C9 31 C0 88 6E 07 89 6E 0C ^.v.1.1.1..n..n.
B0 0B 89 F3 8D 6E 08 89 E9 8D 6E 0C 89 EA CD 80 .....n....n.....
31 DB 89 D8 40 CD 80 90 90 90 90 90 90 90 90 90 1...@...........
90 90 90 90 90 90 90 90 90 90 90 E8 C0 FF FF FF ................
2F 62 69 6E 2F 73 68 90 90 90 90 90 90 90 90 90 /bin/sh.........
這個攻擊的特征碼就是/bin/sh字符串及其前面的機器代碼。這實際上是一個shellcode。四用這些信息可以很快開發出一條新的規則:
alert tcp any any -> 192.168.1.0/24 143 (content:"|E8C0 FFF FF|/bin/sh";
msg:"New IMAP Buffer Overflow detected!";)
其中的特征碼含有文本和16進制兩種形式,它們以|分割,snort運行時都被轉換為二進制形式。
總結
本文介紹了一個輕量級的入侵檢測系統snort。主要討論了其特點、如何安裝,最基本的用法,以及如何開發新的規則。snort是一個高性能的入侵檢測系統,適用于大中小型網絡,尤其適合一些無力承受大型商業入侵檢測系統高昂費用中小型公司。
附錄
軟件作者簡介:
Martin Roesch是Stanford Telecommunications Inc的一位網絡安全工程師。從Clarkson大學獲得計算機工程學士學位。他在入侵檢測系統方面有豐富的經驗,并開發了許多專業系統。他是GTE Internetworking's Global Network Infrastructures IDS的主要軟件開發工程師。他還設計開發了GTE的商業蜜罐/欺騙(所謂的蜜罐就是,網絡節點使用路由器將攻擊者引導到一個經過特殊裝備的系統上,用這個系統作為目標主機的替身)系統Sentinel。他還是Trinux Linux Security Toolkit開發組的成員。snort是他第一個開放源碼軟件。