Snort 使用手冊,第 1 部分: 安裝與配置
保護和分析 Web 站點及其流量
Web 站點是 Internet 技術中最脆弱也最易受攻擊的部分。嘗試接觸 Snort,它是一款免費、開源的網絡入侵防禦系統(Network Intrusion Prevention System,NIPS)和網絡入侵檢測系統(Network Intrusion Detection System,NIDS)工具,用于管理和防禦黑客入侵您的 Web 站點、應用程式和支援 Internet 的程式。了解 Snort 能夠如何幫助保護您的站點,分析您的網絡的真實情況。學習本文之後,您将懂得利用 Snort 提供的某些進階入侵檢測,并根據 Snort 提供的資訊來優化您的站點和網絡。

評論:
Brett McLaughlin, 作家兼編輯, O\'Reilly Media Inc.
2007 年 6 月 24 日
- 内容
snort使用手冊IBM
在 IBM Bluemix 雲平台上開發并部署您的下一個應用。
現在就開始免費試用
安全性是重中之重
假設您已經付出了幾個月乃至幾年的時間來學習最熱門的 Web 技術。您閱讀了 developerWorks 的文章,購買了相關圖書,在您的 Mac OS X 終端和 Windows® shell 上進行了試驗。您已經設法建構了一個非常出色的約有 100 個頁面的 Web 應用程式 ——— 有一部分是靜态 HTML,還有一部分由 PHP 腳本生成。您已經開始添加某些 Ajax 技術和特效,使您的站點更具互動性,更具響應能力。您正處于 Web 程式設計世界的巅峰。
然而某一天早上醒來之後,您突然發現站點上全是某個與您毫無相關的站點的全頁橫幅廣告。此外,您的購物車也慢得跟蝸牛一樣,因為數千個無用資料包正在沖擊您的 Web 站點,這也使客戶煩惱和憤怒。
盡管聽起來很有戲劇性,但大多數認真的 Web 開發人都知道有些人已經遇到過類似的場景,或者自己親身經曆過這樣的場景。無論您的站點或應用程式有多出色,隻要未得到周全的保護,即便是相當成功的,也會成為攻擊的目标。無論是十二歲的頑童,還是作為商業間諜的專業黑客,Web 站點都是非常脆弱的,比其他類型的應用程式更容易受到攻擊。隻要每個月支付 20 美元(或者掌握一點接線技巧),任何人都可以随意通路 Internet。您的任務是保護站點,而不僅僅是開發站點。
developerWorks Ajax 資源中心
請通路 Ajax 資源中心,這是有關開發 Ajax 應用程式所需的免費工具、代碼和資訊的一站式中心。由 Ajax 專家 Jack Herrington 主持的 活躍 Ajax 社群論壇 也許可以幫助您解答疑問。
安全性不是他人的責任
現在,您可能在受挫地搖着頭,想着:“在辦公大廳另一端那個人” 負責處理安全性。您可能認為,處理安全性是那個人 的責任。盡管從理論上來說,這是正确的。但從實踐角度來看,則并非如此。如果您未執行基本的入侵檢測(以及防禦)就将站點托付給他人,那麼站點出現問題的話,就可能造成很大損失。
并非所有開發人員都是安全專家,但所有開發人員都應該 了解足夠多的知識,執行某些基本的網絡和流量分析,并在其應用程式内建構基本的安全性。在最糟糕的情況下,開發人員也應該把所需要的安全性告訴安全技術人員,進而確定其站點受到了保護。毫無疑問,由于您是 開發人員,安全性也就是您的 工作的一部分。
基本安全性并不困難
掌握 OSI 網絡模型、了解 TCP/IP 的所有方面、每天鑽研兩次資訊包,這些任務都困難得令人沮喪,但掌握入侵檢測和防禦(稍後我将更詳細地定義這些術語)的基礎知識并不困難。通過這篇文章以及不久之後即将推出的第二部分,您将成為一名合格的安全性管理者,能夠運用安全性的語言,能夠發現應用程式中正在發生什麼,而無需排隊等候 IS 或 IT 處理。
是以,請關閉您喜愛的 IDE(至少将其最小化),啟動終端或 shell,花幾個小時鑽研安全性。您不會後悔的,這将使您的應用程式和為這些應用程式付錢的客戶更加順利。
回頁首
Snort:一種入侵檢測工具
對于大多數系統和網絡管理者來說,Snort 是一種常見的、熟悉的工具。遺憾的是,Web 程式員并不這樣認為。如果提到 Snort,他們就将它與
traceroute
和
ipconfig
等技術混同起來,認為那不是 Web 開發人員應該管的。
然而,Snort 絕不僅僅是一種管理者的工具。它是一種入侵檢測系統 —— 而不僅僅是工具。盡管主要通過指令行使用,但 Web 程式員以及管理者也可輕松通路它。它是開源的,也就是說,它是免費的,與大多數開源工具不同,它得到了非常完善的維護。有着全面的文檔(包括線上形式和圖書形式,請參見 參考資料 中提供的連結),在您閱讀本文(或許是本系列的下一期)時,您将與衆多網絡和安全性管理者一樣熟悉 Snort。
那麼究竟什麼是入侵檢測系統?
今天開放網絡的數量達到曆史高峰。内部網依然很常見,但可通過其他方式公開通路的站點中受保護的部分更加常見。對于企業黑客來說,要做的工作并不是很複雜。他們不必再去嘗試潛入網絡并找到毫不了解的域或網絡,隻需進入自己了解的某個網絡的一部分即可。
入侵檢測将識别對網絡的非正常通路;這種通路與以不當的方式通路 Web 頁面一樣簡單(或許是受保護的管理表單或 shell 對 Web 站點的整個根目錄的通路)。另一方面,入侵可能非常複雜,例如更改 DNS 表,使得對一個站點的請求權不重定向到其他由黑客控制的域中,或使用一個更加随意的檔案來替代 Apache Web 伺服器上的 .htaccess 檔案,允許黑客添加、删除和更改使用者資訊 —— 包括密碼在内。
當然,檢測部分的核心就是識别并防止這種情況發生。是以,談論入侵檢測的工具或系統時,内容涉及到來自 Cisco 的高端專業防火牆和簡單的 Snort 安裝等等。并非有很多組織能夠為高端硬體投入大量資金,是以像 Snort 這樣的開源應用程式非常适合實施基本的入侵檢測,而帶來的費用和麻煩較少。
您确信這是我的問題?
确實,入侵檢測和 Snort 的使用都超越了 Web 站點本身,延伸為更廣泛的網絡安全問題。作為 Web 開發人員,沒有必要成為 Snort 專家,也沒有必要将 20% 的 Web 開發時間投入到入侵檢測的工作之中。出色的面向開發人員的入侵檢測旨在通過最少的時間獲得最大的收益。即每次修訂 Web 站點時都花點時間,為您的站點防止大多數攻擊。
回頁首
獲得 Snort
現在,您已經獲得了 Snort?首先使用 Web 浏覽器通路 Snort 的 Web 站點(參見 參考資料)。左側有一個很顯眼的 “GET SNORT” 連結,就在那隻大鼻子豬的下方。(嚴格來說,Snort 的徽标就是一頭大鼻子粉紅色小豬,似乎在噴鼻息)。在本文撰寫之時,最新的可付諸生産的版本是 2.8。本文的所有内容都同樣适用于 Snort 的 2.x 版本,隻需進行少許調整,甚至完全不需要調整。
如果您使用的是 Linux® 或 Windows,可以下載下傳二進制檔案。單擊生産檔案清單下的 “Click to view binaries >>” 連結即可下載下傳這些檔案。
- 如果您使用的是 Windows,首先單擊二進制檔案的連結,随後單擊 win32/ 連結。您将看到一個 .exe 檔案,名為 Snort_2_8_0_2_installer.exe,單擊即可開始下載下傳 Snort。
- 對于 Linux,選擇二進制檔案連結,然後單擊 linux/。您可以在幾個 RPM 中做出選擇,有些 RPM 帶有對 MySQL 和 PostreSQL 的預置支援。選擇所需 RPM,這樣就準備完畢了。
如果您希望專研得深入一些,或者如果您使用的不是 Windows、Linux 系統(如 Mac OS X),則應從主下載下傳連結中選擇下載下傳 GZipped TAR 檔案,其名稱類似于 snort-2.8.0.2.tar.gz(如果在本文撰寫發表之後,釋出的版本出現變化,具體檔案名可能會略有不同)。此檔案是 Snort 的源代碼,您可以通過此源代碼為您的特定平台進行生成。
回頁首
通過源代碼安裝 Snort
有三種基本安裝類型:
- 在 UNIX® 類型的平台上(UNIX、Linux、Mac OS X、Cygwin)通過源代碼安裝
- 在 Linux 上通過 RPM 安裝
- 通過 Windows .exe 安裝程式進行安裝
如果您正在使用 UNIX 類型的平台,則可通過源代碼生成 Snort。這是最靈活的一種選項,能夠確定專為您的系統生成 Snort。這種方法要稍微多花一些功夫,也有一些指令行或終端體驗,您很有可能能夠順利完成安裝。
Snort 需要一些二進制檔案,尤其是通過源代碼安裝時。是以,在開始處理 Snort 包本身之前,應準備好這些二進制檔案。
Windows 使用者,繼續使用二進制檔案
通過源代碼安裝 Snort 并不困難,它非常适合指令行環境,但需要使用 C 編譯器和衆多二進制檔案。即便您已經在自己的 Windows 計算機上安裝了 Cygwin,使用 GUI 安裝程式來使 Snort 準備好正常運作也是非常簡單的。如果您要通路 Mac OS X 或 Linux 計算機,那麼就應該選擇通過源代碼進行安裝,但若您正在保護一個 Windows 元件(假設是 Internet Information Server),那麼就不要引入不必要的麻煩。
在 Mac OS X 上安裝 C 編譯器
要通過源代碼安裝 Snort,您需要使用 C 編譯器。大多數 Linux 和 UNIX 平台都提供了一個 C 編譯器,名為
gcc
,是以無需進行額外的處理。對于 Mac OS X 使用者,
gcc
編譯器在預設情況下不會安裝。
要獲得用于 Mac OS X 的
gcc
,請通路 Apple Developer Connection(參見 參考資料),登入并選擇 Downloads。您将在頁面右側看到許多分類。選擇 Developer Tools,然後查找 Xcode,下載下傳用于 Tiger 或 Mac OS X 的更早期版本(即 10.4.x 或更早的版本)的 Xcode 2.5 的磁盤鏡像;如果您目前使用的是 Leopard(10.5.x 或更新版本),請選擇 Xcode 3.0。要下載下傳的檔案都很大,絕不僅僅是一個 C 編譯器,是以請耐心等待下載下傳完成。
最後,打開磁盤鏡像,浏覽 Installer 檔案夾。運作安裝程式,按提示完成各個步驟即可。為了确定您已經成功安裝了
gcc
,運作指令
gcc
即可:
[bdm0509:~/Desktop] gcc
powerpc-apple-darwin8-gcc-4.0.1: no input files
這是一個錯誤(您并未給
gcc
提供任何需要編譯的内容),但它指出了您的系統應該安裝編譯器。在 UNIX、Linux、Solaris 或 Cygwin on Windows 上也會獲得類似的響應。
添加 PCRE 支援
Snort 需要 Perl Compatible Regular Expressions,也就是 PCRE。您可以線上免費下載下傳該庫(參見 參考資料 部分),它可用于多種平台。将 .tar.gz 檔案解壓縮到一個目錄中,切換到此目錄:
[bdm0509:~/Desktop] tar xzf pcre-7.6.tar.gz
[bdm0509:~/Desktop] cd pcre-7.6
現在,通過
configure
腳本配置此安裝(稍後對 Snort 也要進行相同的處理)。結果如清單 1 所示。
清單 1. 為安裝配置 PCRE 包
[bdm0509:~/Desktop/pcre-7.6] ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... ./install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
...
Lots more output here...
...
config.status: executing script-chmod commands
config.status: executing delete-old-chartables commands
pcre-7.6 configuration summary:
Install prefix .................. : /usr/local
C preprocessor .................. : gcc -E
C compiler ...................... : gcc
C++ preprocessor ................ : g++ -E
C++ compiler .................... : g++
Linker .......................... : /usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld
C preprocessor flags ............ :
C compiler flags ................ : -O2
C++ compiler flags .............. : -O2
Linker flags .................... :
Extra libraries ................. :
Build C++ library ............... : yes
Enable UTF-8 support ............ : no
Unicode properties .............. : no
Newline char/sequence ........... : lf
\R matches only ANYCRLF ......... : no
EBCDIC coding ................... : no
Rebuild char tables ............. : no
Use stack recursion ............. : yes
POSIX mem threshold ............. : 10
Internal link size .............. : 2
Match limit ..................... : 10000000
Match limit recursion ........... : MATCH_LIMIT
Build shared libs ............... : yes
Build static libs ............... : yes
Link pcregrep with libz ......... : no
Link pcregrep with libbz2 ....... : no
Link pcretest with libreadline .. : no
接下來您隻需要完成用于生成和編譯代碼的程式,然後将其安裝到系統恰當的位置上即可。大多數程式、工具和實用工具(包括 PCRE 和 Snort)都允許您通過一個指令完成所有這些步驟:
make install
。但在執行這條指令之前,您應作為 root 使用者登入或使用
sudo
指令。Snort 和 PCRE 等大多數軟體包都需要寫入受保護的目錄,而普通使用者通常無法通路這樣的目錄。使用 root 使用者的權限或
sudo
指令就能順利完成。您應看到如清單 2 所示的結果。
清單 2. 安裝 PCRE(使用 sudo)
[bdm0509:~/Desktop/pcre-7.6] sudo make install
Password:
test -z "/usr/local/lib" || ./install-sh -c -d "/usr/local/lib"
/bin/sh ./libtool --mode=install /usr/bin/install -c \'libpcre.la\'
\'/usr/local/lib/libpcre.la\'
/usr/bin/install -c &.libs/libpcre.0.0.1.dylib /usr/local/lib/libpcre.0.0.1.dylib
(cd /usr/local/lib && { ln -s -f libpcre.0.0.1.dylib libpcre.0.dylib ||
{ rm -f libpcre.0.dylib && ln -s libpcre.0.0.1.dylib libpcre.0.dylib; }; })
(cd /usr/local/lib && { ln -s -f libpcre.0.0.1.dylib libpcre.dylib ||
{ rm -f libpcre.dylib && ln -s libpcre.0.0.1.dylib libpcre.dylib; }; })
/usr/bin/install -c .libs/libpcre.lai /usr/local/lib/libpcre.la
/usr/bin/install -c .libs/libpcre.a /usr/local/lib/libpcre.a
chmod 644 /usr/local/lib/libpcre.a
ranlib /usr/local/lib/libpcre.a
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
...
Lots more output here...
...
test -z "/usr/local/include" || ./install-sh -c -d "/usr/local/include"
/usr/bin/install -c -m 644 \'pcre.h\' \'/usr/local/include/pcre.h\'
/usr/bin/install -c -m 644 \'pcrecpparg.h\' \'/usr/local/include/pcrecpparg.h\'
/usr/bin/install -c -m 644 \'pcre_stringpiece.h\'
\'/usr/local/include/pcre_stringpiece.h\'
test -z "/usr/local/lib/pkgconfig" || ./install-sh -c -d "/usr/local/lib/pkgconfig"
/usr/bin/install -c -m 644 \'libpcre.pc\' \'/usr/local/lib/pkgconfig/libpcre.pc\'
/usr/bin/install -c -m 644 \'libpcrecpp.pc\' \'/usr/local/lib/pkgconfig/libpcrecpp.pc\'
有了這些庫和工具,您就可以轉向核心的 Snort 配置和安裝了。
配置 Snort
下載下傳了 Snort 源代碼的 .tar.gz 檔案之後,将其解壓縮到一個便于通路的目錄中。可以使用這樣的指令:
[bdm0509:~/Desktop] tar xzf snort-2.8.0.2.tar.gz
在 Mac OS X 中,也可以輕按兩下檔案,由 GUI 解壓工具來處了解壓縮的工作。您将獲得一個類似于 snort-2.8.0.2 的檔案夾,内容應如清單 3 所示。
清單 3. Snort 安裝檔案夾的目錄清單
[bdm0509:~/Desktop/snort-2.8.0.2] ls
COPYING
ChangeLog
LICENSE
Makefile.am
Makefile.in
RELEASE.NOTES
aclocal.m4
config.guess
config.h.in
config.sub
configure
configure.in
contrib
depcomp
doc
etc
install-sh
ltmain.sh
m4
missing
mkinstalldirs
preproc_rules
rpm
schemas
snort.8
src
templates
verstuff.pl
ylwrap
現在,切換到剛剛建立的目錄。運作
configure
,這是一個腳本指令,嘗試為您自動配置安裝。您的輸出應如清單 4 所示。
清單 4. 為安裝配置 Snort 包
[bdm0509:~/Desktop/snort-2.8.0.2] ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... ./install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific
portions of Makefiles... no
checking for style of include used by make... GNU
checking for gcc... gcc
...
lots more output...
...
config.status: creating doc/Makefile
config.status: creating contrib/Makefile
config.status: creating schemas/Makefile
config.status: creating rpm/Makefile
config.status: creating preproc_rules/Makefile
config.status: creating m4/Makefile
config.status: creating etc/Makefile
config.status: creating templates/Makefile
config.status: creating src/win32/Makefile
config.status: creating config.h
config.status: executing depfiles commands
在您的系統上安裝 Snort
在安裝了 PCRE 之後,下一步就是:再次運作
make install
,同樣以 root 使用者的身份或使用
sudo
指令運作。您的輸出應如清單 5 所示。
清單 5. 在 Snort 目錄上運作
make install
[bdm0509:~/Desktop/snort-2.8.0.2] sudo make install
Password:
Making install in src
Making install in sfutil
gcc -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../src -I../../src/sfutil
-I/sw/include -I../../src/output-plugins -I../../src/detection-plugins
-I../../src/dynamic-plugins -I../../src/preprocessors
-I../../src/preprocessors/flow -I../../src/preprocessors/portscan
-I../../src/preprocessors/flow/int-snort -I../../src/preprocessors/HttpInspect/include
-I../../src/preprocessors/Stream5 -I../../src/target-based -I/usr/local/include
-fno-strict-aliasing -g -O2 -Wall -DDYNAMIC_PLUGIN -fno-strict-aliasing
-c sfghash.c
...
Lots more output...
...
Making install in preproc_rules
make[2]: Nothing to be done for `install-exec-am\'.
make[2]: Nothing to be done for `install-data-am\'.
make[2]: Nothing to be done for `install-exec-am\'.
test -z "/usr/local/share/man/man8" || ./install-sh -c -d "/usr/local/share/man/man8"
/usr/bin/install -c -m 644 \'./snort.8\' \'/usr/local/share/man/man8/snort.8\'
如果在運作
configure
和
make
的解壓縮目錄中未看到很多變化,也不必擔心。這裡的大多數工作都是在系統用于二進制檔案、庫和可執行檔案的目錄中完成的。
回頁首
在 Linux 上通過 RPM 安裝 Snort
RPM 表示 RPM Package Manager。(沒錯,這個縮寫實際上是循環的。并不是很有意義,但符合事實。)RPM on Linux 是可以輕松安裝的軟體包,因為 RPM 支援是市面上所有 Linux 釋出版的核心。從 Snort Web 站點下載下傳了一個 RPM 之後,隻需将您下載下傳的檔案名作為參數運作
rpm
指令即可,如清單 6 所示。
清單 6. 在 Snort RPM 上調用 rpm
[bdm0509@pegasus]# rpm -ivh snort-2.8.0.2-1.RH5.i386.rpm
Preparing... ################################################ [100%]
1:snort ################################################ [100%]
ivh
選項代表安裝、詳盡和井号,它會安裝軟體包,同時告訴您所有細節(還會為您提供井号狀态名額)。在本例中,安裝是在 Red Hat 上進行的,但您會在任何 Linux 釋出版上看到類似的結果。
與通過源代碼安裝 Snort 類似,您可能需要作為 root 使用者登入來運作此指令,或使用
sudo
指令來作為超級使用者安裝 RPM。Snort 希望其二進制檔案能夠置于受保護的目錄中,如 /usr/bin、/usr/local/bin,是以标準系統上的安裝需要高于大多數普通使用者賬戶的權限。
回頁首
通過 Windows 二進制安裝程式安裝 Snort
您下載下傳的 Windows 安裝程式的名字應類似于 Snort_2_8_0_2_Installer.exe。運作安裝程式,在 Windows 提示時确認您信任該應用程式,接受 Snort 許可協定。
選擇資料庫支援
您的第一個決定就是希望提供哪種類型的資料庫支援。圖 1 展示的螢幕允許您在預設設定(即支援 SQL Server 的配置)與支援 Oracle 的配置之間做出選擇。
圖 1. 選擇所需的資料庫登入支援
此螢幕上的選項均應用于登入:Snort 在嗅探包時可以登入資料庫。(如果您對此感到迷惑,在下文中将得到解釋。)如果您不希望登入到資料庫,而是希望僅登入到檔案,或者希望登入到 MySQL 資料庫以及 Microsoft Access 等 ODBC 可通路的資料庫,則應選擇第一個選項。否則選擇用于 SQL Server 或 Oracle 的選項。
選擇要安裝的元件
接下來是選擇要包含在安裝之中的元件(參見圖 2)。
圖 2. 指出您希望安裝哪些 Snort 元件
這裡有四個選項:Snort 本身、動态子產品、文檔和模式。沒有理由不全部安裝,完全安裝隻需要大約 24 MB 的空間,是以應選中所有元件繼續操作。
選擇安裝目錄
預設情況下,Snort 将安裝在 C:\Snort 中,如圖 3 所示。
圖 3. 選擇 Snort 安裝目錄
這個預設目錄是理想的首選目錄。因為 Snort 并沒有過多的 GUI 元件,它實際上不屬于典型的 Windows 應用程式,安裝目錄也不在 C:\Program Files 之下。除非您能夠為 Snort 這樣的程式選擇标準安裝目錄,否則應使用預設設定。
安裝和關閉
奇怪的是,Snort 并未提供非常有用的 “安裝完成” 螢幕。與之不同,您将看到一個已經完成的狀态條和一個 Close 按鈕(如圖 4 所示)。
圖 4. 安裝在此時已經完成
單擊 Close 按鈕,您就會看到彈出視窗,表明 Snort(幾乎)已經為運作做好了準備(如圖 5 所示)。
圖 5. Snort 指出一些安裝後的任務
安裝 WinPcap
Snort 明确地告訴您:在 Snort 能夠使用之前,還有一些安裝工作需要完成。第一項就是 WinPcap。WinPcap 是 Windows Packet Capture Library 的簡寫,它提供了某種類型的網絡通路,而 Snort 的 IDS 和包嗅探功能需要這些通路。請通路 WinPcap 的 Web 站點(參見 參考資料),單擊 Get WinPcap 連結。
選擇最新的穩定版本下載下傳,在本文撰寫之時,最新版本是 4.0.2。下載下傳包括一個 Windows 安裝程式,可輕按兩下啟動它(如圖 6 所示)。
圖 6. WinPcap 的安裝很簡單
安裝非常簡單,隻要連續單擊 Next 按鈕即可。這樣,WinPcap 就可随時運作了。
編輯路徑
接下來的内容有些偏離主題,至少不是這篇文章關注的主題。Snort 的安裝提示您編輯 snort.conf 檔案,觀察在哪裡查找規則和其他配置檔案。這非常重要,但應該是我們後面讨論的話題。目前,隻要安裝好 Snort 和 WinPcap 即可。
但是,這裡還有一個步驟,需要處理之後才能繼續。您需要将 Snort 可執行檔案添加到 PATH 語句之中,它的位置是 C:\Snort\bin\snort.exe(假設您選擇的是預設安裝目錄)。設定的位置與作業系統有關。您需要找到 System Properties 對話框(在 “控制台” 中或者選擇 “控制台” > “系統”),選擇 Advanced System Properties,注意觀察一個名為 Environment Variables 的按鈕或頁籤。
其中有兩個框(類似于圖 7)。您需要選擇上邊的框,也就是使用者變量,它僅應用于您的使用者。(您很可能不希望系統上的所有使用者都能運作 Snort,而無視您竭盡全力為某些程式設定的安全性制約。)
圖 7. Windows 提供兩組環境變量
如果還沒有用于 PATH 的項,請選擇上方的 New... 按鈕。如果您已經有了一個項,則應選擇 Edit..。在對話框中,輸入 PATH 作為變量名,輸入 C:\Snort\bin 作為值。圖 8 展示了在完成時的效果。
圖 8. 建立一個 PATH 變量并在 Snort 的可執行檔案中指向它
選擇 OK,然後關閉所有對話框。打開指令提示符,鍵入
snort
,您應看到類似于圖 9 所示的輸出結果。
圖 9. 通過指令提示符運作 Snort
提示:下文将重複這一步驟,在 運作 Snort 二進制檔案 一節中,但如果您使用的是 Windows,那麼值得立即學習,因為這些步驟能夠糾正與環境變量設定相關的所有問題。
回頁首
測試安裝
在完成安裝之後,您需要采取幾個步驟,確定 Snort 可在系統上正常運作。一切都很簡單,但在每次安裝新版本的 Snort 或在新機器上安裝 Snort 時都需要執行這些步驟。
運作 Snort 二進制檔案
可以執行的最簡單的測試就是運作
snort
指令。要開始測試,請切換到機器上的任意随機目錄。但為了安全起見,請不要在 Snort 安裝目錄中執行此指令。您應得到類似于清單 7 所示的輸出結果。
清單 7. 測試 Snort 二進制檔案
[bdm0509:~] snort
,,_ -*> Snort! <*-
o" )~ Version 2.8.0.2 (Build 75)
\'\'\'\' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.
Using PCRE version: 7.6 2008-01-28
USAGE: snort [-options] <filter options>
Options:
-A Set alert mode: fast, full, console, test or none (alert file alerts only)
"unsock" enables UNIX socket logging (experimental).
-b Log packets in tcpdump format (much faster!)
-B <mask> Obfuscated IP addresses in alerts and packet dumps using CIDR mask
-c <rules> Use Rules File <rules>
-C Print out payloads with character data only (no hex)
-d Dump the Application Layer
-D Run Snort in background (daemon) mode
-e Display the second layer header info
-f Turn off fflush() calls after binary log writes
-F <bpf> Read BPF filters from file <bpf>
-g <gname> Run snort gid as <gname> group (or gid) after initialization
-G <0xid> Log Identifier (to uniquely id events for multiple snorts)
-h <hn> Home network = <hn>
-H Make hash tables deterministic.
-i <if> Listen on interface <if>
-I Add Interface name to alert output
-k <mode> Checksum mode (all,noip,notcp,noudp,noicmp,none)
-K <mode> Logging mode (pcap[default],ascii,none)
-l <ld> Log to directory <ld>
-L <file> Log to this tcpdump file
-M Log messages to syslog (not alerts)
-m <umask> Set umask = <umask>
-n <cnt> Exit after receiving <cnt> packets
-N Turn off logging (alerts still work)
-o Change the rule testing order to Pass|Alert|Log
-O Obfuscate the logged IP addresses
-p Disable promiscuous mode sniffing
-P <snap> Set explicit snaplen of packet (default: 1514)
-q Quiet. Don\'t show banner and status report
-r <tf> Read and process tcpdump file <tf>
-R <id> Include \'id\' in snort_intf<id>.pid file name
-s Log alert messages to syslog
-S <n=v> Set rules file variable n equal to value v
-t <dir> Chroots process to <dir> after initialization
-T Test and report on the current Snort configuration
-u <uname> Run snort uid as <uname> user (or uid) after initialization
-U Use UTC for timestamps
-v Be verbose
-V Show version number
-w Dump 802.11 management and control frames
-X Dump the raw packet data starting at the link layer
-y Include year in timestamp in the alert and log files
-Z <file> Set the performonitor preprocessor file path and name
-? Show this information
<Filter Options> are standard BPF options, as seen in TCPDump
Longname options and their corresponding single char version
--logid <0xid> Same as -G
--perfmon-file <file> Same as -Z
--pid-path <path> Specify the path for the Snort PID file
--snaplen <snap> Same as -P
--help Same as -?
--version Same as -V
--alert-before-pass Process alert, drop, sdrop, or reject before pass,
default is pass before alert, drop,...
--treat-drop-as-alert Converts drop, sdrop, and reject rules into alert
rules during startup
--process-all-events Process all queued events (drop, alert,...),
default stops after 1st action group
--dynamic-engine-lib <file> Load a dynamic detection engine
--dynamic-engine-lib-dir <path> Load all dynamic engines from directory
--dynamic-detection-lib <file> Load a dynamic rules library
--dynamic-detection-lib-dir <path> Load all dynamic rules libraries from
directory
--dump-dynamic-rules <path> Creates stub rule files of all loaded rules libraries
--dynamic-preprocessor-lib <file> Load a dynamic preprocessor library
--dynamic-preprocessor-lib-dir <path> Load all dynamic preprocessor libraries from
directory
--dump-dynamic-preproc-genmsg <path> Creates gen-msg.map files of all loaded
preprocessor libraries
--create-pidfile Create PID file, even when not in Daemon mode
--nolock-pidfile Do not try to lock Snort PID file
--disable-inline-initialization Do not perform the IPTables initialization in inline
mode.
--loop <count> In combination with the -r <tf> option,
this will read the tcpdump file continuously
for <count> times. A value of 0 will read the pcap
until Snort is killed.
ERROR:
Uh, you need to tell me to do something...
Fatal Error, Quitting..
最後出現了錯誤,但在這個過程中完成了一些重要的事情:
- 它确認了 Snort 二進制檔案已正确安裝到了您的路徑中。這也就是說,您可以從計算機的任何目錄運作它。
- 它為您提供了關于 Snort 版本及其相關庫的重要資訊。請注意靠近輸出頂端的這段輸出内容:
這使您可以輕而易舉地看到正在運作的 Snort 和 PCRE 的版本。,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) \'\'\'\' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28
- 它為您提供了可向 Snort 發送的簡單指令綱要。
使用 Snort 進行嗅探
您知道,Snort 是一種入侵檢測系統,但它是如何檢測入侵的呢?Snort(和大多數高端 IDS)都會嗅探 網絡流量。嗅探器是一種工具或裝置(帶有網卡),用于監控計算機之間的網絡流量。有些嗅探器是 “第三方”,嗅探外部機器與嗅探器本身之間的流量。也有一些嗅探器會嗅探網絡和嗅探器本身所在計算機之間的流量。在下一期的文章中,我們将進一步介紹嗅探,如果您目前對嗅探有不明确的地方,請不要擔心。
目前,嗅探是一種簡單而有用的方法,能夠確定 Snort 已安裝且能夠正常工作,能夠監控網絡流量。使用
-v
标記運作
snort
指令,這告知 Snort 嗅探網絡流量,将資訊輸出到控制台。清單 8 展示了在 Mac OS X 機器上運作
snort -v
的輸出結果。
清單 8. 使用 Snort 進行嗅探
[bdm0509:~] snort -v
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
Verifying Preprocessor Configurations!
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
ERROR: You don\'t have permission to sniff.
Try doing this as root.
Fatal Error, Quitting..
是的,這是一個錯誤,在這裡輸出有一個重要的目的:Snort 需要廣泛的權限來完成大量工作。嗅探是一項基本操作,但毫無疑問,如果沒有 root 權限,沒有使用
sudo
的能力,就很難充分利用 Snort。
嘗試相同的指令,但這一次在超級使用者的賬戶下運作。您應看到類似于清單 9 的輸出結果。必須使用 Ctrl+C 退出,否則 Snort 将一直運作。
清單 9. 使用 Snort 進行嗅探(成功的結果)
[bdm0509:~] sudo snort -v
Password:
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
Verifying Preprocessor Configurations!
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
Decoding Ethernet on interface en0
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.8.0.2 (Build 75)
\'\'\'\' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.
Using PCRE version: 7.6 2008-01-28
Not Using PCAP_FRAMES
03/31-08:55:12.179192 192.168.1.102:64862 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10292 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.179498 192.168.1.102:64863 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10293 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.180278 192.168.1.102:64865 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10295 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.247880 192.168.1.102:64866 -> 192.168.1.255:137
UDP TTL:64 TOS:0x0 ID:10296 IpLen:20 DgmLen:78
Len: 50
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.248297 192.168.1.103:137 -> 192.168.1.102:64866
UDP TTL:64 TOS:0x0 ID:8075 IpLen:20 DgmLen:90
Len: 62
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.599248 192.168.1.102:55381 -> 192.168.1.101:139
TCP TTL:64 TOS:0x0 ID:10297 IpLen:20 DgmLen:64 DF
******S* Seq: 0x42127B5E Ack: 0x0 Win: 0xFFFF TcpLen: 44
TCP Options (8) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1428368232 0
TCP Options => SackOK EOL
...
LOTS more output here
...
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976018 0.0.0.0:68 -> 255.255.255.255:67
UDP TTL:64 TOS:0x0 ID:48134 IpLen:20 DgmLen:328
Len: 300
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1
03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68
UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576
Len: 548
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:22.977578 ARP who-has 192.168.1.104 tell 192.168.1.104
^C*** Caught Int-Signal
Run time prior to being shutdown was 14.231224 seconds
===============================================================================
Packet Wire Totals:
Received: 78
Analyzed: 78 (100.000%)
Dropped: 0 (0.000%)
Outstanding: 0 (0.000%)
===============================================================================
Breakdown by protocol (includes rebuilt packets):
ETH: 78 (100.000%)
ETHdisc: 0 (0.000%)
VLAN: 0 (0.000%)
IPV6: 0 (0.000%)
IP6 EXT: 0 (0.000%)
IP6opts: 0 (0.000%)
IP6disc: 0 (0.000%)
IP4: 71 (91.026%)
IP4disc: 0 (0.000%)
TCP 6: 0 (0.000%)
UDP 6: 0 (0.000%)
ICMP6: 0 (0.000%)
ICMP-IP: 0 (0.000%)
TCP: 57 (73.077%)
UDP: 14 (17.949%)
ICMP: 0 (0.000%)
TCPdisc: 0 (0.000%)
UDPdisc: 0 (0.000%)
ICMPdis: 0 (0.000%)
FRAG: 0 (0.000%)
FRAG 6: 0 (0.000%)
ARP: 3 (3.846%)
EAPOL: 0 (0.000%)
ETHLOOP: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 4 (5.128%)
DISCARD: 0 (0.000%)
InvChkSum: 0 (0.000%)
Upconvt: 0 (0.000%)
Up fail: 0 (0.000%)
S5 G 1: 0 (0.000%)
S5 G 2: 0 (0.000%)
Total: 78
===============================================================================
Action Stats:
ALERTS: 0
LOGGED: 0
PASSED: 0
===============================================================================
Snort exiting
目前看來,這很可能沒有太多意義,但沒有關系。在本系列結束前,您将了解更多相關内容。目前,我們的任務是確定 Snort 已正确安裝。如果您能夠将 Snort 作為嗅探器運作,也就做好了繼續使用 Snort 的準備,而不僅僅是向它發送令人迷惑的指令。
回頁首
但我沒有 root 通路權限!
至此為止,您已經了解到,Snort 需要的權限超過大多數普通使用者賬戶的能力。即使您能夠說服網絡或系統管理者安裝 Snort —— 并且為他們沒有安裝 Snort 而惋惜 —— 但如果沒有獲得額外的特權,您依然是隻利用了 Snort 的部分功能。
然而,在普通的使用者賬戶和 root 使用者(或通過
sudo
指令授予的特權)之間仍然存在顯著差異。大多數管理者都願意幫助您縮短一點這個的差距。下面介紹了一種合理的方法,能使您的管理者允許您使用 Snort,并授予您使用 Snort 所需的權限:
安裝 Snort
首先,安裝 Snort。同樣,某些管理者已經使用了 Snort。切記,Snort 不必運作在您希望保護和嗅探的機器之上。例如,您可能在幾台伺服器上管理幾個 Web 站點。如果 Snort 能在所有伺服器上運作并通路,并且您能夠輕松通過遠端登入使用它,這當然更好;但您也可以在您自己的機器上運作 Snort,并将其指向運作站點的伺服器,進而獲得大量資訊。是以,您将能夠使用 Snort 在您自己的桌面或筆記本電腦上為所欲為(重申一下,這并不是理想的做法,但至少可以算是朝着正确方向發展的一個步驟)。
如果管理者對您提起 Snort 毫無動情,請為他們推薦本文或 參考資料 中提到的某些 Snort 書籍。如果您能幫助保護他們負責的伺服器,那麼他們可能會更樂于為您提供所需的更多權限。
確定您可以運作 Snort
下一項優先任務就是確定您能夠運作
snort
指令。因為 Snort 安裝在 /usr/local/bin 中(預設目錄),是以這非常簡單,隻需為所有使用者或您的使用者賬戶開放此目錄,或者允許您的使用者(或一個可以添加使用者賬戶的組)使用該特定的二進制檔案。最好的方法是首先提出最具體的請求。詢問您的管理者,他們能否使您的特定使用者賬戶可以運作 /usr/local/bin/snort。
實際上,大多數管理者都有較重的工作壓力,往往十分忙碌。他們授予您的權限通常會超過您所要求的權限,但希望您不會提出一些在他們看來十分荒謬的要求,例如為您的賬戶授予對其負責的伺服器上所有重要可執行程式的通路權限。您通常會得到居中的權限,例如進入可通路 Snort 等并不通用的程式的組,但這些程式并不存在像更改使用者密碼或删除使用者賬戶那樣的危險。
確定您能夠使用 Snort
遺憾的是,Snort 需要寫入大量受限的目錄,并且要在其中運作。這也就是說,即便您可以運作 Snort,通常也無法使用它來做任何有生産意義的事情。參考下面的步驟,并堅持閱讀本系列文章,我們将提供解決方法。
首先,預設情況下,Snort 所做的許多工作都要在受限目錄中完成,它可以請求不受保護的目錄。是以,您可以選擇使 Snort 登入您已經有權通路的目錄,減少部分權限問題。但最終,您依然會看到錯誤,如清單 10 所示。
清單 10. 權限錯誤
[bdm0509:~] snort -v
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
Verifying Preprocessor Configurations!
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
ERROR: You don\'t have permission to sniff.
Try doing this as root.
Fatal Error, Quitting..
壞消息是:不存在好的規避方法,它需要通常與 root 使用者相關聯的權限。但也有好消息:也是這篇文章對 Web 開發人員而不僅僅是系統和網絡管理者都有意義 —— 您在本地機器上配置和運作的一切都适用于在生産機器上運作的 Snort。是以,在您生成配置檔案時,了解如何記錄警報,為 Snort 開發規則,而這一切都在您的本地安裝上完成(甚至可能是一台筆記本電腦),這樣,您就是在建構一個可在任何位置檢測入侵的系統。
雖然大多數管理者不會允許您自由支配,但許多管理者會準許您為他們提供腳本和規則檔案(在下一期的文章中,我們将進一步介紹規則),由他們來替您運作 —— 往往是在您小心謹慎的時候。這是最好的情況嗎?或許不是,但仍然會提供站點保護,這也是底線。
使日志和警報通過郵件發送給您
對于大多數 IDS 和管理者來說,最遺憾的事實莫過于常常發現很多問題,也忽略了很多問題。管理者有繁重的工作,即便您已經很好地設定了 Snort,為它提供了可靠的規則,仍然不代表您将得到一個安全的系統。大多數入侵都需要操作。因而,如果有可能,您應該要求管理者通過郵件為您發送日志和警封包件,不久之後,您的 Snort 将可以生成此類檔案。您可以每周要求一次,作為自動化作業完成,但還可能需要配置 Snort,在問題出現時,自動為您和管理者發送郵件。同樣,弄清楚在您的機器上完成此任務的配置,然後将其送出給管理者,幫助管理者完成此工作。
這樣,無論您是 root 使用者、具有超級使用者特權的網絡管理者,還是因系統管理者保護過度而為安裝 PHP 腳本據理力争的 Web 開發人員,您都将受益于對 Snort 的深入了解。
回頁首
試用三項功能
至此,您應已得到了可正常工作的 Snort 安裝,也對使 Snort 運作(即便在半受限的環境中)有了一些深入的了解。在本文結束之前,我們有機會來觀察和試用 Snort 的三項基本功能。這使您能夠為下一篇文章做好準備,并具體了解 Snort 能夠為您的系統帶來怎樣的影響。
Snort 是一種包嗅探器
包 就是一組格式化的資料。網絡不習慣于用較大的資料塊或較小的位元組來表示資料,而習慣于以包為機關。包不僅提供了資料,還提供了關于資料的簡單資訊。這允許包的發送方表明所發送的資料類型,也使包的接收方能夠在研究資料本身之前對包的資料略有認識(稱為有效負載)。
我的 IP 位址是什麼?
有多種方法可用于确定您的計算機的 IP 位址。大多數 GUI 都提供了以可視化方法查找計算機 IP 位址的手段。Windows 中的網絡控制台提供了相關報告(在 TCP/IP 協定下);在 Mac OS X 上,System Preferences 中的 Network 面闆将告訴您 IP 位址。還可利用一些指令。在 Windows 中,從指令行中運作
ipconfig
。在 Mac OS X 、Linux 和 UNIX 中,
ifconfig
的變體将完成此任務。
包嗅探器是一種工具,它會嗅探或調查包。使用 Snort,您可以在包的級别檢查網絡流量,這允許您檢視原始資料,以及包的接收方附加到原始資料之上的資訊。這是您使用帶有
-v
标記的
snort
指令時獲得的結果,将 Snort 作為包嗅探器運作時,您會獲得三方面的資訊:
- 關于 Snort 将資訊記錄到何處及其所檢查的網絡接口的資訊。
- Snort 所嗅探的包,發送到指定網絡接口,或從指定網絡接口發出。
- Snort 在本次運作中完成的所有任務的彙總(在您結束嗅探時輸出,通常要使用 Ctrl+C 控制)。
在下一篇文章中,您将了解到這些包中究竟有哪些内容,如何開始對這些包進行基本分析。目前,隻需思考一下,對于各包來說,所有資訊是都是針對該包報告的。這裡是一個包的輸出結果:
03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64
Len: 36
如果您不确定,可嘗試在您自己的機器上嗅探包,使用您自己的 Snort 安裝,作為輔助,您還需要檢視自己的 IP 位址。這将允許您将尚不确定的内容整理在一起。
Snort 是一種包記錄器
包嗅探非常出色,但如您所見,Snort 的包嗅探模式假設您一直關注着顯示器,急切地檢視數千行網絡資料。當然,您已經有了需要設計的站點和需要掌控的世界,是以這顯然不理想。通過為 Snort 添加
-l
開關,就能告訴它将包記錄到您標明的目錄中(如清單 11 所示)。
清單 11: 告訴 Snort 在何處記錄包
[bdm0509:~/Documents/developerworks/snort_1] sudo snort -l myLogDir/
Password:
Running in packet logging mode
Log directory = myLogDir/
--== Initializing Snort ==--
Initializing Output Plugins!
Verifying Preprocessor Configurations!
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
Decoding Ethernet on interface en0
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.8.0.2 (Build 75)
\'\'\'\' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.
Using PCRE version: 7.6 2008-01-28
Not Using PCAP_FRAMES
請注意,這條指令在前台啟動 Snort;如果此時按下 Ctrl+C,重新調出終端提示符,也就中止了 Snort 的記錄。是以,應将 Snort 作為包記錄器在一個可最小化、可忽略的視窗中運作,更好的方法是,将其作為長期運作的程序(作為守護程序或系統程序)。
退出此程序時,Snort 會為您提供與前述相同的彙總資料。但也會在您指定的目錄中建立一個檔案,列舉所嗅探過的包:
[bdm0509:~/Documents/developerworks/snort_1] ls myLogDir/
snort.log.1206998502
打開這個檔案,您将看到 Snort 運作時嗅探過的包的更多具體資訊。但務必牢記,如果必須作為超級使用者(使用
sudo
)或 root 使用者運作 Snort,也就必須使用相同的權限打開此檔案。
檢視該檔案,它與上文列出的嗅探器輸出略有不同。實際上,它的用處更小 —— 除非您想了解 Snort 如何分析自己的檔案。這也是另一篇文章的主題,現在您嘗試了使用 Snort、使用指令行版本、包嗅探器,但包記錄器的更多内容不在此處贅述。
Snort 是 IDS(或 NIDS)
從根本上來說,包嗅探和包記錄(以及對這些記錄的分析)都是入侵檢測系統(或者說 Snort 的另一種稱呼:NIDS,即網絡入侵檢測系統)的子系統。這是 Snort 最傑出的領域。也是涉獵廣泛、講究技巧的方面。由于入侵的類型不斷迅速變化,Snort 有一組規則,您可從 Snort 的站點下載下傳這些規則,它們詳細闡述了這些入侵,允許 Snort 觀察入侵。規則頻繁更改,保證(至少是嘗試保證)與最新攻擊的各種類型保持一緻。
此外,您需要配置 Snort,告訴它在感覺到攻擊時應采取怎樣的措施。這是您此前與之建立良好合作關系的網絡和系統管理者出面拯救您的站點的時機……讓他們來負責采取措施應對攻擊。但如果您能通過送出配置和規則檔案來使他們注意到攻擊,那麼您就已經在這場遊戲中占據了領先地位。
如果您耐心不足,或者無法等待嘗試将 Snort 作為 IDS 使用,請嘗試運作
snort -A
,這會将 Snort 切換為警報 模式。您必須付出一定的努力,才能使它正常運作,但在等待下一篇文章發表期間,這是一項不錯的 Snort 試驗。
回頁首
結束語
Web 開發不僅僅與 HTML 和 CSS 有關,Web 程式設計的範疇也遠不止 Java™ 代碼、C++ 和 PHP。實際上,您要建構的是功能型應用程式。如果使用者無法上線、無法從他們喜愛的廠商那裡購買商品、無法在當地美術館中找到最新抽象水彩畫的價格,那麼您的所有代碼都等于零。無論您的程式設計和設計技能有多麼出衆,使用者都不能 —— 也不會使用遭受過攻擊,有着不恰當圖檔、報價過高或者更低(這對廠商來說,更加糟糕)的購物車的應用程式和 Web 頁面。出色的開發人員和設計人員不僅僅是代碼寫手。他們至少應該參與保護自己的資産,就像好的投資商一樣。他們的工作成果正常運作的時間越長,其價值也就越高。
可以證明,Snort 是市面上最好、最易用或許也是最便宜的入侵檢測系統。在幾分鐘内即可完成安裝,它易于設定和運作,它十分靈活。從包嗅探、分析一直到向您或管理者發出可能出現入侵的警報,Snort 能夠保護您的工作成果,使之免受攻擊。目前,您應在至少一台機器上運作 Snort(如果您真正了解了,那麼或許應該在幾台不同平台的機器上運作),執行一些基本的包嗅探工作。您應該很好奇,這些包中究竟有什麼内容,Snort 還允許您做哪些事情。
在等待這些包的具體資訊,思考出色的 IDS 應該檢測哪些類型的警報并繼續試用 Snort 時,這裡有一些關于實踐的想法。首先,以包嗅探或包分析模式啟動 Snort。随後,嘗試以下場景:
- 如果您的機器嗅探包上已經有了一個 Web 伺服器,将另一機器上的浏覽器指向該 Web 伺服器,随意浏覽。請注意另一台機器(使用浏覽器的機器)的 IP 位址。您在來自 Snort 的包日志或輸出中看到了哪些内容?您能否找到 Web 流量?
- 嘗試從另外一台機器遠端登入或 FTP 登入到所嗅探的機器。然後您看到了怎樣的流量?
- 在沒有 index.html(或 .php、.htm 等)的 Web 伺服器上建立目錄。在該目錄中放置一些檔案,允許匿名目錄清單。将另外一台機器的浏覽器指向該目錄。流量(和表示該流量的包)與普通的 HTML 或 PHP 頁面是否有差别?有什麼樣的差别?
- 使用 Apache .htaccess 檔案或您的伺服器所提供的内容設定身份驗證。從另外一台機器通路受保護的資源。包看上去是怎樣的?在成功登入時又是怎樣?使用有效憑據而未能成功登入時又是怎樣?
這隻是一些想法,但能幫助您很好地了解在典型的 Web 伺服器請求/響應模型中四處傳遞的包。試試看您能否确定什麼是 “正常” 的流量,什麼是不正常的流量。請繼續關注下個月的文章,我們将進一步探讨警報、規則等内容,介紹如何避免您的系統遭遇嚴重的入侵。
參考資料
學習
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
- 關于 Snort 的一切都源于 Snort Web 站點。
- Red Hat Linux 在 利用 Snort 保護您的 Red Hat Linux 系統 方面有一項傑出的特性。或許有幾分過時,但基本概念依然适用。
- 如果您希望利用 Snort 的強大力量,但更傾向于具有專業支援的商業産品,請檢視Sourcefire\'s IDS,該産品建構于 Snort 的基礎之上。
- developerWorks Web 開發專區 包含大量的 Web 2.0 開發工具和資訊。
- developerWorks Ajax 資源中心 包含不斷增加的大量 Ajax 内容以及有用資源,可以讓您立即開始開發 Ajax 應用程式。
獲得産品和技術
- Snort 下載下傳首頁 提供了所有 Snort 二進制檔案和源檔案下載下傳。
- 可從 Apple Developer Connection 下載下傳一個用于 Mac OS X 的 C 編譯器。需要使用賬戶登入,但注冊和下載下傳都是免費的。
- 下載下傳 Perl Compatible Regular Expressions 庫。
- WinPcap 允許 Windows 平台上的 Snort 鍊路層網絡通路。
- Managing Security with Snort and IDS Tools(Kerry Cox 和 Christopher Gerg;O\'Reilly Media, Inc.)提供了更加全面的安全性簡介,還包括大量特定于 Snort 的内容,幫您管理您的站點。
- Snort Cookbook (Angela Orebaugh、Simon Biles 和 Jacob Babbin;O\'Reilly Media, Inc.)是一份出色的 Snort 入門資料,指導您執行具體的任務,從基本的安裝到進階的入侵檢測和網絡優化。
讨論
- developerWorks blog:加入 developerWorks 社群
Snort 使用手冊,第 2 部分: 配置
通過設定 Snort 報告 Web 站點入侵
Snort 是一款免費、開源的網絡入侵防禦系統(Network Intrusion Prevention System,NIPS)和網絡入侵檢測系統(Network Intrusion Detection System,NIDS)工具,可以檢測入侵、防止外部攻擊損害您的 Web 設計和應用程式程式設計。本系列的 第一篇文章 完成了 Snort 安裝并使它可以檢測包、日志通信量,做好了入侵檢測的準備工作。在本文中,将了解這些包中的資料含義,以及如何使用這些資料判斷是否發生攻擊并向系統管理者發出警告。

評論:
Brett McLaughlin ([email protected]), 作家兼編輯, O\'Reilly Media, Inc.
2008 年 7 月 18 日
- 内容
snort使用手冊IBM
在 IBM Bluemix 雲平台上開發并部署您的下一個應用。
現在就開始免費試用
在上一篇文章中,您了解到 Snort 是什麼,以及如何在系統中安裝并運作它。也看到了 Snort 如何執行三種關鍵的基本功能:
- 包嗅探:Snort 可以針對它所在的機器監視進入和出去的包。它還可以監視它所運作的網絡中大量正在傳輸的包。這是 Snort 最基本的功能,以包的形式檢測和觀察網絡通信量是所有其他功能的基礎。
- 包記錄:Snort 不僅可以實時監視包,還可以記錄這些包。日志功能可以使您手動或自動處理這些包,并記錄已發生的事件。不論是否正在清理舊包來檢測入侵,或是 Snort 根據所記錄的内容發出軟體警告,包記錄功能使 Snort 從一個實時工具轉到一個可以以不同形式持久存儲資料的工具。
- 入侵檢測:從很大程度上講,入侵檢測實際上就是結合了包嗅探和記錄功能,并在其上添加一層自動智能層。一個入侵檢測系統(即 IDS)具有一個包含網絡狀态資訊的規則集,可以針對網絡中可疑的狀态進行監視并發出響應。
在本文中,我将越過基本的安裝和配置知識,讨論如何 設定 Snort,以檢測與 Web 相關的入侵。您将了解如何用最新的規則配置 Snort,并在背景監控伺服器的行為。
注意:本文并非從系統管理者的角度考慮 Snort。與 Snort 相關的知識很多,它可以檢測各種入侵,包括對 IRC 服務的攻擊、與 Web 相關的問題,以及試圖通過受保護端口通路機器的惡意代碼。但是,本文實際上專門針對 Web 設計者和開發人員,為保護他們的具體項目和應用程式提出改進建議。有關 Snort 的更多參考資料,請參見 參考資料 中的各種連結。
使用 Snort 分析包
在上一篇文章中,我們簡單了解了 Snort 的三個功能,并檢視了一些包。例如,運作
snort -v
獲得如清單 1 所示的輸出。
清單 1. 使用 Snort 嗅探
[bdm0509:~] sudo snort -v
Password:
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
Verifying Preprocessor Configurations!
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
Decoding Ethernet on interface en0
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.8.0.2 (Build 75)
\'\'\'\' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.
Using PCRE version: 7.6 2008-01-28
Not Using PCAP_FRAMES
03/31-08:55:12.179192 192.168.1.102:64862 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10292 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.179498 192.168.1.102:64863 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10293 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.180278 192.168.1.102:64865 -> 239.255.255.253:427
UDP TTL:1 TOS:0x0 ID:10295 IpLen:20 DgmLen:64
Len: 36
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.247880 192.168.1.102:64866 -> 192.168.1.255:137
UDP TTL:64 TOS:0x0 ID:10296 IpLen:20 DgmLen:78
Len: 50
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.248297 192.168.1.103:137 -> 192.168.1.102:64866
UDP TTL:64 TOS:0x0 ID:8075 IpLen:20 DgmLen:90
Len: 62
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:12.599248 192.168.1.102:55381 -> 192.168.1.101:139
TCP TTL:64 TOS:0x0 ID:10297 IpLen:20 DgmLen:64 DF
******S* Seq: 0x42127B5E Ack: 0x0 Win: 0xFFFF TcpLen: 44
TCP Options (8) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1428368232 0
TCP Options => SackOK EOL
...
LOTS more output here
...
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976018 0.0.0.0:68 -> 255.255.255.255:67
UDP TTL:64 TOS:0x0 ID:48134 IpLen:20 DgmLen:328
Len: 300
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1
03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68
UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576
Len: 548
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:22.977578 ARP who-has 192.168.1.104 tell 192.168.1.104
^C*** Caught Int-Signal
Run time prior to being shutdown was 14.231224 seconds
===============================================================================
Packet Wire Totals:
Received: 78
Analyzed: 78 (100.000%)
Dropped: 0 (0.000%)
Outstanding: 0 (0.000%)
===============================================================================
Breakdown by protocol (includes rebuilt packets):
ETH: 78 (100.000%)
ETHdisc: 0 (0.000%)
VLAN: 0 (0.000%)
IPV6: 0 (0.000%)
IP6 EXT: 0 (0.000%)
IP6opts: 0 (0.000%)
IP6disc: 0 (0.000%)
IP4: 71 (91.026%)
IP4disc: 0 (0.000%)
TCP 6: 0 (0.000%)
UDP 6: 0 (0.000%)
ICMP6: 0 (0.000%)
ICMP-IP: 0 (0.000%)
TCP: 57 (73.077%)
UDP: 14 (17.949%)
ICMP: 0 (0.000%)
TCPdisc: 0 (0.000%)
UDPdisc: 0 (0.000%)
ICMPdis: 0 (0.000%)
FRAG: 0 (0.000%)
FRAG 6: 0 (0.000%)
ARP: 3 (3.846%)
EAPOL: 0 (0.000%)
ETHLOOP: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 4 (5.128%)
DISCARD: 0 (0.000%)
InvChkSum: 0 (0.000%)
Upconvt: 0 (0.000%)
Up fail: 0 (0.000%)
S5 G 1: 0 (0.000%)
S5 G 2: 0 (0.000%)
Total: 78
===============================================================================
Action Stats:
ALERTS: 0
LOGGED: 0
PASSED: 0
===============================================================================
Snort exiting
注意,您需要以根使用者的身份運作或是使用
sudo
,詳細内容請檢視上一篇文章。
當然,這裡的難點是利用這些資訊。可以進一步把這些資訊分解為單個的包,如清單 2 所示(直接使用清單 1 的内容)。
清單 2. 清單 1 輸出的單個包
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1
03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68
UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576
Len: 548
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
這個包表示什麼含義?是否值得關注?
基本上全部關于 IP 位址
包中的最重要資訊來自 IP 位址。清單 2 中的包提供了一些;它們在清單 3 中使用粗體突出顯示。
清單 3. 注意清單 2 所示包中的 IP 位址
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1
03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68
UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576
Len: 548
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
這裡提到了兩個 IP 位址:192.168.1.104 和 192.168.1.1。此外,192.168.1.1 在第二次出現時,後面多了一個端口号。端口号通常出現在 IP 位址之後的冒号後面,例如:192.168.1.1:67。
IP 位址實踐經驗
通常,以 1.1 結尾的 IP 通常一般為路由器或無線網關。在具有多個路由器的位置中,經常會看到從 1.1 到 1.10 等位址,但是低端數字通常表示通向 Internet 或其他網絡的路由器和網關。而諸如 100 或 210 等高端數字表示網絡中的單個裝置。當然,智能管理可以識别這些位址并進行修改,這樣惡意攻擊者就不會輕松地推測出這些位址,但是可以監視某個包,并從其 IP 位址中獲得有關包的發送源和發送目的地的資訊。
在利用這些資訊之前,需要了解您的機器的 IP 位址。可以使用 Windows® 指令
ipconfig
,或者在 Linux®、UNIX®,或 Mac OS X 的終端上,使用
ifconfig
。在清單 3 的示例包中,192.168.1.104 正是運作 Snort 的機器的 IP 位址,而 192.168.1.1 則是該機器的網絡通往外部網絡的路由器的位址。
在這個例子中,這個包來自一個計算機(運作 Snort,IP 位址為 192.168.1.104),并将傳輸到路由器(192.168.1.1)。随後,将獲得一些額外的資訊,諸如長度、ID 和一些奇怪的代碼,例如 TOS、TTL 和 UDP。
是否适合使用 Snort?
現在看來,詳細分析包的過程似乎有些繁瑣。如果您是習慣使用 CSS 樣式和
div
的 Web 設計師,或者是更加關心類的銜接、接口或某個抽象類是否有意義的開發人員,那麼包分析是一個非常枯燥乏味的過程。如果開始就加入一些奇怪的縮寫詞,那麼您很可能再沒有興趣閱讀本文,而是查找一些有關 CSS 文本替換或如何使用 C# 實作 Chain of Responsibility 設計模式等内容的資料。
Snort 最擅長于解決這類複雜和困難的包問題。事實上,Snort 對 Web 開發人員如此有用,是因為 它關注設計模式、布局和函數性任務。使用 Snort,在基本了解的基礎之上(可以閱讀上一篇文章和本節内容),可以讓您的工具完成您不願意完成的工作。本文其餘内容将介紹 Snort 如何處理包分析,以及如何利用社群力量保證系統安全,而不需要重新學習已經淡忘的大學網絡課程。
回頁首
配置 Snort
不需花大量時間研究包,可以對 Snort 進行設定來處理分析,并在發生問題時收到 Snort 的警報;這些功能是通過為 Snort 指定一組規則 實作的。這些規則通常使用文本檔案的形式,告訴 Snort 要執行什麼操作,為它在包中查找關鍵細節提供資訊,并指導 Snort 在找到鍵資訊後如何操作。此外,這些規則可以限制 Snort 偵聽的内容(例如指令 Snort 隻監視單個機器,或監視整個網絡中的通信量),以及記錄查找到的所有内容并生成一個檔案友善日後檢視。
實際上,使用 Snort 規則可以省去手工分析包的工作。
Snort 的預設配置
在編寫規則之前,需要告訴 Snort 作為 IDS 運作。最簡單的方法(包括記錄包)是使用 Snort 的預設配置,這個配置儲存在 Snort 安裝目錄(我的是 /usr/local/snort-2.8.1/etc/snort.conf)中的 etc/snort.conf 檔案。這種方法可以簡單地設定并運作 Snort。清單 4 展示了 Snort 配置檔案的一部分。
清單 4. 預設的 snort.conf 檔案
# stream5: Target Based stateful inspection/stream reassembly for Snort
# ---------------------------------------------------------------------
# Stream5 is a target-based stream engine for Snort. Its functionality
# replaces that of Stream4. Consequently, BOTH Stream4 and Stream5
# cannot be used simultaneously. Comment out the stream4 configurations
# above to use Stream5.
#
# See README.stream5 for details on the configuration options.
#
# Example config (that emulates Stream4 with UDP support compiled in)
preprocessor stream5_global: max_tcp 8192, track_tcp yes, \
track_udp no
preprocessor stream5_tcp: policy first, use_static_footprint_sizes
# preprocessor stream5_udp: ignore_any_rules
# Performance Statistics
# ----------------------
# Documentation for this is provided in the Snort Manual. You should read it.
# It is included in the release distribution as doc/snort_manual.pdf
#
# preprocessor perfmonitor: time 300 file /var/snort/snort.stats pktcnt 10000
# http_inspect: normalize and detect HTTP traffic and protocol anomalies
#
# lots of options available here. See doc/README.http_inspect.
# unicode.map should be wherever your snort.conf lives, or given
# a full path to where snort can find it.
preprocessor http_inspect: global \
iis_unicode_map unicode.map 1252
preprocessor http_inspect_server: server default \
profile all ports { 80 8080 8180 } oversize_dir_length 500
#
# Example unique server configuration
#
#preprocessor http_inspect_server: server 1.1.1.1 \
# ports { 80 3128 8080 } \
# flow_depth 0 \
# ascii no \
# double_decode yes \
# non_rfc_char { 0x00 } \
# chunk_length 500000 \
# non_strict \
# oversize_dir_length 300 \
# no_alerts
# rpc_decode: normalize RPC traffic
# ---------------------------------
# RPC may be sent in alternate encodings besides the usual 4-byte encoding
# that is used by default. This plugin takes the port numbers that RPC
# services are running on as arguments - it is assumed that the given ports
# are actually running this type of service. If not, change the ports or turn
# it off.
# The RPC decode preprocessor uses generator ID 106
#
# arguments: space separated list
# alert_fragments - alert on any rpc fragmented TCP data
# no_alert_multiple_requests - don\'t alert when >1 rpc query is in a packet
# no_alert_large_fragments - don\'t alert when the fragmented
# sizes exceed the current packet size
# no_alert_incomplete - don\'t alert when a single segment
# exceeds the current packet size
preprocessor rpc_decode: 111 32771
# content goes on for a long time...
是以一個單個配置語句如下所示:
preprocessor rpc_decode: 111 32771
Snort 在這裡使用了大量的關鍵字,但是為了配合本文的主題,即提供一種實用的、基本的 Snort 方法,是以不會過多涉及這些内容。但是,需要在這個檔案中注意兩項内容:
- 簡短的 Snort 指令,通常包括
語句(關于查找内容)和用于發出警告的preprocessor
語句(未顯示在清單 4 中)。output
- 預設的 snort.conf 檔案實際上是一個功能完整的、有用的配置檔案。這不是無用資料,它可用于 Snort 安裝。
使用 Snort 檢測入侵
準備好配置檔案後,可以作為一種入侵檢測程式運作 Snort(将在稍後添加規則),清單 5 展示了以 IDS 形式啟動 Snort 的輸出,并在前台運作。
清單 5. 作為 IDS 運作 Snort
bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf
Running in IDS mode
--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file etc/snort.conf
PortVar \'HTTP_PORTS\' defined : [ 80 ]
PortVar \'SHELLCODE_PORTS\' defined : [ 0:79 81:65535 ]
PortVar \'ORACLE_PORTS\' defined : [ 1521 ]
Frag3 global config:
Max frags: 65536
Fragment memory cap: 4194304 bytes
Frag3 engine config:
Target-based policy: FIRST
Fragment timeout: 60 seconds
Fragment min_ttl: 1
Fragment ttl_limit (not used): 5
Fragment Problems: 1
Stream5 global config:
Track TCP sessions: ACTIVE
Max TCP sessions: 8192
Memcap (for reassembly packet storage): 8388608
Track UDP sessions: INACTIVE
Track ICMP sessions: INACTIVE
Stream5 TCP Policy config:
Reassembly Policy: FIRST
Timeout: 30 seconds
Min ttl: 1
Options:
Static Flushpoint Sizes: YES
Reassembly Ports:
21 client (Footprint)
23 client (Footprint)
25 client (Footprint)
42 client (Footprint)
53 client (Footprint)
80 client (Footprint)
110 client (Footprint)
111 client (Footprint)
135 client (Footprint)
136 client (Footprint)
137 client (Footprint)
139 client (Footprint)
143 client (Footprint)
445 client (Footprint)
513 client (Footprint)
514 client (Footprint)
1433 client (Footprint)
1521 client (Footprint)
2401 client (Footprint)
3306 client (Footprint)
HttpInspect Config:
GLOBAL CONFIG
Max Pipeline Requests: 0
Inspection Type: STATELESS
Detect Proxy Usage: NO
IIS Unicode Map Filename: etc/unicode.map
IIS Unicode Map Codepage: 1252
DEFAULT SERVER CONFIG:
Server profile: All
Ports: 80 8080 8180
Flow Depth: 300
Max Chunk Length: 500000
Max Header Field Length: 0
Inspect Pipeline Requests: YES
URI Discovery Strict Mode: NO
Allow Proxy Usage: NO
Disable Alerting: NO
Oversize Dir Length: 500
Only inspect URI: NO
Ascii: YES alert: NO
Double Decoding: YES alert: YES
%U Encoding: YES alert: YES
Bare Byte: YES alert: YES
Base36: OFF
UTF 8: OFF
IIS Unicode: YES alert: YES
Multiple Slash: YES alert: NO
IIS Backslash: YES alert: NO
Directory Traversal: YES alert: NO
Web Root Traversal: YES alert: YES
Apache WhiteSpace: YES alert: NO
IIS Delimiter: YES alert: NO
IIS Unicode Map: GLOBAL IIS UNICODE MAP CONFIG
Non-RFC Compliant Characters: NONE
Whitespace Characters: 0x09 0x0b 0x0c 0x0d
rpc_decode arguments:
Ports to decode RPC on: 111 32771
alert_fragments: INACTIVE
alert_large_fragments: ACTIVE
alert_incomplete: ACTIVE
alert_multiple_requests: ACTIVE
Portscan Detection Config:
Detect Protocols: TCP UDP ICMP IP
Detect Scan Type: portscan portsweep decoy_portscan distributed_portscan
Sensitivity Level: Low
Memcap (in bytes): 10000000
Number of Nodes: 36900
ERROR: Unable to open rules file: ../rules/local.rules or etc/../rules/local.rules
Fatal Error, Quitting..
截至最後一行為止,一切運作順利。Snort 期望發現一些規則檔案,但是沒有找到,是以出現錯誤。
預設的配置檔案包含一些規則檔案
Snort 提供了一些标準規則檔案,具有預定義的名稱和函數。如果再次打開 snort.conf 檔案,并浏覽最底部的内容,将看到如清單 6 所示的一組指令:
清單 6. snort.conf 檔案的底部
####################################################################
# Step #6: Customize your rule set
#
# Up to date snort rules are available at http://www.snort.org
#
# The snort Web site has documentation about how to write your own custom snort
# rules.
#=========================================
# Include all relevant rulesets here
#
# The following rulesets are disabled by default:
#
# web-attacks, backdoor, shellcode, policy, porn, info, icmp-info, virus,
# chat, multimedia, and p2p
#
# These rules are either site policy specific or require tuning in order to not
# generate false positive alerts in most environments.
#
# Please read the specific include file for more information and
# README.alert_order for how rule ordering affects how alerts are triggered.
#=========================================
include $RULE_PATH/local.rules
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-client.rules
include $RULE_PATH/web-php.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/oracle.rules
include $RULE_PATH/mysql.rules
include $RULE_PATH/snmp.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/imap.rules
include $RULE_PATH/pop2.rules
include $RULE_PATH/pop3.rules
include $RULE_PATH/nntp.rules
include $RULE_PATH/other-ids.rules
# include $RULE_PATH/web-attacks.rules
# include $RULE_PATH/backdoor.rules
# include $RULE_PATH/shellcode.rules
# include $RULE_PATH/policy.rules
# include $RULE_PATH/porn.rules
# include $RULE_PATH/info.rules
# include $RULE_PATH/icmp-info.rules
# include $RULE_PATH/virus.rules
# include $RULE_PATH/chat.rules
# include $RULE_PATH/multimedia.rules
# include $RULE_PATH/p2p.rules
# include $RULE_PATH/spyware-put.rules
# include $RULE_PATH/specific-threats.rules
include $RULE_PATH/experimental.rules
# include $PREPROC_RULE_PATH/preprocessor.rules
# include $PREPROC_RULE_PATH/decoder.rules
# Include any thresholding or suppression commands. See threshold.conf in the
# <snort src>/etc directory for details. Commands don\'t necessarily need to be
# contained in this conf, but a separate conf makes it easier to maintain them.
# Note for Windows users: You are advised to make this an absolute path,
# such as: c:\snort\etc\threshold.conf
# Uncomment if needed.
# include threshold.conf
該檔案試圖包含一些規則檔案,這些行中最主要的一行如下所示:
include $RULE_PATH/local.rules
接下來,要運作 Snort 需要一些可以加載和使用的規則。
回頁首
告訴 Snort 如何使用規則
規則在 Snort 術語裡面就是 Snort 指令;具體來講,規則就是如何檢查、分析或報告包。雖然配置是關于 Snort 如何操作的更加一般化的規則集,但在包每次跨過所監視的網絡接口時,規則将告訴 Snort 執行什麼操作。
Snort 中的規則由兩個基本部分組成:
- 告訴 Snort 查找包中的特定内容,例如 Web 請求中的
或 telnet 連接配接中的特定端口。GET
- 告訴 Snort 在找到特定内容時執行何種操作。多數情況下僅是觸發一個警告,允許您對警告進行響應。
是以對于每一個可能的入侵連接配接,Snort 都需要使用一條規則(或涵蓋多個相關入侵的規則)。這種方法的缺點十分明顯:需要處理的入侵太多了。即使是專職網絡管理者或系統管理者,也無法應付所有不同的入侵,而且新的入侵每天都會出現。更糟糕的是,如果您是一個小型組織的 Web 開發人員,并且兼管 Snort,或者試圖勸說已經滿負荷工作的管理者再負責 Snort,這更不可能。所幸的是,Snort 解決了這些問題。
Snort 要求使用者必須進行免費注冊
大多數 Web 友好的開源項目不會要求您進行注冊。但是必須注冊 Snort。隻有注冊後才能免費下載下傳 Snort 提供的預設規則,這也是本文下一小節的主題。通路 Snort 站點(參見 參考資料),單擊 Registration 連結進行注冊。
獲得 Snort 的預設規則
由于 Snort 是一種技術性的、特定于網絡的産品,人們在不斷改進 Snort 的同時更新目前流行的入侵類型 —— 以及如何檢測并響應這些入侵。每當釋出 Snort 的新版本時,将附帶一組新的 “預設” 規則集。這個預設規則集基本上涵蓋了需要進行保護的所有内容,并且非常簡單。
導航到 Snort Web 站點(通路 參考資料 小節的連結),單擊左側導航的 Rules 連結。在規則頁面的頂部有一個灰色的導航欄,單擊上面的 VRT Rules。向下滾動已注冊使用者部分,可以找到一組比對您所使用的 Snort 版本的規則集;圖 1 顯示了這部分 Snort 站點。
注意:確定在下載下傳規則之前已經登入。
圖 1. 從 Snort Web 站點下載下傳預設規則
這将下載下傳一個 ZIP 檔案,名為 snortrules-snapshot-2.8.tar.gz。展開這個檔案,将得到一個名為 snortrules-snapshot-2.8_s 的檔案夾。這個檔案夾的内容如圖 2 所示。
圖 2. 從 Snort Web 站點獲得規則
“安裝” 預設規則集
預設情況下,Snort 至少會在 Snort 安裝的 rules 目錄中查找一個名為 local.rules 的規則集。是以,利用剛才下載下傳的規則,隻需将展開的規則檔案夾複制或移動到 Snort 安裝目錄:
[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/rules .
還應該複制下載下傳的規則中的 etc/ 目錄。這将更新您的預設配置,進而包括任何附加的規則檔案,這些規則檔案可能需要用于這個版本的規則:
[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/etc .
完成以上所有操作後,您的 Snort 目錄結構應當如清單 7 所示。
清單 7. 含有一個規則目錄的 Snort 安裝目錄
[bdm0509:/usr/local/snort-2.8.1] ls
COPYING autom4te.cache configure.in ltmain.sh snort.8
ChangeLog config.guess contrib m4 src
LICENSE config.h depcomp missing stamp-h1
Makefile config.h.in doc mkinstalldirs templates
Makefile.am config.log etc preproc_rules verstuff.pl
Makefile.in config.status install-sh rpm ylwrap
RELEASE.NOTES config.sub libtool rules
aclocal.m4 configure logs schemas
嵌套的目錄中也包含了大量規則。清單 8 展示了從 Snort 站點獲得的所有規則檔案。
清單 8. Snort 的 rules/ 目錄中的規則
[bdm0509:/usr/local/snort-2.8.1] ls rules
Makefile.am info.rules smtp.rules
VRT-License.txt local.rules snmp.rules
attack-responses.rules misc.rules specific-threats.rules
backdoor.rules multimedia.rules spyware-put.rules
bad-traffic.rules mysql.rules sql.rules
cgi-bin.list netbios.rules telnet.rules
chat.rules nntp.rules tftp.rules
content-replace.rules open-test.conf virus.rules
ddos.rules oracle.rules voip.rules
deleted.rules other-ids.rules web-attacks.rules
dns.rules p2p.rules web-cgi.rules
dos.rules policy.rules web-client.rules
experimental.rules pop2.rules web-coldfusion.rules
exploit.rules pop3.rules web-frontpage.rules
finger.rules porn.rules web-iis.rules
ftp.rules rpc.rules web-misc.rules
icmp-info.rules rservices.rules web-php.rules
icmp.rules scan.rules x11.rules
imap.rules shellcode.rules
在 Mac OS X 上的問題
如果在這個階段嘗試在大多數平台上運作 Snort,則應該沒有問題。然而,值得一提的是與 Mac OS X 有關的一些問題,特别是在将 Snort 引入 UNIX 或 Linux 生産伺服器之前使用 Mac 作為測試機器。需要執行一些步驟才能在 Mac OS X 上正确地運作 Snort。
首先,需要删除目前的 Snort 安裝并重新建構。但不需要手工删除檔案。運作以下指令即可:
make clean
上面的指令将删除所有檔案,為重新建構适合 Mac OS X 的安裝做好準備。然後,發出以下指令:
[bdm0509:/usr/local/snort-2.8.1] glibtoolize --force
Using `AC_PROG_RANLIB\' is rendered obsolete by `AC_PROG_LIBTOOL\'
[bdm0509:/usr/local/snort-2.8.1] sudo aclocal -I m4
Password:
[bdm0509:/usr/local/snort-2.8.1] sudo autoheader
[bdm0509:/usr/local/snort-2.8.1] sudo automake --add-missing --copy
[bdm0509:/usr/local/snort-2.8.1] sudo autoconf
[bdm0509:/usr/local/snort-2.8.1] export LD_TWOLEVEL_NAMESPACE=1
現在,可以重新運作
make
指令,然後運作
make install
指令(上一篇文章已較長的描述)。您将獲得大量輸出,現在基本上可以開始運作 Snort 了。
還需要進行一處修改,即 etc/snort.conf 配置檔案。在 snort.conf 檔案中查找以下行(最簡單的方法是搜尋 “dynamicengine”)。
#
# Load a dynamic engine from the install path
# (same as command line option --dynamic-engine-lib)
#
dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so
通過在行首插入
#
符号注釋掉 dynamicengine 行,然後添加以下粗體顯示的行:
#
# Load a dynamic engine from the install path
# (same as command line option --dynamic-engine-lib)
#
#dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so
dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.dylib
還需要執行幾個類似的修改。搜尋 “Step #2”,将看到清單 9 所示的内容:
清單 9. 在代碼中搜尋 Step #2
####################################################
# Step #2: Configure dynamic loaded libraries
## If snort was configured to use dynamically loaded libraries,
# those libraries can be loaded here.#
# Each of the following configuration options can be done via# the command line as well.
## Load all dynamic preprocessors from the install path
# (same as command line option --dynamic-preprocessor-lib-dir)
#
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so
# Comment out above and uncomment this if running OSX
#
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib
注意:為了友善輸出和在 Web 上檢視,一些行被人為地打斷。這些指令在 snort.conf 中都在同一行上,您應該在自己的配置檔案中保持這種格式。
您将需要如實地根據說明操作。注釋掉前面的幾行,然後去掉後面幾行的注釋,如清單 10 所示。
清單 10. 顯示需要注釋和去掉注釋的行
####################################################
# Step #2: Configure dynamic loaded libraries
## If snort was configured to use dynamically loaded libraries,
# those libraries can be loaded here.#
# Each of the following configuration options can be done via# the command line as well.
## Load all dynamic preprocessors from the install path
# (same as command line option --dynamic-preprocessor-lib-dir)
#
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so
#dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so
# Comment out above and uncomment this if running OSX
#
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib
dynamicpreprocessor
file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib
現在,可以運作 Snort 了,看上去似乎需要很多工作,但是使用與網絡或系統相關的工具可以輕松地完成此類配置。最棒的是這種工作隻需做一次(或少數幾次)。
但是,在繼續之前需要注意,由于大多數規則包含一個新版本的 snort.conf 檔案,您需要在每次複制新的檔案或 etc/ 目錄時執行這些步驟的最後一個步驟。
這些内容的細節不是本文探讨的範圍,并且涉及到真正的網絡和系統管理者問題,作為一名 Web 開發人員或設計師不需要花時間細究這些問題。現在,隻需執行這些指令,如果有興趣進一步了解,可通路 Snort 線上論壇(參見 參考資料)。
以 IDS 的形式運作 Snort
具備了預設的規則集,并且對 Mac OS X(如果使用該平台的話)進行了調整,就可以開始啟動 Snort 了。清單 11 顯示了需要使用的指令,以及該指令的一部分輸出。
清單 11. 運作 Snort(沒錯錯誤)
[bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf
Running in IDS mode
--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file etc/snort.conf
PortVar \'HTTP_PORTS\' defined : [ 80 ]
PortVar \'SHELLCODE_PORTS\' defined : [ 0:79 81:65535 ]
PortVar \'ORACLE_PORTS\' defined : [ 1521 ]
Frag3 global config:
Max frags: 65536
Fragment memory cap: 4194304 bytes
Frag3 engine config:
Target-based policy: FIRST
Fragment timeout: 60 seconds
Fragment min_ttl: 1
Fragment ttl_limit (not used): 5
Fragment Problems: 1
Stream5 global config:
Track TCP sessions: ACTIVE
Max TCP sessions: 8192
Memcap (for reassembly packet storage): 8388608
Track UDP sessions: INACTIVE
Track ICMP sessions: INACTIVE
Stream5 TCP Policy config:
Reassembly Policy: FIRST
Timeout: 30 seconds
Min ttl: 1
Options:
Static Flushpoint Sizes: YES
Reassembly Ports:
21 client (Footprint)
23 client (Footprint)
25 client (Footprint)
42 client (Footprint)
53 client (Footprint)
80 client (Footprint)
...
LOTS more output like this for a while...
...
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
8771 Snort rules read
8771 detection rules
0 decoder rules
0 preprocessor rules
8771 Option Chains linked into 501 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
+-------------------[Rule Port Counts]---------------------------------------
| tcp udp icmp ip
| src 1011 38 0 0
| dst 6684 429 0 0
| any 494 117 20 7
| nc 15 4 3 4
| s+d 16 16 0 0
+----------------------------------------------------------------------------
+-----------------------[thresholding-config]----------------------------------
| memory-cap : 1048576 bytes
+-----------------------[thresholding-global]----------------------------------
| none
+-----------------------[thresholding-local]-----------------------------------
| gen-id=1 sig-id=12224 type=Limit tracking=src count=1 seconds=600
| gen-id=1 sig-id=12228 type=Limit tracking=src count=1 seconds=30
| gen-id=1 sig-id=7055 type=Limit tracking=src count=1 seconds=300
| gen-id=1 sig-id=7069 type=Limit tracking=src count=1 seconds=300
| gen-id=1 sig-id=7068 type=Limit tracking=src count=1 seconds=300
| gen-id=1 sig-id=7074 type=Limit tracking=src count=1 seconds=600
| gen-id=1 sig-id=12121 type=Limit tracking=src count=1 seconds=300
| gen-id=1 sig-id=12122 type=Limit tracking=src count=1 seconds=18000
...
More packet information rolling by...
...
+-----------------------[suppression]------------------------------------------
| none
-------------------------------------------------------------------------------
Rule application order: activation->dynamic->pass->drop->alert->log
Log directory = logs/
Verifying Preprocessor Configurations!
Warning: \'ignore_any_rules\' option for Stream5 UDP disabled because of UDP rule with
flow or flowbits option
Warning: flowbits key \'access.download\' is set but not ever checked.
Warning: flowbits key \'dce.bind.mqqm\' is checked but not ever set.
Warning: flowbits key \'sylk.download\' is set but not ever checked.
Warning: flowbits key \'AdvancedSpy_detection\' is set but not ever checked.
Warning: flowbits key \'works.download\' is set but not ever checked.
Warning: flowbits key \'mspub_header\' is set but not ever checked.
358 out of 512 flowbits in use.
***
*** interface device lookup found: en0
***
Initializing Network Interface en0
Decoding Ethernet on interface en0
[ Port Based Pattern Matching Memory ]
+-[AC-BNFA Search Info Summary]------------------------------
| Instances : 835
| Patterns : 210306
| Pattern Chars : 1938187
| Num States : 1108715
| Num Match States : 177685
| Memory : 26.49Mbytes
| Patterns : 5.86M
| Match Lists : 7.21M
| Transitions : 13.36M
+-------------------------------------------------
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.8.1 (Build 28)
\'\'\'\' By Martin Roesch & The Snort Team:
http://www.snort.org/team.html
(C) Copyright 1998-2008 Sourcefire Inc., et al.
Using PCRE version: 6.5 01-Feb-2006
Rules Engine: SF_SNORT_DETECTION_ENGINE Version 1.8
<Build 13>
Preprocessor Object: SF_SSH Version 1.1 <Build 1>
Preprocessor Object: SF_SMTP Version 1.1 <Build 7>
Preprocessor Object: SF_FTPTELNET Version 1.1 <Build 10>
Preprocessor Object: SF_DNS Version 1.1 <Build 2>
Preprocessor Object: SF_DCERPC Version 1.1 <Build 4>
Not Using PCAP_FRAMES
System will wait here until you exit Snort...
^C*** Caught Int-Signal
Run time prior to being shutdown was 356.123989 seconds
===============================================================================
Packet Wire Totals:
Received: 893
Analyzed: 893 (100.000%)
Dropped: 0 (0.000%)
Outstanding: 0 (0.000%)
===============================================================================
Breakdown by protocol (includes rebuilt packets):
ETH: 893 (100.000%)
ETHdisc: 0 (0.000%)
VLAN: 0 (0.000%)
IPV6: 4 (0.448%)
IP6 EXT: 0 (0.000%)
IP6opts: 0 (0.000%)
IP6disc: 0 (0.000%)
IP4: 884 (98.992%)
IP4disc: 0 (0.000%)
TCP 6: 0 (0.000%)
UDP 6: 0 (0.000%)
ICMP6: 0 (0.000%)
ICMP-IP: 0 (0.000%)
TCP: 807 (90.370%)
UDP: 74 (8.287%)
ICMP: 3 (0.336%)
TCPdisc: 0 (0.000%)
UDPdisc: 0 (0.000%)
ICMPdis: 0 (0.000%)
FRAG: 0 (0.000%)
FRAG 6: 0 (0.000%)
ARP: 5 (0.560%)
EAPOL: 0 (0.000%)
ETHLOOP: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 0 (0.000%)
DISCARD: 0 (0.000%)
InvChkSum: 458 (51.288%)
S5 G 1: 0 (0.000%)
S5 G 2: 0 (0.000%)
Total: 893
===============================================================================
Action Stats:
ALERTS: 33
LOGGED: 33
PASSED: 0
===============================================================================
Frag3 statistics:
Total Fragments: 0
Frags Reassembled: 0
Discards: 0
Memory Faults: 0
Timeouts: 0
Overlaps: 0
Anomalies: 0
Alerts: 0
FragTrackers Added: 0
FragTrackers Dumped: 0
FragTrackers Auto Freed: 0
Frag Nodes Inserted: 0
Frag Nodes Deleted: 0
===============================================================================
Stream5 statistics:
Total sessions: 62
TCP sessions: 18
UDP sessions: 44
ICMP sessions: 0
TCP Prunes: 0
UDP Prunes: 0
ICMP Prunes: 0
TCP StreamTrackers Created: 20
TCP StreamTrackers Deleted: 20
TCP Timeouts: 4
TCP Overlaps: 0
TCP Segments Queued: 0
TCP Segments Released: 0
TCP Rebuilt Packets: 0
TCP Segments Used: 0
TCP Discards: 120
UDP Sessions Created: 46
UDP Sessions Deleted: 46
UDP Timeouts: 2
UDP Discards: 0
Events: 0
===============================================================================
HTTP Inspect - encodings (Note: stream-reassembled packets included):
POST methods: 0
GET methods: 0
Post parameters extracted: 0
Unicode: 0
Double unicode: 0
Non-ASCII representable: 0
Base 36: 0
Directory traversals: 0
Extra slashes ("//"): 0
Self-referencing paths ("./"): 0
Total packets processed: 238
===============================================================================
Snort exiting
這産生了大量輸出,并且指出了為什麼在指令行運作 Snort 是一種臨時的低效的方法。最好是在一個長期的持久的基礎上運作 Snort(作為系統或背景程序運作)。
但是,在進一步分析規則之前,如清單 11 所示,在
sudo snort -de -l logs/ -c etc/snort.conf
指令中,應該将運作 Snort 的指令的各個部分分解。下面解釋了各個部分的作用:
-
:允許您使用管理特權運作 Snort。上一篇文章對此已做讨論,但簡而言之,Snort 需要比普通使用者更多的權限。sudo
-
:顯然,這用來運作 Snort。snort
-
:“d” 選項使 Snort 偵聽并顯示應用程式層的資料,而 “e” 顯示連結層包報頭。這個選項實際上提供了有關 Snort 包嗅探的最詳盡的記錄(但都是必要的)。-de
-
:告訴 Snort 記錄包和生成的警告,并将所有内容放入到 logs/ 目錄。-l logs/
-
:表示使用 etc/snort.conf 作為配置檔案來運作 Snort。-c etc/snort.conf
回頁首
三種基本的規則
在使用目前的規則集運作 Snort 後,可以進一步編寫您自己的規則。這種方法可以添加安全性和針對特定問題的檢查,并意味着基于 Web 的攻擊和與 HTTP 有關的問題将是關注的重點。但是,您首先需要了解一些有關規則建構的概念和理論。
下面是一些通用的規則類型。通過檢視每一種類型,您将大緻了解使用 Snort 規則可以實作哪些操作。
- 包基于它們所指向的端口的規則。這些規則主要側重于接收包的端口。可以很容易地判斷應用程式應該打開哪些端口,是以這種方法可以監視異常的或已關閉端口中潛在的非法通信。在這裡,最常出現攻擊源的是 IRC(Internet Relay Chat),下面的這條規則可以防止非法利用通用的 IRC 端口:
alert tcp $EXTERNAL_NET any -> $HOME_NET 6666:7000 (msg:"EXPLOIT CHAT IRC topic overflow"; flow:to_client,established; content:"|EB|K[S2|E4 83 C3 0B|K|88 23 B8|Pw"; reference:bugtraq,573; reference:cve,1999-0672; classtype:attempted-user; sid:307; rev:9;)
- 包基于包協定的規則。這些規則側重于使用的協定,比如 HTTP 或 IP Mobility。例如,下面這條規則可以檢測到潛在的惡意 SMTP SSL 請求:
alert tcp $SMTP_SERVERS 465 -> $EXTERNAL_NET any (msg:"SMTP SSLv2 Server_Hello request"; flow:from_server,established; flowbits:isset,sslv2.client_hello.request; content:"|04|"; depth:1; offset:2; content:"|00 02|"; depth:2; offset:5; flowbits:set,sslv2.server_hello.request; flowbits:noalert; metadata:policy balanced-ips drop, policy connectivity-ips drop, policy security-ips drop, service smtp; classtype:protocol-command-decode; sid:3497; rev:4;)
- 包基于相關的應用程式的規則。很多應用程式本身沒有問題,但是存在潛在的安全漏洞,比如這種應用程式所使用的某個端口或協定存在漏洞。下面的規則可以防止一種頑固的通路漏洞,即允許不當的下載下傳請求:
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"WEB-CLIENT Microsoft Access file download request"; flow:to_server, established; content:"GET"; nocase; uricontent:".mdb"; nocase; flowbits:set,access.download; flowbits:noalert; metadata:service http; reference:url,support.microsoft.com/kb/925330; classtype:misc-activity; sid:13627; rev:1;)
對于包來講,不需要了解這些規則中的每一個選項;事實上,要做的是檢視
nocase
的内容,而不是如何了解它的含義,或者弄明白規則建立者如何知道 IRC 通信流量通常經過 6666 與 7000 之間的端口。雖然提到過很多次,但是這裡還要再重複一遍:如果您是一名設計人員,那麼就關注設計方面的内容,如果是一名程式設計人員,那麼就關注程式設計。以您的主要職能為重點,然後了解相關的 Snort 知識并使用它。随後則由網絡或系統管理者來研究每個細節選項。
回頁首
一些常用的規則
盡管不需要了解規則的所有細節,但是有些規則是應該熟悉的。這些規則側重于 Web 或與 Web 相關的問題,并且不一定包含在從 Snort 獲得的預設規則集中。
避免成為垃圾郵件中轉站
首先,應當始終防止您的機器(為數百萬個使用者提供 Web 内容的機器)成為一個郵件中轉站。大多數垃圾郵件發送者是這樣工作的:他們通過另一個不受保護的機器發送郵件并隐藏自己的身份。實施這種保護實際上出于兩種重要的原因:
- 很明顯,垃圾郵件不是什麼好東西,沒有人希望自己的伺服器成為垃圾郵件發送者的資源。
- 您的伺服器的 IP 會被阻塞。這個問題對于 Web 開發人員來說更加嚴重。如果其他網絡及其管理者意識到您的伺服器是發送垃圾郵件的源頭,那麼很可能阻止您的伺服器的 IP 位址通路他們的網絡。在某些情況下,這隻會影響郵件(來自您的伺服器的郵件被阻塞或列入黑名單)。然而,有些情況下,來自或流向您的伺服器的所有通信都将被阻塞。這意味着當有人嘗試從這個網絡通路您的站點時,他們也将受到阻塞,這也将縮減您的使用者群。
清單 12 展示了一個示例規則,可以将它添加到 Snort 設定中處理郵件轉發。
清單 12. 使用規則防止郵件轉發
alert tcp $SMTP_SERVERS 25 -> $EXTERNAL_NET any
(msg:"Possible mail relay usage"; content:"Relaying denied";
flags:A+; classtype:trojan-activity; sid:1000001; rev:1;)
詳細分析 403 錯誤
有時您希望 Snort 顯示資訊警告的内容。這些警告提供有用的資料,但是需要采用人工進一步分析。一個很好的例子就是 403 禁止消息(在請求受保護資源時 Web 伺服器生成禁止消息)。Snort 可以檢測所有這些 “403 - forbidden” 錯誤,然後發出警告。您将得到如下内容:
HTTP/1.0 403 Access denied to 72.187.80.82/../../windows/system/cmd.exe
顯然,這不僅僅是一個錯誤的 URL 或壞連結……而是試圖惡意利用一個指令行可執行檔案。當然,可能還會得到類似如下的警告:
HTTP/1.0 403 Access denied to 203.42.142.32/images/sg_talking.jpg
乍看上去好像一切正常;似乎隻是一個關于圖像的權限問題。是以首先确定是否需要将一個 IP 或網絡添加到黑名單,其次,需要檢查您的應用程式。總之,您需要有關 403 的資訊,以便作出決定。清單 13 顯示了報告這些資訊的規則。
清單 13. 報告 403 錯誤的規則
alert tcp $HTTP_SERVERS $HTTP_PORTS -> $EXTERNAL_NET any
(msg:"ATTACK-RESPONSES 403 Forbidden"; flow:from_server,established;
content:"HTTP/1.1 403"; depth:12; classtype:attempted-recon; sid:1201; rev:7;)
實際上這條規則現在包含在了較新的 Snort 版本中,但是如果您已經安裝了 Snort,那麼確定包含這條規則。如果管理者用電子郵件每月向您發送規則生成的警告,您将得到一些益處。這可以使您了解自己的應用程式設計中存在的潛在安全問題。
避免成為 Snort 權威
最後一條忠告,特别是針對小型組織中的人員:小心不要成為 Snort 權威。學習 Snort 将投入大量的時間,這樣就無法将精力集中在您的專長上:設計站點和建構 Web 應用程式等。當然,如果希望 進一步了解網絡,那麼就盡情地研究 Snort 吧。但是最好向目前的管理者推薦類似本文的文章,并鼓勵他們完成這些工作,而不是成為他們學習 Snort 知識的管道。
從某種角度而言,對安全性有了一定的了解之後,就應該就此打住。學習一些關于 Snort 或其他 IDS 知識是容易的,并且容易是以變得多疑。攻擊 Web 應用程式有很多方法,您不可能阻止所有攻擊方式。與其熟悉并精通 Snort,還不如與管理者建立良好的關系。告訴他們您的安全需求和顧慮,然後由他們解決問題。從長遠來看,與親自接攬本應由管理者負責的安全性維護相比,這将受益匪淺。
回頁首
結束語
好像 Snort 應該是由系統和網絡管理者來使用的工具。作為一名 Web 設計師或應用程式程式設計人員,和管理者一起讨論他們如何安裝 Snort 時,您可能會感到茫然。是以,如果您将這篇文章(或包含一些 Snort 規則的文本檔案)交給管理者時,可能會遭到拒絕,您要為此做好心理準備。
盡管如此,您的職責 是将所有工作整合到設計良好的 Web 站點,或一個經過調優的 Web 應用程式。是以,如果将保護您的工作成果的職責完全傳遞給其他人,那麼這樣做不僅愚蠢而且是不負責任的。通過一些準備工作、一些前瞻性考慮以及與您的管理者進行深入的交流,您将可以獲得一些提示、技巧和本文詳述的規則,并應用到企業的 Snort 設定中。如果您在一個更小的組織中工作,可能需要親自負責 Snort 的工作。這也沒有關系;它允許您使用正确的方式保護您的應用程式,并且最重要的是,確定您 Web 站點可以一直安全運作,使您可以在晚上關掉手機、傳呼機等睡個安穩的覺。
最重要的是,Snort 可以讓您的 Web 應用程式在更廣闊的環境中運作。 如果選擇将站點和應用程式放在 Internet 中,那麼将在一個非常公開的環境中運作;是以不能确定所有内容運作正常。然而,通過與管理者群組織中的其他成員進行交流,對 Snort 有了充分的了解,那麼就可以在開發并部署應用程式之後實作長期運作。
參考資料
學習
- 您可以參閱本文在 developerWorks 全球網站上的 英文原文。
- 本系列的第 1 部分 Snort 使用手冊,第 1 部分:安裝和配置(developerWorks,2007 年 6 月),介紹 Snort 安裝細節并幫助您檢測 Web 站點入侵。
- Snort Web 站點 提供了有關 Snort 的所有内容。
- Red Hat Linux 提供了一個出色的特性,可以 使用 Snort 保護您的 Red Hat Linux 系統。雖然有一點過時,但是基本概念仍然适用。
- 如果希望擁有 Snort 的強大功能,但是需要提供專業支援的商業産品,請檢視建構在 Snort 之上的 Sourcefire 的 IDS。
- 通路 Snort 線上論壇,線上解答有關 Snort 的疑問。
獲得産品和技術
- The Snort 下載下傳首頁 提供了所有 Snort 二進制檔案和源檔案下載下傳。
- 您可以從 Apple Developer Connection 下載下傳一個面向 Mac OS X 的 C 編譯器。可能需要一個帳戶,但是可以免費注冊和下載下傳。
- 下載下傳 Perl Compatible Regular Expressions 庫。
- WinPcap 允許在 Windows 平台上實作 Snort 連結層網絡通路。
- Managing Security with Snort and IDS Tools(Kerry Cox 和 Christopher Gerg,O\'Reilly Media,Inc.)提供了有關安全性的更全面的介紹,并為站點管理提供了大量與 Snort 相關的内容。
- Snort Cookbook(Angela Orebaugh、Simon Biles 和 Jacob Babbin,O\'Reilly Media, Inc.)是一份出色的參考資料,介紹了 Snort 知識和一些特殊任務,涵蓋了基本安裝、進階入侵檢測和網絡優化等