1 介紹
雖然您可以選擇在沒有任何支持軟件的情況下安裝Snort,但它只能運行,但是使用一些額外的軟件包會變得更加有用。 這些包是:
Barnyard2:采用Snort輸出並寫入SQL數據庫的軟件,可減少系統負載。
PulledPork:自動下載最新的Snort規則。
BASE:基於Web的圖形界面,用於查看和清除Snort事件。
2 關於本指南
本指南中使用的軟件版本:
• Snort 2.9.9.0
• Barnyard2 2-1.14 (current master)
• PulledPork 0.7.3 (current master)
• BASE 1.4.5
管理員帳戶:本指南假定您以普通用戶身份登錄系統,並將使用sudo運行所有管理命令。 這有助於確定哪些命令需要管理憑據,哪些不需要。 我們還將創建一個名為snort的非特權用戶,該用戶被用於運行所有應用程序,當創建服務時.
5 Ubuntu 16上的以太網接口名稱
運行Ubuntu 16的人員的重要注意事項:從Ubuntu 15.10開始,網絡接口不再遵循ethX標准(ens33,eth1,...)。 而是將接口名稱指定為可預測的網絡接口名稱。 這意味着您需要使用ifconfig檢查接口的名稱,因為您需要在本指南的許多步驟中引用接口的名稱。 在我的情況下,原來ens33現在是ens160。 如果您運行的是Ubuntu 16,在本指南的任何地方都可以看到ens33,您將需要替換為新的接口名稱。
6 VMware虛擬機配置
如果您使用VMware vSphere托管Snort虛擬機,則在創建虛擬機時,請確保在創建客戶端虛擬機時選擇VMXNET 3網絡適配器(而不是默認適配器),因為它更適合Snort。
本指南假定您已創建一個具有單個網絡適配器的虛擬機,該適配器將用於管理控制(通過SSH)以及Snort監聽流量。 您可以在設置系統時輕松添加更多適配器,或者在以后更新,您只需確保指定Snort應在運行時監聽的正確適配器(如果您使用本指南設置系統,則應該能夠 這些配置變化沒有問題)。
注意:
我使用的VMware Workstation,我要選擇:編輯---》虛擬網絡編輯器---》VMnet8(NAT模式)
7 安裝Ubuntu
本指南假設您已使用所有默認設置安裝了受支持的Ubuntu版本之一。
Snort不需要為其正在偵聽的接口分配IP地址,並且在許多配置中,snort將偵聽沒有配置IP地址的接口。對於本指南,如果可以訪問接口,則通過ssh遠程管理系統會更容易。在生產環境中,建議您在Snort服務器上使用一個接口進行管理,並讓Snort偵聽其他接口,但這不是必需的。默認情況下,Ubuntu將使用DHCP自動配置地址,如果是這種情況,您可以通過運行ifconfig ens33來驗證您的IP地址。如果您沒有DHCP服務器分配IP地址,請手動配置Snort系統上的IP地址。您需要互聯網連接才能下載所需的軟件包和軟件tarball。
一旦您首次登錄並驗證了互聯網連接,請確保系統是最新的,並安裝openssh-server(以便我們可以遠程管理系統)。安裝后重新啟動以確保應用所有修補程序。
# Install Updates and reboot: sudo apt-get update sudo apt-get dist-upgrade -y sudo apt-get install -y openssh-server sudo reboot |
如果要在VMware vSphere服務器上安裝Snort,則不再需要手動安裝vmware工具,它們是默認安裝的open-vm-tools包的一部分.
8 網卡配置
要為Snort偵聽的任何接口禁用LRO和GRO,我們將在網絡接口配置文件/ etc / network / interfaces中使用ethtool命令。 我們使用vi編輯網絡接口
文件:
sudo vi /etc/network/interfaces |
為每個網絡接口附加以下兩行,確保更改ens33以匹配您正在使用的接口,因為您的接口名稱可能不同,尤其是在Ubuntu 16上:
post-up ethtool -K ens33 gro off post-up ethtool -K ens33 lro off |
/ etc / network / interfaces文件示例:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto ens33 iface ens33 inet dhcp post-up ethtool -K ens33 gro off post-up ethtool -K ens33 lro off |
重新啟動網絡(用以下接口替換ens33)並驗證LRO和GRO是否已禁用
user@snortserver:~$ sudo ifconfig ens33 down && sudo ifconfig ens33 up user@snortserver:~$ ethtool -k ens33 | grep receive-offload generic-receive-offload: off large-receive-offload: off user@snortserver:~$ |
提示沒有ethtool,因此輸入命令:
sudo apt install ethtool
發現安裝失敗,此時 ping baidu.com不通.
重啟sudo reboot
9 安裝Snort先決條件
Snort有四個主要先決條件:
pcap (libpcap-dev) available from the Ubuntu repository
PCRE (libpcre3-dev) available from the Ubuntu repository
Libdnet (libdumbnet-dev) available from the Ubuntu repository
DAQ (http://www.snort.org/downloads/) compiled from source
首先,我們要安裝構建軟件所需的所有工具。 build-essentials做到了。
sudo apt-get install -y build-essential |
一旦我們的構建工具安裝完畢,我們就會安裝Ubuntu提供的所有Snort先決條件庫。
sudo apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev |
Snort DAQ(Data AcQuisition庫)有一些需要安裝的先決條件:
sudo apt-get install -y bison flex |
在本指南中,我們將為各種軟件包下載許多tarbals。 我們將創建一個
名為snort src的文件夾將它們保存在一個地方:
mkdir ~/snort_src cd ~/snort_src |
從Snort網站下載並安裝最新版本的DAQ。 以下步驟使用wget
下載DAQ版本2.0.6,這是編寫本指南時的最新版本。
cd ~/snort_src wget https://snort.org/downloads/snort/daq-2.0.6.tar.gz tar -xvzf daq-2.0.6.tar.gz cd daq-2.0.6 ./configure make sudo make install |
運行./configure時,您應該看到以下輸出,顯示正在配置哪些模塊
編譯DAQ時可以使用哪些:
Build AFPacket DAQ module.. : yes Build Dump DAQ module...... : yes Build IPFW DAQ module...... : yes Build IPQ DAQ module....... : no Build NFQ DAQ module....... : no Build PCAP DAQ module...... : yes Build netmap DAQ module.... : no |
10 安裝Snort
要在Ubuntu上安裝Snort,還需要安裝一個額外的必需先決條件
文檔中沒有提到:zlibg是一個壓縮庫。
有四個可選的庫可以提高功能性:liblzma-dev 和openssl和libssl-dev
sudo apt-get install -y zlib1g-dev liblzma-dev openssl libssl-dev |
最后我們需要Nghttp2的開發庫:一個實現HPAC的HTTP / 2 C庫
標頭壓縮算法。 在Ubuntu 16中,安裝很簡單:
# Ubuntu 16 (不適用Ubuntu 14) sudo apt-get install -y libnghttp2-dev |
一旦安裝了所有先決條件,我們就可以下載Snort源代碼tarball,編譯,然后
安裝。 --enable-sourcefire選項提供了數據包性能監控(PPM),這讓我們可以做到
規則和預處理器的性能監控,並以與Snort團隊相同的方式構建Snort:
cd ~/snort_src wget https://snort.org/downloads/snort/snort-2.9.9.0.tar.gz tar -xvzf snort-2.9.9.0.tar.gz cd snort-2.9.9.0 ./configure --enable-sourcefire make sudo make install |
由於snort-2.9.9.0地址已經變了,因此上述命令wget https://snort.org/downloads/snort/snort-2.9.9.0.tar.gz應該改為:
wget https://www.snort.org/downloads/archive/snort/snort-2.9.9.0.tar.gz
注意:只要你沒有看到configure:error:“致命!” 在運行./configure時,你可以繼續。 如果出現錯誤,則應在繼續之前解決錯誤。鍵入命令 ./configure into grep "... no"以獲取未安裝的所有軟件的列表。 你可以多次運行./configure,首先要確保沒有整體問題,然后再看看是什么組件未安裝:./ configure | grep“... no”(您也可以使用tee命令將輸出保存到屏幕和文件)。
運行以下命令以更新共享庫(如果跳過此步驟,則在嘗試運行Snort時會出現錯誤):
sudo ldconfig |
將符號鏈接放在/ usr / sbin中的Snort二進制文件中:
sudo ln -s /usr/local/bin/snort /usr/sbin/snort |
通過以常規用戶身份運行二進制文件來測試Snort,並傳遞-V標志(告訴Snort驗證自身以及傳遞給它的任何配置文件)。 您應該看到類似於下面顯示的輸出(盡管確切的版本號可能略有不同):
user@snortserver:~$ snort -V ,,_ -*> Snort! <*- o" )~ Version 2.9.9.0 GRE (Build 56) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2016 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.7.4 Using PCRE version: 8.38 2015-11-23 Using ZLIB version: 1.2.8 user@snortserver:~$ |
11 配置Snort以NIDS模式運行
由於我們不希望Snort以root身份運行,因此我們需要為守護進程創建一個非特權帳戶和組(snort:snort)。 我們還將創建Snort所需的許多文件和目錄,並設置這些文件的權限。 Snort將具有以下目錄:/ etc / snort中保存配置和規則文件.
警報將寫入/ var / log / snort.
編譯好的規則(.so規則)將存儲在/ usr / local / lib / snort dynamicrules中.
# Create the snort user and group:#創建snort用戶和組 sudo groupadd snort sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort # Create the Snort directories:#創建snort目錄 sudo mkdir /etc/snort sudo mkdir /etc/snort/rules sudo mkdir /etc/snort/rules/iplists sudo mkdir /etc/snort/preproc_rules sudo mkdir /usr/local/lib/snort_dynamicrules sudo mkdir /etc/snort/so_rules # Create some files that stores rules and ip lists#創建一些文件保存規則和ip列表 sudo touch /etc/snort/rules/iplists/black_list.rules sudo touch /etc/snort/rules/iplists/white_list.rules sudo touch /etc/snort/rules/local.rules sudo touch /etc/snort/sid-msg.map # Create our logging directories:#創建日志目錄 sudo mkdir /var/log/snort sudo mkdir /var/log/snort/archived_logs # Adjust permissions:#提取 sudo chmod -R 5775 /etc/snort sudo chmod -R 5775 /var/log/snort sudo chmod -R 5775 /var/log/snort/archived_logs sudo chmod -R 5775 /etc/snort/so_rules sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules |
我們想要更改上面創建的文件的所有權,以確保Snort可以訪問它使用的文件:
# Change Ownership on folders: #更改文件夾的所有權: sudo chown -R snort:snort /etc/snort sudo chown -R snort:snort /var/log/snort sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules |
Snort需要一些配置文件,動態預處理器(dynamic preprocessors)從Snort源tarball復制到/ etc / snort文件夾。配置文件是:
• classification.config
• file magic.conf
• reference.config
• snort.conf
• threshold.conf
• attribute table.dtd
• gen-msg.map
• unicode.map
要復制配置文件和動態預處理器(dynamic preprocessors),請運行以下命令:
cd ~/snort_src/snort-2.9.9.0/etc/ sudo cp *.conf* /etc/snort sudo cp *.map /etc/snort sudo cp *.dtd /etc/snort cd ~/snort_src/snort-2.9.9.0/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/ sudo cp * /usr/local/lib/snort_dynamicpreprocessor/ |
我們現在有以下目錄布局和文件位置:
Snort二進制文件: /usr/local/bin/snort
Snort 配置文件: /etc/snort/snort.conf
Snort 日志數據目錄: /var/log/snort
Snort 規則目錄: /etc/snort/rules
/etc/snort/so rules
/etc/snort/preproc rules
/usr/local/lib/snort dynamicrules
Snort ip地址目錄: /etc/snort/rules/iplists
Snort dynamic preprocessors: /usr/local/lib/snort dynamicpreprocessor/
我們的Snort目錄列表如下所示:
user@snortserver:~$ tree /etc/snort
/etc/snort
|-- attribute_table.dtd
|-- classification.config
|-- file_magic.conf
|-- gen-msg.map
|-- preproc_rules
|-- reference.config
|-- rules
| |-- iplists
| | |-- black_list.rules
| | |-- white_list.rules
| |-- local.rules
|-- sid-msg.map
|-- snort.conf
|-- so_rules
|-- threshold.conf
|-- unicode.map
我們現在需要編輯Snort的主配置文件/etc/snort/snort.conf。 當我們以此文件作為參數運行Snort時,它告訴Snort以NIDS模式運行。
我們需要注釋掉Snort配置文件中引用的所有單個規則文件,
因為我們不是單獨下載每個文件,而是使用PulledPork來管理我們的規則集,它將所有規則組合到一個文件中。 以下行將注釋掉snort.conf文件中的所有規則集(從第540行開始,大約有100行要注釋掉):
sudo sed -i "s/include \$RULE\_PATH/#include \$RULE\_PATH/" /etc/snort/snort.conf |
我們現在將使用您喜歡的編輯器手動更改snort.conf文件中的一些設置:
sudo vi /etc/snort/snort.conf |
更改以下行以滿足您的環境:
第45行,HOME NET應與您的ip地址匹配。 在下面的示例中,我們的HOME NET是帶有24位子網掩碼的10.0.0.0(255.255.255.0)
注:向下翻頁:CTRL+F
顯示行號:se nu
設置ip地址
ipvar HOME_NET 10.0.0.0/24 |
使用命令ifconfig | grep "inet add"可以查看ip地址.
在snort.conf中設置以下文件路徑,從第104行開始:
var RULE_PATH /etc/snort/rules var SO_RULE_PATH /etc/snort/so_rules var PREPROC_RULE_PATH /etc/snort/preproc_rules var WHITE_LIST_PATH /etc/snort/rules/iplists var BLACK_LIST_PATH /etc/snort/rules/iplists |
為了使Snort測試變得簡單,我們想要啟用local.rules文件,我們可以在其中添加Snort可以提醒的規則。 從第546行取消注釋(刪除哈希符號),使其如下所示:
include $RULE_PATH/local.rules |
測試配置文件:
sudo snort -T -i ens33 -c /etc/snort/snort.conf
配置文件准備好后,我們將讓Snort驗證它是否是有效文件,並且它引用的所有必要文件都是正確的。 我們使用-T標志來測試配置文件,使用-c標志告訴Snort使用哪個配置文件,使用-i指定Snort將監聽的接口(這是從2.9.8開始的新要求)。 運行sudo snort -T -c /etc/snort/snort.conf -i ens33。 運行此命令,如下所示,並查找以下輸出(為清楚起見,僅顯示輸出的最后幾行):
user@snortserver:~$ sudo snort -T -i ens33 -c /etc/snort/snort.conf (...) Snort successfully validated the configuration! Snort exiting user@snortserver:~$ |
最好向上滾動此命令的輸出,以了解Snort正在加載的內容。
很多它在這個時候沒有意義,但隨着你對Snort的更多工作,它會變得更加清晰。 查找列出的任何錯誤和警告
快捷鍵shift+pageup
12 編寫一個簡單的規則來測試Snort檢測
在此階段,Snort沒有加載任何規則(我們在snort.conf中引用的規則文件為空)。 如果向上滾動上一個命令的輸出並查找以下內容,則可以驗證Snort是否未加載任何規則:0讀取Snort規則。 為了測試Snort的檢測能力,讓我們創建一個簡單的規則,當Snort看到ICMP“Echo request”或“Echo reply”消息時,Snort會生成一個警報,這很容易通過無處不在的ping實用程序生成(這很容易 測試規則)。將以下單行粘貼到空的本地規則文件/etc/snort/rules/local.rules中(注意,這應該放在一行):
alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;) |
如果沒有這些信息,Barnyard2不會從local.rules文件中讀取有關警報的元信息。Barnyard2將不會知道觸發警報的規則的任何細節,並且在使用PulledPork添加新規則時會產生非致命錯誤(在后面的步驟中完成)。 為了確保barnyard2知道我們使用唯一標識符10000001創建的規則具有消息“ICMP Test Detected”,以及其他一些信息(請參閱此博客文章以獲取更多信息)。 我們將以下行添加到/etc/snort/sid-msg.map文件:
1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792 |
當您取消注釋上面的第546行(include $RULE PATH/local.rules)時,您告訴Snort應該由Snort加載local.rules文件。 當Snort在啟動時加載該文件時,它將看到您創建的規則,並在接口看到的所有流量上使用該規則。 在這種情況下,當我們創建規則時,我們告訴Snort它應該在看到ICMP ping時生成警報。
由於我們對Snort配置進行了更改,因此我們應該再次測試配置文件:
sudo snort -T -c /etc/snort/snort.conf -i ens33 |
這次如果向上滾動輸出,你會發現一個規則(我們在local.rules中創建的那個,並由snort.conf中的include偽指令加載)已經加載:
(...) +++++++++++++++++++++++++++++++++++++++++++++++++++ Initializing rule chains... 1 Snort rules read 1 detection rules 0 decoder rules 0 preprocessor rules 1 Option Chains linked into 1 Chain Headers 0 Dynamic rules +++++++++++++++++++++++++++++++++++++++++++++++++++ +-------------------[Rule Port Counts]--------------------------------------- | tcp udp icmp ip | src 0 0 0 0 | dst 0 0 0 0 | any 0 0 1 0 | nc 0 0 1 0 | s+d 0 0 0 0 +---------------------------------------------------------------------------- |
現在我們知道Snort正確加載了我們的規則和配置,我們可以在NIDS模式下啟動snort,並告訴它將任何警報輸出到控制台。 我們將使用以下標志從命令行運行Snort:
-A console |
'console'選項將快速模式警報打印到stdout |
-q |
靜音模式。 不要顯示橫幅和狀態報告。 |
-u snort |
啟動后以下列用戶身份運行Snort |
-g snort |
啟動后,將Snort作為以下組運行 |
-c |
配置文件目錄 |
-i ens33 |
監聽的網卡 |
$ sudo /usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i ens33 |
啟動運行snort
$ sudo /usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i ens33
執行此命令時,您最初不會看到任何輸出。 Snort正在運行,並且正在處理所有到達ens33的數據包. Snort將每個數據包與其加載的規則(在本例中為單個ICMP Ping規則)進行比較,然后在數據包符合我們的規則時向控制台打印警報。
在另一台計算機上,ping 該IP地址,您應該看到類似於下面顯示的控制台輸出。 此輸出是Snort在將數據包與您創建的ICMP規則匹配時寫入控制台的各個警報。 在下面的示例中,Snort服務器正在偵聽ens33和IP地址10.0.0.105.
12/06−12:14:28.908206 [∗∗] [1:10000001:1] ICMP test detected [∗∗] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 10.0.0.59 −> 10.0.0.105 12/06−12:14:28.908241 [∗∗] [1:10000001:1] ICMP test detected [∗∗] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 10.0.0.105 −> 10.0.0.59 12/06−12:14:29.905893 [∗∗] [1 |
使用ctrl-c阻止Snort運行。 請注意,Snort已將此信息的副本保存在/ var / log / snort中,名稱為snort.log.nnnnnnnnn(數字可能不同)。 此時,Snort在NIDS模式下正常運行並生成警報。
13 安裝 Barnyard2
正如我們上面所做的那樣,Snort以人類可讀的模式將事件寫入控制台或文本文件是一種資源密集型。 理想情況下,我們希望將Snort事件存儲在MySQL數據庫中,以便我們可以查看,搜索和分析事件。 為了有效地將Snort事件發送到MySQL數據庫,我們使用Barnyard2。 我們將Snort配置為以二進制形式將事件輸出到文件夾,然后讓Barnyard2異步讀取這些事件並將它們插入到我們的MySQL數據庫中。
14 ssh傳送文件
ssh連接的命令格式: sftp 用戶名@ip地址
輸入如下命令傳送文件generic.rules到rules目錄下:
sftp linlin@192.168.153.130
put generic.rules /etc/snort/rules
參考鏈接:
http://www.cnblogs.com/timelyxyz/p/3708104.html
15 測試rules文件的命令:
sudo snort -T -i ens33 -c /etc/snort/snort.conf
16 運行snort的命令:
$ sudo /usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i ens33