snort使用手冊IBM

 

Snort 使用手冊,第 1 部分: 安裝與配置

保護和分析 Web 站點及其流量 php

Web 站點是 Internet 技術中最脆弱也最易受攻擊的部分。嘗試接觸 Snort,它是一款免費、開源的網絡入侵防護系統(Network Intrusion Prevention System,NIPS)和網絡入侵檢測系統(Network Intrusion Detection System,NIDS)工具,用於管理和防護黑客入侵您的 Web 站點、應用程序和支持 Internet 的程序。瞭解 Snort 可以如何幫助保護您的站點,分析您的網絡的真實狀況。學習本文以後,您將懂得利用 Snort 提供的某些高級入侵檢測,並根據 Snort 提供的信息來優化您的站點和網絡。 html

0 評論: mysql

Brett McLaughlin, 做家兼編輯, O'Reilly Media Inc. linux

2007 年 6 月 24 日 ios

  • +內容

在 IBM Bluemix 雲平臺上開發並部署您的下一個應用。 程序員

如今就開始免費試用 web

安全性是重中之重

假設您已經付出了幾個月乃至幾年的時間來學習最熱門的 Web 技術。您閱讀了 developerWorks 的文章,購買了相關圖書,在您的 Mac OS X 終端和 Windows® shell 上進行了試驗。您已經設法構建了一個很是出色的約有 100 個頁面的 Web 應用程序 ——— 有一部分是靜態 HTML,還有一部分由 PHP 腳本生成。您已經開始添加某些 Ajax 技術和特效,使您的站點更具交互性,更具響應能力。您正處於 Web 編程世界的巔峯。 ajax

然而某一天早上醒來以後,您忽然發現站點上全是某個與您毫無相關的站點的全頁橫幅廣告。此外,您的購物車也慢得跟蝸牛同樣,由於數千個無用數據包正在衝擊您的 Web 站點,這也使客戶煩惱和憤怒。 sql

儘管聽起來頗有戲劇性,但大多數認真的 Web 開發人都知道有些人已經遇到過相似的場景,或者本身親身經歷過這樣的場景。不管您的站點或應用程序有多出色,只要未獲得周全的保護,即使是至關成功的,也會成爲攻擊的目標。不管是十二歲的頑童,仍是做爲商業間諜的專業黑客,Web 站點都是很是脆弱的,比其餘類型的應用程序更容易受到攻擊。只要每月支付 20 美圓(或者掌握一點接線技巧),任何人均可以隨意訪問 Internet。您的任務是保護站點,而不只僅是開發站點。 shell

developerWorks Ajax 資源中心
請訪問 Ajax 資源中心,這是有關開發 Ajax 應用程序所需的免費工具、代碼和信息的一站式中心。由 Ajax 專家 Jack Herrington 主持的 活躍 Ajax 社區論壇 也許能夠幫助您解答疑問。

安全性不是他人的責任

如今,您可能在受挫地搖着頭,想着:「在辦公大廳另外一端那我的」 負責處理安全性。您可能認爲,處理安全性是那我的 的責任。儘管從理論上來講,這是正確的。但從實踐角度來看,則並不是如此。若是您未執行基本的入侵檢測(以及防護)就將站點託付給他人,那麼站點出現問題的話,就可能形成很大損失。

並不是全部開發人員都是安全專家,但全部開發人員都應該 瞭解足夠多的知識,執行某些基本的網絡和流量分析,並在其應用程序內構建基本的安全性。在最糟糕的狀況下,開發人員也應該把所須要的安全性告訴安全技術人員,從而確保其站點受到了保護。毫無疑問,因爲您是 開發人員,安全性也就是您的 工做的一部分。

基本安全性並不困難

掌握 OSI 網絡模型、瞭解 TCP/IP 的全部方面、天天鑽研兩次信息包,這些任務都困可貴使人沮喪,但掌握入侵檢測和防護(稍後我將更詳細地定義這些術語)的基礎知識並不困難。經過這篇文章以及不久以後即將推出的第二部分,您將成爲一名合格的安全性管理者,可以運用安全性的語言,可以發現應用程序中正在發生什麼,而無需排隊等候 IS 或 IT 處理。

所以,請關閉您喜好的 IDE(至少將其最小化),啓動終端或 shell,花幾個小時鑽研安全性。您不會後悔的,這將使您的應用程序和爲這些應用程序付錢的客戶更加順利。

回頁首

Snort:一種入侵檢測工具

對於大多數系統和網絡管理員來講,Snort 是一種常見的、熟悉的工具。遺憾的是,Web 程序員並不這樣認爲。若是提到 Snort,他們就將它與tracerouteipconfig 等技術混同起來,認爲那不是 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'

若是在運行 configuremake 的解壓縮目錄中未看到不少變化,也沒必要擔憂。這裏的大多數工做都是在系統用於二進制文件、庫和可執行文件的目錄中完成的。

回頁首

在 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 和 ODBC 數據源。

此屏幕上的選項均應用於登陸:Snort 在嗅探包時能夠登陸數據庫。(若是您對此感到迷惑,在下文中將獲得解釋。)若是您不但願登陸到數據庫,而是但願僅登陸到文件,或者但願登陸到 MySQL 數據庫以及 Microsoft Access 等 ODBC 可訪問的數據庫,則應選擇第一個選項。不然選擇用於 SQL Server 或 Oracle 的選項。

選擇要安裝的組件

接下來是選擇要包含在安裝之中的組件(參見圖 2)。

圖 2. 指出您但願安裝哪些 Snort 組件
確保四類 Snort 安裝組件均已選中

這裏有四個選項:Snort 自己、動態模塊、文檔和模式。沒有理由不所有安裝,徹底安裝只須要大約 24 MB 的空間,所以應選中全部組件繼續操做。

選擇安裝目錄

默認狀況下,Snort 將安裝在 C:\Snort 中,如圖 3 所示。

圖 3. 選擇 Snort 安裝目錄
若是沒有信心正確更改此選項,請接受默認安裝目錄。

這個默認目錄是理想的首選目錄。由於 Snort 並無過多的 GUI 組件,它實際上不屬於典型的 Windows 應用程序,安裝目錄也不在 C:\Program Files 之下。除非您可以爲 Snort 這樣的程序選擇標準安裝目錄,不然應使用默認設置。

安裝和關閉

奇怪的是,Snort 並未提供很是有用的 「安裝完成」 屏幕。與之不一樣,您將看到一個已經完成的狀態條和一個 Close 按鈕(如圖 4 所示)。

圖 4. 安裝在此時已經完成
完成的狀態條使您瞭解 Snort 已經安裝。

單擊 Close 按鈕,您就會看到彈出窗口,代表 Snort(幾乎)已經爲運行作好了準備(如圖 5 所示)。

圖 5. Snort 指出一些安裝後的任務
您仍然須要安裝 WinPcap 並更新一些路徑
安裝 WinPcap

Snort 明確地告訴您:在 Snort 可以使用以前,還有一些安裝工做須要完成。第一項就是 WinPcap。WinPcap 是 Windows Packet Capture Library 的簡寫,它提供了某種類型的網絡訪問,而 Snort 的 IDS 和包嗅探功能須要這些訪問。請訪問 WinPcap 的 Web 站點(參見 參考資料),單擊 Get WinPcap 連接。

選擇最新的穩定版本下載,在本文撰寫之時,最新版本是 4.0.2。下載包括一個 Windows 安裝程序,可雙擊啓動它(如圖 6 所示)。

圖 6. WinPcap 的安裝很簡單
WinPcap 是 Snort 的包嗅探功能所必需的。

安裝很是簡單,只要連續單擊 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 的可執行文件中指向它
建立一個 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..

最後出現了錯誤,但在這個過程當中完成了一些重要的事情:

  1. 它確認了 Snort 二進制文件已正確安裝到了您的路徑中。這也就是說,您能夠從計算機的任何目錄運行它。
  2. 它爲您提供了關於 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

    這使您能夠垂手可得地看到正在運行的 Snort 和 PCRE 的版本。

  3. 它爲您提供了可向 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 做爲包嗅探器運行時,您會得到三方面的信息:

  1. 關於 Snort 將信息記錄到何處及其所檢查的網絡接口的信息。
  2. Snort 所嗅探的包,發送到指定網絡接口,或從指定網絡接口發出。
  3. 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 入門資料,指導您執行具體的任務,從基本的安裝到高級的入侵檢測和網絡優化。
討論

 

Snort 使用手冊,第 2 部分: 配置

經過設置 Snort 報告 Web 站點入侵

Snort 是一款免費、開源的網絡入侵防護系統(Network Intrusion Prevention System,NIPS)和網絡入侵檢測系統(Network Intrusion Detection System,NIDS)工具,能夠檢測入侵、防止外部攻擊損害您的 Web 設計和應用程序編程。本系列的 第一篇文章 完成了 Snort 安裝並使它能夠檢測包、日誌通訊量,作好了入侵檢測的準備工做。在本文中,將瞭解這些包中的數據含義,以及如何使用這些數據判斷是否發生攻擊並向系統管理員發出警告。

0 評論:

Brett McLaughlin (brett@newInstance.com), 做家兼編輯, O'Reilly Media, Inc.

2008 年 7 月 18 日

  • +內容

在 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 方法,所以不會過多涉及這些內容。可是,須要在這個文件中注意兩項內容:

  1. 簡短的 Snort 指令,一般包括 preprocessor 語句(關於查找內容)和用於發出警告的 output 語句(未顯示在清單 4 中)。
  2. 默認的 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 中的規則由兩個基本部分組成:

  1. 告訴 Snort 查找包中的特定內容,例如 Web 請求中的 GET 或 telnet 鏈接中的特定端口。
  2. 告訴 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 站點下載默認規則
Snort 提供了能夠使用的默認規則集

這將下載一個 ZIP 文件,名爲 snortrules-snapshot-2.8.tar.gz。展開這個文件,將獲得一個名爲 snortrules-snapshot-2.8_s 的文件夾。這個文件夾的內容如圖 2 所示。

圖 2. 從 Snort Web 站點得到規則
打開從 Snort Web 站點下載的 zip 文件
「安裝」 默認規則集

默認狀況下,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 的命令的各個部分分解。下面解釋了各個部分的做用:

  • sudo:容許您使用管理特權運行 Snort。上一篇文章對此已作討論,但簡而言之,Snort 須要比普通用戶更多的權限。
  • snort:顯然,這用來運行 Snort。
  • -de:「d」 選項使 Snort 偵聽並顯示應用程序層的數據,而 「e」 顯示連接層包報頭。這個選項實際上提供了有關 Snort 包嗅探的最詳盡的記錄(但都是必要的)。
  • -l logs/:告訴 Snort 記錄包和生成的警告,並將全部內容放入到 logs/ 目錄。
  • -c etc/snort.conf:表示使用 etc/snort.conf 做爲配置文件來運行 Snort。

回頁首

三種基本的規則

在使用當前的規則集運行 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 有了充分的瞭解,那麼就能夠在開發並部署應用程序以後實現長期運行。

參考資料

學習
得到產品和技術
  • 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 知識和一些特殊任務,涵蓋了基本安裝、高級入侵檢測和網絡優化等

 

 

 

 

 

 

dROSI_006_001ROSI_006_002ROSI_006_003ROSI_006_004ROSI_006_005ROSI_006_006ROSI_006_007ROSI_006_008ROSI_006_009ROSI_006_010ROSI_006_011ROSI_006_012ROSI_006_013ROSI_006_014ROSI_006_015ROSI_006_016ROSI_006_017ROSI_006_018ROSI_006_019ROSI_006_020ROSI_006_021ROSI_006_022ROSI_006_023ROSI_006_024ROSI_006_025ROSI_006_026ROSI_006_027ROSI_006_028ROSI_006_029ROSI_006_030ROSI_006_031ROSI_006_032ROSI_006_033ROSI_006_034ROSI_006_035ROSI_006_036

相關文章
相關標籤/搜索