Snort3安裝和配置


Snort3安裝和配置

介紹

之前安裝和配置過Snort2,但Snort2與3有較多不同,這里通過參考snort3安裝文檔完成snort3的配置。本指南展示了如何使用Splunk將Snort3設置為完整的網絡入侵檢測系統(NIDS)和安全信息以及Ubuntu上的事件管理(SIEM)系統。本指南的目的是介紹啟動基於Snort和Splunk的NIDS和SIEM,以便可以修改Snort和Splunk以滿足特定需求。
關於Snort3:Snort 3是基於規則的網絡入侵檢測和預防軟件(NIDS/NIPS)。
關於Splunk:Splunk是一個安全信息和事件管理(SIEM)系統,它收集、存儲並允許輕松地進行分析以及可視化數據,包括Snort創建的警報。
關於PulledPork:PulledPork用於下載和合並規則集(Snort用於匹配的簽名集合)惡意交易)。
關於OpenAppID:Snort OpenAppID允許Snort識別、控制和測量網絡上正在使用的應用程序。開放應用程序ID由一組匹配特定類型網絡數據的包(簽名)組成,包括第7層應用程序,如Facebook、DNS、netflix、discus和google,以及使用這些服務的應用程序(chrome、http、https等)。
軟件要求:本指南已經在64位LTS版本的Ubuntu 18.04中測試成功

安裝Snort

首先,確保系統是最新的,並且具有最新的程序包列表:

sudo apt-get update && sudo apt-get dist-upgrade -y

確保系統具有正確的時間和時區。當我們稍后開始處理警報時,這對Splunk非常重要。下面的命令將允許選擇時區:

sudo dpkg-reconfigure tzdata

下載一些源tarball和其他文件,我們希望將它們存儲在一個文件夾中:

mkdir ~/snort_src
cd ~/snort_src

安裝Snort 3必備組件

sudo apt-get install -y build-essential autotools-dev libdumbnet-dev libluajit-5.1-dev libpcap-dev zlib1g-dev pkg-config libhwloc-dev cmake liblzma-dev openssl libssl-dev cpputest libsqlite3-dev libtool uuid-dev git autoconf bison flex libcmocka-dev libnetfilter-queue-dev libunwind-dev libmnl-dev ethtool

下載並安裝safec,以便對某些舊式C庫調用進行運行時邊界檢查

cd ~/snort_src
wget https://github.com/rurban/safeclib/releases/download/v02092020/libsafec-02092020.tar.gz
tar -xzvf libsafec-02092020.tar.gz
cd libsafec-02092020.0-g6d921f
./configure
make
sudo make install

Snort 3使用Hyperscan進行快速模式匹配。可以從Ubuntu存儲庫安裝一個舊版本的Hyperscan,但是

Hyperscan對Snort的操作和性能至關重要,最好編譯Hyperscan的最新穩定版本。Hyperscan有一個

需求數量,包括PCRE、gper工具、ragel和Boost庫。

首先安裝PCRE:Perl兼容的正則表達式。不使用Ubuntu存儲庫,因為它有一個舊版本:

cd ~/snort_src/
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -xzvf pcre-8.44.tar.gz
cd pcre-8.44
./configure
make
sudo make install

下載和安裝 gpertools 2.8:

cd ~/snort_src
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.8/gperftools-2.8.tar.gz
tar -xzvf gperftools-2.8.tar.gz
cd gperftools-2.8
./configure
make
sudo make install

下載和安裝 Ragel:

cd ~/snort_src
wget http://www.colm.net/files/ragel/ragel-6.10.tar.gz
tar -xzvf ragel-6.10.tar.gz
cd ragel-6.10
./configure
make
sudo make install

最后,下載(但不要安裝)Boost C++庫:

cd ~/snort_src
wget https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.gz
tar -xvzf boost_1_74_0.tar.gz

從源代碼處安裝Hyperscan 5.3,參考Boost源目錄的位置:

cd ~/snort_src
wget https://github.com/intel/hyperscan/archive/v5.3.0.tar.gz
tar -xvzf v5.3.0.tar.gz
mkdir ~/snort_src/hyperscan-5.3.0-build
cd hyperscan-5.3.0-build/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBOOST_ROOT=~/snort_src/boost_1_74_0/ ../hyperscan-5.3.0
make
sudo make install

安裝flatbuffers:

cd ~/snort_src
wget https://github.com/google/flatbuffers/archive/v1.12.0.tar.gz -O flatbuffers-v1.12.0.tar.gz
tar -xzvf flatbuffers-v1.12.0.tar.gz
mkdir flatbuffers-build
cd flatbuffers-build
cmake ../flatbuffers-1.12.0
make
sudo make install

接下來,從Snort網站下載並安裝數據采集庫(DAQ)。請注意,Snort3使用的數據采集卡與Snort 2.9.0系列不同。在Snort網站上查看libdaq的更新版本,以防在編寫本指南后發布了更新的版本,或者出現丟失此文件的錯誤

cd ~/snort_src
###wget https://www.snort.org/downloads/snortplus/libdaq-3.0.0.tar.gz
wget https://github.com/snort3/libdaq/archive/refs/tags/v3.0.3.tar.gz
tar -xzvf libdaq-3.0.0.tar.gz
cd libdaq-3.0.0
./bootstrap
./configure
make
sudo make install

更新共享庫:

sudo ldconfig

現在可以從github存儲庫下載、編譯和安裝Snort3了。如果對啟用其他編譯時功能感興趣,例如處理大型(超過2GB)PCAP文件的能力,或者新的命令行shell:運行./configure cmake.sh--幫助列出所有可選功能,並將它們附加到下面的./configure\u cmake.sh命令中。在Snort網站上查看Snort3的更新版本。

下載並安裝,默認設置為:

cd ~/snort_src
###wget https://www.snort.org/downloads/snortplus/snort3-3.1.0.0.tar.gz
wget https://github.com/snort3/snort3/archive/refs/tags/3.1.5.0.tar.gz
tar -xzvf snort3-3.1.0.0.tar.gz
cd snort3-3.1.0.0
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build
make
sudo make install

Snort現在應該安裝在/usr/local/下。最后,驗證Snort是否正確運行。為此,我們向snort可執行文件傳遞-V標志

(版本為大寫V):

/usr/local/bin/snort -V

可以看到類似於以下內容的輸出:

/usr/local/bin/snort -V
    ,,_ -*> Snort++ <*-
    o" )~ Version 3.1.0.0
    '''' By Martin Roesch & The Snort Team
    http://snort.org/contact#team
    Copyright (C) 2014-2020 Cisco and/or its affiliates. All rights reserved.
    Copyright (C) 1998-2013 Sourcefire, Inc., et al.
    Using DAQ version 3.0.0
    Using LuaJIT version 2.1.0-beta3
    Using OpenSSL 1.1.1f 31 Mar 2020
    Using libpcap version 1.9.1 (with TPACKET_V3)
    Using PCRE version 8.44 2020-02-12
    Using ZLIB version 1.2.11
    Using FlatBuffers 1.12.0
    Using Hyperscan version 5.3.0 2021-01-19
    Using LZMA version 5.2.4

如果輸出與上述類似,Snort已安裝並工作。

現在讓我們用默認配置文件測試Snort:

snort -c /usr/local/etc/snort/snort.lua

內容結束的輸出:

Snort successfully validated the configuration (with 0 warnings).
o")~ Snort exiting

配置網卡

現代網卡使用卸載(例如LRO)來處理硬件中的網絡數據包重新組裝,而不是在軟件中。對於大多數情況,這是首選,因為它減少了系統的負載。對於NIDS,禁用LRO和GRO,因為這會截斷更長的數據包(更多信息請參閱Snort2手冊)

我們需要創建一個systemD服務來更改這些設置。首先使用ifconfig確定snort要監聽的接口的名稱,如果在ubuntu20上,則使用newip address show命令。

知道Snort將監聽的網絡接口的名稱:檢查這些接口的large-receive-o  load(LRO)和generic-receive-offload(GRO)的狀態。在下面的示例中,我的接口名是ens3(根據系統類型,通常也會將eth0或ens160視為接口名)。使用ethtool檢查狀態:

sudo ethtool -k ens3 | grep receive-offload
    generic-receive-offload: on
    large-receive-offload: off [fixed]

從這個輸出中,可以看到GRO被啟用,而LRO被禁用(“fixed”表示不能更改)。需要確保兩者都設置為“off”(或“off[fixed]”)。可以使用ethtool命令來禁用LRO和GRO,但是該設置不會在重新啟動時保持不變。解決方案是創建一個systemD腳本,以便在每次系統啟動時設置它。

創建systemD腳本:

sudo vi /lib/systemd/system/ethtool.service
	##內容,輸入以下信息,用接口名稱替換ens3:
	[Unit]
    Description=Ethtool Configration for Network Interface
    [Service]
    Requires=network.target
    Type=oneshot
    ExecStart=/sbin/ethtool -K ens3 gro off
    ExecStart=/sbin/ethtool -K ens3 lro off
    [Install]
    WantedBy=multi-user.target

創建文件后,啟用並啟動服務:

sudo systemctl enable ethtool
sudo service ethtool start

這些設置現在將在重新啟動時保持不變。可以如上所述使用ethtool驗證設置。

配置Snort規則集

創建一些Snort規則所需的文件夾和文件:

sudo mkdir /usr/local/etc/rules
sudo mkdir /usr/local/etc/so_rules/
sudo mkdir /usr/local/etc/lists/
sudo touch /usr/local/etc/rules/snort.rules
sudo touch /usr/local/etc/rules/local.rules
sudo touch /usr/local/etc/lists/default.blocklist
sudo mkdir /var/log/snort

將在上面創建的local.rules文件中創建一個規則:

sudo vi /usr/local/etc/rules/local.rules

此規則將檢測ICMP事務,對於測試Snort是否正常工作和生成警報非常有用。將以下行粘貼到local.rules文件中(確保准確復制這行,必須在該文件中的每個分號中有一個空格aଌ才能正確解析警報):

alert icmp any any -> any any ( msg:"ICMP Traffic Detected"; sid:10000001; metadata:policy security-ips alert; )

現在運行Snort並讓它加載local.rules文件(帶有-R標志),以確保正確加載這些規則(驗證規則的格式是否正確):

snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules

輸出應以“Snort成功驗證配置”結束。不應該有任何警告或錯誤。如果在輸出中向上滾動,會看到這個規則加載成功(在rule counts部分下)。

現在,在接口上以檢測模式運行Snort(將下面的eth0更改為與的接口名稱匹配),並將所有警報打印到控制台:

sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules \
-i eth0 -A alert_fast -s 65535 -k none

我們在這里使用的標志是:

Flag 描述
-c /usr/local/etc/snort/snort.lua snort.lua配置文件
R /usr/local/etc/rules/local.rules 包含一個ICMP規則的規則文件的路徑。
-i eth0 要監聽的接口
-A alert_fast 使用alert_fast快速輸出插件將警報寫入控制台。
-s 65535 設置snaplen,使Snort不會截斷和丟棄過大的數據包
-k none 忽略錯誤的校驗和,否則snort將丟棄具有錯誤校驗和的數據包

Snort將加載配置,然后顯示:

Commencing packet processing
++ [0] eth0

這意味着snort當前正在偵聽該接口上的所有流量,並將其與加載的規則進行比較。當流量與規則匹配時,Snort將向控制台寫入警報。現在,從該計算機上的另一個窗口(打開一個新的終端窗口或第二個ssh會話),使用ping命令生成穿過正在偵聽的接口的數據包(如果從另一台計算機連接,則ping到該接口的IP地址;如果在同一台計算機上,則只ping外部IP地址)。看到屏幕上打印的警報:

###警報信息
1 2 / 15 −2 1: 0 2: 2 6. 97 6 073 [ * * ] [ 1 : 1 0 0 0 0 0 0 1 : 0 ] " ICMP T r a f f i c De tec te d " [ * * ] [ P r i o r i t y : 0 ] { ICMP } 1 0 . 1 0 . 1 0 . 1 −> 1 0 . 1 0 . 1 0 . 8 8
1 2 / 15 −2 1: 0 2: 2 6. 9 7 6 15 7 [ * * ] [ 1 : 1 0 0 0 0 0 0 1 : 0 ] " ICMP T r a f f i c De tec te d " [ * * ] [ P r i o r i t y : 0 ] { ICMP } 1 0 . 1 0 . 1 0 . 8 8 −> 1 0 . 1 0 . 1 0 . 1

使用ctrl-c停止Snort。這是測試Snort的一個很好的規則,但是在實際的生產使用過程中可能會有點嘈雜,所以如果願意的話,可以用hash符號來注釋它。

接下來,讓我們編輯snort.lua文件。此文件是我們在啟動時傳遞給Snort的配置文件:

sudo vi /usr/local/etc/snort/snort.lua

接下來,我們要啟用解碼器和檢查器警報(Snort檢測到的惡意流量,而不是規則,因為格式更復雜),並且我們要告訴ips模塊規則文件的位置(PulledPork稍后將為我們創建此文件)

向下滾動到第169行,並查找標題為ips的部分。在這里,我們從enable_builtin_rules=true中取消注釋(刪除前面的兩個破折號),並啟用pulledpork規則。請注意,lua使用四個空格,而不是制表符來縮進這些行(這是必需的)。此部分應如下所示(刪除注釋,166行左右):

ips =
{
    enable_builtin_rules = true,
    include = RULE_PATH .. "/local.rules",
    variables = default_variables
 }

測試配置文件(因為我們已經做了更改):

snort -c /usr/local/etc/snort/snort.lua

現在可以如上所述運行snort,但是不會在命令行上明確地傳遞local.rules文件,因為已經將它包含在snort.lua文件的ips部分中:

sudo snort -c /usr/local/etc/snort/snort.lua -i eth0 -A alert_fast -s 65535 -k none

按上述方式Ping接口,會再次看到寫入控制台的警報

PulledPork

PulledWork是我們用來下載和合並Snort規則集的腳本。要從Snort下載主要的免費規則集,需要一個oinkcode。在Snort網站上注冊並在繼續之前保存的oinkcode,因為最流行的免費規則集需要oinkcode。

安裝PulledWork先決條件:

sudo apt-get install -y libcrypt-ssleay-perl liblwp-useragent-determined-perl

接下來,下載PulledPork的最新版本,並通過將perl文件復制到/usr/local/bin和所需的配置文件復制到/usr/local/etc/PulledPork來安裝它:

cd ~/snort_src
wget https://github.com/shirkdog/pulledpork/archive/master.tar.gz -O pulledpork-master.tar.gz
tar xzvf pulledpork-master.tar.gz
cd pulledpork-master/
sudo cp pulledpork.pl /usr/local/bin
sudo chmod +x /usr/local/bin/pulledpork.pl
sudo mkdir /usr/local/etc/pulledpork
sudo cp etc/*.conf /usr/local/etc/pulledpork

測試PulledPork是否運行,方法是使用-V標志運行它,如下所示,查找以下輸出:

/usr/local/bin/pulledpork.pl -V
    PulledPork v0.8.0 - The only positive thing to come out of 2020...well this and take-out liquor!

現在我們確定PulledWork已運行,我們需要對其進行配置:

sudo vi /usr/local/etc/pulledpork/pulledpork.conf

第19行,需要更改URL,然后用在snort.com網站注冊時獲得的oinkcode替換 。這將告訴PulledPork從何處下載規則。

rule_url=https://www.snort.org/rules/|snortrules-snapshot.tar.gz|<oinkcode>

第21行:評出社區規則。這些不需要,因為它們包含在我們上面包含的注冊規則集中:

#rule_url=https://snort.org/downloads/community/|community-rules.tar.gz|Community

第72行:需要指向正確的snort.rules文件,PulledWork將保存從local.rules文件下載並包含的所有規則:

rule_path=/usr/local/etc/rules/snort.rules

第87行:需要告訴PulledPork local.rules文件從何處復制規則(並復制到snort.rules中):

local_rules=/usr/local/etc/rules/local.rules

第94行:這告訴PulledPork以較新的sid_msg格式輸出有關規則的元數據:

sid_msg_version=2

第110行:告訴PulledPork在哪里保存已編譯的規則:

sorule_path=/usr/local/etc/so_rules/

第134行,將發行版改為Ubuntu-18-4(即使你運行的是ubuntu20)。這將告訴PulledWork哪個版本的編譯規則與我們的系統兼容:

distro=Ubuntu-18-4

第142行:這告訴PulledPork在何處保存阻止列表(已知的惡意IP地址,應該被阻止):

block_list=/usr/local/etc/lists/default.blocklist

第151行:告訴PulledPork塊和允許列表的默認位置

IPRVersion=/usr/local/etc/lists

第186行:告訴PulledPork Snort守護進程將當前運行的PID保存在何處,以便PulledPork在安裝新規則后可以向Snort發送消息,以便Snort加載新規則:

pid_path=/var/log/snort/snort.pid

第209行:取消對此行的注釋以啟用下載的規則文件中的所有規則。這些規則被分為不同的規則集,這取決於想要檢測trafic的攻擊性。如果在IPS模式下運行(阻止而不是檢測傳輸),可能會考慮使用“ballanted”規則集而不是“security”,因為“security”規則集在檢測可能是惡意的或可能是正常的流量方面更具攻擊性:

ips_policy=security

運行PulledPork,將配置文件傳遞給它並執行額外的日志記錄。這將下載最新的規則集,將它們與local.rules文件中的任何規則合並,並將所有規則保存到snort.rules中,同時將黑名單條目保存在defautl.blocklist文件中:

sudo /usr/local/bin/pulledpork.pl -c /usr/local/etc/pulledpork/pulledpork.conf -l -P -E -H SIGHUP

使用以下標志:

Flag 描述
-c /usr/local/etc/pulledpork/pulledpork.conf PulledWork配置文件
-l 將重要信息記錄到syslog
-P 即使未下載新規則,也處理規則
-E 僅允許寫入排除
H SIGHUP 通過傳遞SIGHUP信號使Snort重新加載配置

輸出結果如下:

Rule Stats...
New:-------15047
Deleted:---0
Enabled Rules:----15048
Dropped Rules:----0
Disabled Rules:---0
Total Rules:------15048
IP Blocklist Stats...
Total IPs:-----760
Done
Please review /var/log/sid_changes.log for additional details
Fly Piggy Fly!

如果可以,下一步是將此命令轉換為計划任務,以便我們可以每天更新規則集:

sudo crontab -e

Snort團隊要求在PulledPork連接到他們的服務器時隨機化,以幫助實現負載平衡。在下面的例子中,我們每天13:44檢查PulledWork。將分鍾值(下面的44)更改為0到59之間的值,將小時值(下面的13)更改為00到23之間的值:

44 13 * * * /usr/local/bin/pulledpork.pl -c /usr/local/etc/pulledpork/pulledpork.conf -l -P -E -H SIGHUP

檢查snort.rules文件,應該會看到一些新的規則。
修改snort.lua以加載snort.rules而不是local.rules文件(local.rules中的規則通過PulledPork自動添加到snort.rules文件中,並與所有下載的規則一起使用,可以在snort.rules文件的末尾看到local.rules中的任何規則):

#167行
ips =
{
    enable_builtin_rules = true,
    include = RULE_PATH .. "/snort.rules",
    variables = default_variables
}

測試Snort以查看這些規則是否正確加載:

snort -c /usr/local/etc/snort/snort.lua

向上滾動,將看到如下內容:

rule counts
total rules loaded: 15573
text rules: 15048
builtin rules: 525
option chains: 15573
chain headers: 330

配置Snort插件

我們希望在snort.lua文件中啟用一些功能:

sudo vi /usr/local/etc/snort/snort.lua

首先,讓我們配置HOME\u NET變量。這是指我們正在防御的本地子網(規則使用此信息來確定警報是否匹配)。在此處設置本地子網信息以匹配子網。我下面的子網是帶有24位子網掩碼的10.0.0.0網絡:

24	HOME_NET = '10.0.0.0/24'

啟用hyperscan(更快的模式匹配):更多信息,請將其放在重新命名檢查器之后,但在第3節:配置綁定之前:

104 search_engine = { search_method = "hyperscan" }
105
106 detection = {
107 hyperscan_literals = true,
108 pcre_to_regex = true
109 }

啟用信譽阻止列表。從reputationinspector中刪除注釋(整個聲譽塊周圍的塊注釋),並啟用黑名單(從“黑名單**行”前面刪除兩個破折號):

96 reputation=
97 {
98 blacklist = BLACK_LIST_PATH .. "/default.blocklist"
99 --whitelist = 'whitelist file name with ip lists'
100 }

既然已經進行了更改,再次驗證配置:

snort -c /usr/local/etc/snort/snort.lua

JSON警報輸出插件

為了方便地將Snort 3警報日志文件導入到選擇的SIEM中(如Splunk),需要使用alert\u json輸出插件將所有警報寫入json格式的文本文件。啟用json輸出插件很簡單,只需修改snort.lua文件(在第7節:配置輸出中,大約230行):

sudo vi /usr/local/etc/snort/snort.lua

首先,如下所示啟用alert_json插件。記住,縮進使用4個空格而不是制表符

alert_json =
{
    file = true,
    limit = 100,
    fields = 'seconds action class b64_data dir dst_addr dst_ap dst_port eth_dst eth_len \
    eth_src eth_type gid icmp_code icmp_id icmp_seq icmp_type iface ip_id ip_len msg mpls \
    pkt_gen pkt_len pkt_num priority proto rev rule service sid src_addr src_ap src_port \
    target tcp_ack tcp_flags tcp_len tcp_seq tcp_win tos ttl udp_len vlan timestamp',

}

在alert_json插件中,我們指定了三個選項:

1.首先,我們使用file選項將警報輸出到json格式的文件(而不是控制台)。

2.接下來,我們指定limit選項來告訴Snort何時滾動到新文件。當輸出文件達到10 MB時,將使用文件名中的當前unixtime創建一個新文件。對於測試,我們將其設置為100MB,但是在生產系統上,可能希望增加這個數字,這取決於如何進行日志管理/輪換。

3.最后,我們指定fields選項,該選項標識json輸出中應該包含警報中的哪些特定字段。在這個例子中,我們選擇了所有可能的字段作為輸出。

注意:在測試之后,可以選擇刪除其中的一些字段(vlan和mpls字段是不必要的,b64_data包含整個數據包負載,可以刪除這些數據包負載以節省空間,盡管此字段中有很多好的信息)。不要刪除“秒”字段,並確保它始終是列出的第一個字段。這將允許Splunk正確處理事件。

現在我們要運行Snort,並生成一些警報。這些警報將寫入/var/log/snort。運行下面的命令,然后再次ping接口(就像我們以前所做的那樣,生成與local.rules文件中的規則匹配的流量):

sudo /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -i ens33 -m 0x1b

我們為此命令添加了幾個新標志:

Flag 描述
-l var/log/snort 應該寫入日志文件的目錄
-m 0x1b 033文件權限的Umask(rw-r–r–)

在snort啟動后,將不會看到任何輸出到屏幕上,因為我們已經啟用了alert_json輸出模塊(該模塊按照上面命令中的指定寫入/var/log/snort)。停止snort(ctrl-c),然后檢查/var/log/snort

cat /var/log/snort/alert_json.txt

在文件中看到JSON格式的警報數據:

{ "seconds" : 1608147213, "action" : "allow", "class" : "none", "b64_data" : "
DWHaXwAAAADO0wgAAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc=", "dir" : "S2C", "
dst_addr" : "10.10.10.1", "dst_ap" : "10.10.10.1:0", "eth_dst" : "52:54:00:1F:8A:1C", "eth_len" :
98, "eth_src" : "52:54:00:70:78:9F", "eth_type" : "0x800", "gid" : 1, "icmp_code" : 0, "icmp_id" :
5203, "icmp_seq" : 3, "icmp_type" : 0, "iface" : "ens3", "ip_id" : 3006, "ip_len" : 64, "msg" : "
ICMP Traffic Detected", "mpls" : 0, "pkt_gen" : "raw", "pkt_len" : 84, "pkt_num" : 8, "priority" :
0, "proto" : "ICMP", "rev" : 0, "rule" : "1:10000001:0", "service" : "unknown", "sid" : 10000001, "
src_addr" : "10.10.10.88", "src_ap" : "10.10.10.88:0", "tos" : 0, "ttl" : 64, "vlan" : 0, "
timestamp" : "12/16-20:33:33.603502" }

Snort啟動腳本

我們創建一個systemD腳本,以便在啟動時自動運行snort。出於安全原因,我們還將讓snort作為常規(非root)用戶在啟動時運行。首先創建snort用戶和組:

sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

刪除舊日志文件(如果要保留,請移動它們):

sudo rm /var/log/snort/*

我們需要授予“snort”用戶對日志目錄的權限:

sudo chmod -R 5775 /var/log/snort
sudo chown -R snort:snort /var/log/snort

創建systemD服務文件:

sudo vi /lib/systemd/system/snort3.service

具有以下內容(更改以太網適配器eth0以匹配適配器):

[Unit]
Description=Snort3 NIDS Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -D -u snort -g snort -i ens33 -m 0x1b --create-pidfile
[Install]
WantedBy=multi-user.target

下面是在Snort中使用的所有標志的分類:

Flag 描述
/usr/local/bin/snort 這是snort二進制文件的路徑。這里不使用sudo,因為腳本將以提升的(根)權限啟動。
-c /usr/local/etc/snort/snort.lua snort.lua配置文件。
-s 65535 設置snaplen,使Snort不會截斷和丟棄過大的數據包。
-k none 忽略錯誤的校驗和,否則snort將丟棄具有錯誤校驗和的數據包,並且不會對它們進行計算。
-l /var/log/snort Snort將存儲其輸出的所有日志文件的文件夾的路徑。
-D 作為守護進程運行。
-u snort 啟動后(以及執行任何需要提升權限的操作時),切換為以“snort”用戶身份運行。
-g snort 啟動后,作為“snort”組運行。
-i eth0 要監聽的接口。
-m 0x1b 文件權限為033的Umask。
--create-pidfile 在日志目錄中創建一個PID文件(這樣pulledpork可以在加載新規則后重新啟動snort)

啟用Snort systemD服務並啟動它:

sudo systemctl enable snort3
sudo service snort3 start

檢查服務的狀態:

service snort3 status

輸出應類似於以下內容,顯示“active(running)”:

service snort3 status
    * snort3.service - Snort3 NIDS Daemon
    Loaded: loaded (/lib/systemd/system/snort3.service; enabled; vendor preset: enabled)
    Active: active (running) since Tue 2018-12-11 16:48:44 EST; 2min 57s ago

如果有任何問題,可以使用以下命令檢查服務的完整輸出:

sudo journalctl -u snort3.service

Splunk

Splunk是我們將用作SIEM(安全信息和事件管理)解決方案的軟件,它將以圖形方式(通過web界面)顯示Snort生成的所有警報,並將為我們提供一些強大的工具來搜索和理解這些警報,以及從中提取更深入的信息。Splunk對於我們使用它的方式來說是免費的(就像在成本上一樣)(盡管可以購買一個許可證來獲得與管理大型Splunk安裝相關的附加功能)。替代軟件是Elasticstack的ELK stack(我在這里不使用它,因為配置更復雜)。

安裝Splunk

需要在Splunk的網站上創建一個免費帳戶來下載軟件和附加組件。導航到Splunk的主頁,點擊右上角的Free Splunk按鈕,創建一個新帳戶(如果你已經有帳戶,也可以登錄)。在Splunk Free下,單擊“Splunk Enterprise”下標題為下載免費60天試用版的鏈接。[下載][https://www.splunk.com/en_us/download/splunk-enterprise.html]

在下載頁面上,單擊Linux選項卡,然后單擊.deb旁邊的download Now按鈕(因為我們運行的是基於Debian的Ubuntu系統)。同意許可證,然后單擊“立即開始下載”按鈕。下載頁面將自動打開一個窗口,以將下載保存到本地系統。如果想使用wget下載安裝程序,可以取消此下載,然后單擊“通過命令行下載”(wget)復制wget字符串以供下載。下載量約為370MB。

一旦系統上安裝了Splunk安裝程序,就需要安裝它。從保存安裝程序的目錄:

sudo dpkg -i splunk-8.*.deb
sudo chown -R splunk:splunk /opt/splunk

這將把Splunk安裝到/opt/Splunk。請注意,安裝的卷Splunk必須有5GB的可用空間,否則Splunk將無法啟動。Splunk存儲所有收集到的日志數據的索引位於安裝位置的子文件夾中,因此請確保此卷上有足夠的空間來存儲希望收集的所有數據。

現在第一次啟動Splunk(接受許可證並使用所有默認選項),系統將提示為Splunk創建一個新的管理用戶和密碼。保存這些憑據,因為我們稍后將使用它們登錄到web界面:

sudo /opt/splunk/bin/splunk start --answer-yes --accept-license

然后要配置Splunk在引導時自動啟動。還將為Splunk啟用systemD並啟動服務(而不是Splunk systemD服務名稱中的大寫“S”)。

sudo /opt/splunk/bin/splunk stop
sudo /opt/splunk/bin/splunk enable boot-start -systemd-managed 1
sudo chown -R splunk:splunk /opt/splunk
sudo service Splunkd start

Splunk服務器現在正在偵聽此服務器的端口8000(http://localhost:8000(如果是從本地計算機連接,或從另一台計算機通過此系統的IP地址連接)。用戶名和密碼是安裝Splunk時設置的。

Splunk目前使用免費的企業試用許可證運行,提供60天的所有企業功能,並允許每天索引5GB的日志數據。唯一的功能,我們將失去一旦試用許可證到期,將影響這個安裝是刪除已驗證的登錄。轉換為免費許可證后,將不會提示登錄到Splunk web界面。

Splunk Enterprise提供了許多功能,包括自動更新Splunk實例及其自動運行的Splunk應用程序的部署服務器、具有可配置權限的多個用戶帳戶、負載平衡和其他功能。

配置Splunk

現在使用在Splunk安裝期間創建的用戶名和密碼登錄到Splunk實例。Splunk服務器正在監聽端口8000(http://localhost:8000).

我們需要安裝一個Splunk插件(稱為Add-on),它允許我們輕松地接收(收集)Snort 3創建的日志並對其進行規范化(確保字段命名與NIDS數據一致,這樣Splunk應用程序就可以輕松地顯示我們的數據)。

要安裝此應用程序,請在Splunk實例的主頁上,單擊Splunk web界面左側標題為+查找更多應用程序的鏈接:

image-20210609204127583

這將進入Splunkbase,這是一個Splunk插件的在線存儲庫,它擴展並增強了Splunk安裝的功能。在Splunkbase中搜索Snort3,看到一個結果:snort3json警報。單擊此加載項旁邊的綠色安裝按鈕:

image-20210609204202219

輸入注冊下載Splunk時使用Splunk創建的用戶名和密碼(不是為本地Splunk服務器實例創建的用戶名和密碼)。接受條款和條件,然后單擊“登錄並安裝”。安裝完成后,單擊“完成”。

接下來我們要安裝CyberChef for Splunk插件,它允許我們將b64_data字段轉換為可讀文本。如上所述,在Splunkbase中搜索“cyberchef”,單擊cyberchef旁邊的green install按鈕以獲取Splunk,登錄,然后安裝:

接下來,我們需要配置Snort 3 JSON Alerts插件,告訴Splunk Snort 3生成的日志文件存儲在哪里,以便Splunk能夠接收它們。我們使用配置文件從命令行執行此操作:

sudo mkdir /opt/splunk/etc/apps/TA_Snort3_json/local
sudo touch /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf
sudo vi /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf

在此inputs.conf文件中輸入以下文本:

[monitor:///var/log/snort/*alert_json.txt*]
sourcetype = snort3:alert:json

重啟Splunk:

sudo service Splunkd restart

現在,當Splunk啟動時,它將掃描/var/log/snort目錄中的json文件,將它們分配給sourcetype of snort3:alert:json把它們記錄下去,這樣我們就可以搜索它們了。

從Splunk實例中登錄(因為重新啟動了服務器),單擊左上角的Splunk>Enterprise鏈接,然后單擊左側的Search and Reporting app鏈接。在“搜索”字段中,輸入以下文本:

sourcetype="snort3:alert:json"

然后單擊綠色放大鏡圖標開始搜索。

image-20210609204644013

這將顯示服務器正在收集的所有事件。可能看不到很多事件,特別是如果刪除了從pcap文件創建的舊json文件。如果沒有看到任何警報,可以使用ping創建一些新警報(請記住,我們之前創建了該規則)。在生成的事件和Splunk中顯示的事件之間有一點延遲。如果仍然看不到任何警報,請將“時間范圍”(搜索圖標旁邊的下拉列表設置為“過去24小時”)更改為“所有時間”,然后重新運行搜索。如果仍然沒有看到任何事件,請檢查/var/log/snort文件夾中是否有json文件。

使用Splunk

本指南不深入介紹如何使用Splunk。Splunk提供了非常好的免費資源,我在下面提到了這一點。

下面是一些簡單的搜索,你可能會發現有助於開始。要在包含時間、源、目標和消息的表中顯示所有事件,請運行以下搜索:

sourcetype="snort3:alert:json"
| table _time src_ap dst_ap msg

按目的地顯示所有事件的計數:

sourcetype="snort3:alert:json"
| stats count by dest

要在地圖上顯示所有事件源:

sourcetype="snort3:alert:json"
| iplocation src_addr
| stats count by Country
| geom geo_countries featureIdField="Country"

(可能需要單擊“可視化”選項卡,然后單擊“折線圖”並將其更改為Choropleth地圖)

對於許多事件,都會有base64編碼的有效負載數據(b64_data)字段(http和SMTP就是一個很好的例子)。為了轉換這些數據以便我們可以讀取,我們使用“cyberchef”函數為每個事件轉換數據(動態),並為每個事件添加一個名為“decrypted”的新字段:

 sourcetype="snort3:alert:json" dest_port=80
| cyberchef infield='b64_data' outfield=decrypted operation="FromBase64"
| table src_addr, dst_addr, rule, msg, decrypted

使用Splunk的一些優秀免費資源包括:

[EBook][https://www.splunk.com/en_us/form/exploring-splunk-search-processing-language-spl-primer-and-cookbook.html]

[Free Online Training][https://www.splunk.com/en_us/training/free-courses/splunk-fundamentals-1.html]

正在清理安裝

Splunk目前運行的是免費企業試用模式,僅適用於60天。我們希望將此許可證轉換為免費模式,這與企業模式類似,只是刪除了一些功能。注意到缺少的功能是使用用戶名和密碼登錄服務器(允許任何人登錄)。還失去了一些與集群相關的功能,以及將Splunk應用程序部署到其他服務器的能力(當有多個服務器或系統要從中收集日志時非常有用)。

要更改許可證,請單擊右上欄的“設置”,然后單擊“許可證”:

單擊更改許可證組。選擇“免費許可證”,然后單擊“保存”。單擊“立即重新啟動”,然后單擊“確定”。

現在,會發現無法從遠程計算機訪問spunkweb界面,這沒關系,我們將在下一節中使用反向代理解決這個問題。

反向代理Splunk Web

使用免費許可證的Splunk不會阻止使用用戶名和密碼進行訪問,並且只允許從本地計算機進行訪問(取決於切換許可證時是否在本地連接)。在這里,我們將設置一個反向代理,apache監聽該服務器的端口80,這將需要一個密碼,並將重定向到Splunk接口。

安裝apache和代理模塊:

sudo apt-get install -y apache2 apache2-utils
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2

創建新用戶。系統將提示輸入密碼。記住用戶和密碼,以后將使用它。可以通過以下方式創建多個用戶:

sudo touch /etc/apache2/.htpasswd
sudo htpasswd /etc/apache2/.htpasswd <username>

編輯apache配置文件,以在端口80上設置代理偵聽:

sudo vi /etc/apache2/sites-available/000-default.conf

在此文件中輸入以下信息。如果已經有一個<VirtualHost*:80>部分,請將下面的設置添加到該部分中。告訴apache在端口80上偵聽,需要身份驗證(htaccess文件中的用戶/密碼),然后將所有授權的連接轉發到端口8000(splunk正在偵聽)。

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
<Proxy *>
Order deny,allow
Allow from all
Authtype Basic
Authname "Password Required"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Proxy>
</VirtualHost>

驗證我們的apache配置:

sudo apachectl -t

可能會得到一個關於服務器FQDN的錯誤,這並不重要。

重新啟動apache以加載更改:

sudo systemctl restart apache2

將Splunk配置為僅接受來自本地計算機的連接(通過代理重定向):

sudo vi /opt/splunk/etc/system/local/web.conf

在“設置”部分下,添加一行:server.socket_host=localhost(如果文件為空,只需添加以下兩行,否則將server.socket添加到“設置”部分):

[settings]
server.socket_host = localhost

重新啟動splunk以注冊更改:

sudo service Splunkd restart

現在嘗試連接到端口80上的splunk服務器,系統會提示輸入用戶名和密碼。如果嘗試連接到端口8000,無法連接(除非是從同一台計算機連接)。

OpenAppID(可選)

OpenAppID允許識別應用層(第7層)通信量。可以創建對應用程序層流量進行操作的規則(比如阻止facebook),並記錄檢測到的每種類型流量的流量統計信息。更多信息。OpenAppID是Snort的一個可選功能,如果您想檢測或阻止流量類型(facebook、FTP等),或者收集Snort服務器檢測到的每種流量的數據量指標,則應該啟用它。

Snort團隊在社區的幫助下組裝了一個探測器包,可以下載並安裝它,稱為applicationdetector包。首先下載OpenAppID detector包並解壓縮文件:

cd ~/snort_src/
wget https://snort.org/downloads/openappid/15607 -O OpenAppId-15607.tgz
tar -xzvf OpenAppId-15607.tgz
sudo cp -R odp /usr/local/lib/

注意:如果得到一個文件不存在的錯誤,那么Snort團隊可能更新了規則集。瀏覽到https://snort.org/downloads#openappid,並下載snort-openappid.tar.gz。

接下來,我們需要下載Snort Extras存儲庫,它包含了額外的檢查器和插件,包括appid_listener,它將允許我們以JSON格式輸出appid統計信息。

cd ~/snort_src/
git clone https://github.com/snort3/snort3_extra.git
cd ./snort3_extra/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
./configure_cmake.sh --prefix=/usr/local
cd build
make
sudo make install

接下來,我們需要編輯Snort配置文件以指向這個odp目錄:

sudo vi /usr/local/etc/snort/snort.lua

找到以下部分並在configure Inspection部分中進行如下配置(修改appid部分,並添加新的appid\u listener部分):

appid =
{
    app_detector_dir = '/usr/local/lib',
}

appid_listener =
{
    json_logging = true,
    file = "/var/log/snort/appid-output.log",
}

既然已經做了更改,請如上所述驗證snort.lua文件。

使用新規則修改local.rules文件,該規則將檢測facebook流量。

alert tcp any any -> any any ( msg:"Facebook Detected"; appids:"Facebook"; sid:10000002; metadata:policy security-ips alert; )

現在是測試snort_extras插件是否可以加載(這需要額外的命令行opton)以及新規則是否正確格式化的好時機:

snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules \
--plugin-path=/usr/local/lib/snort_extra

在繼續之前修復所有錯誤。-pluginpath參數告訴snort從提取的snort_extra包中加載其他插件,包括appid_listener 插件。

我們需要做兩件事,現在我們已經添加了一個新的規則,並修改了配置。首先,我們需要pulledpork來重新創建snort.rules文件(包括新規則),該文件還將重新加載snort

sudo /usr/local/bin/pulledpork.pl -c /usr/local/etc/pulledpork/pulledpork.conf -l -P -H SIGHUP

其次,我們需要修改systemD Snort腳本,使其能夠加載appid_listener 目錄

sudo vi /lib/systemd/system/snort3.service

添加 --plugin-path 選項:

ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -D -u snort -g snort -i ens3 -m 0x1b --create-pidfile \
--plugin-path=/usr/local/lib/snort_extra

重新加載systemd文件並重新加載snort,然后驗證服務是否正在運行:

sudo systemctl enable snort3
sudo service snort3 restart
service snort3 status

生成一些facebook流量(wget facebook.com),將看到寫入splunk(和json日志文件)的警報:

sourcetype="snort3:alert:json" msg="Facebook Detected"

還會在日志目錄中看到一個新文件:/var/log/snort/appid-output.log,其中包含json格式的trafic統計信息:

{ "session_num": "0.58", "pkt_time": "2020-12-19 09:51:46.540562", "pkt_num": 1665, "apps": { "service"
: "HTTPS", "client": "SSL client", "payload": "Facebook", "misc": null, "referred": null }, "proto"
: "TCP", "client_info": { "ip": "10.10.10.88", "port": 33942, "version": null }, "service_info": {
"ip": "185.60.216.35", "port": 443, "version": null, "vendor": null }, "user_info": { "id": 0, "
username": null, "login_status": "n/a" }, "tls_host": "www.facebook.com", "dns_host": null, "http":
{ "http2_stream": null, "host": null, "url": null, "user_agent": null, "response_code": null, "
referrer": null } }

服務字段告訴檢測到此流量的服務。

將splunk配置為讀取appid stats:接下來,我們需要配置Snort 3json警報插件來告訴splunk OpenAppID日志文件的存儲位置。就像以前一樣,我們使用配置文件從命令行執行此操作:

sudo vi /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf

將以下文本添加到此inputs.conf文件中(不要刪除指向警報文件的其他部分):

[monitor:///var/log/snort/*appid-output.log*]
sourcetype = snort3:openappid:json

重啟Splunk:

sudo service Splunkd restart

現在在splunk中搜索OpenAppID數據

search sourcetype="snort3:openappid:json"

結論

有關運行Snort 3和編譯選項的更多信息,請參閱Snort 3博客。Snort 3與Snort 2.9.9.x系列有很大不同。配置文件和規則文件都是不同的,兩個版本之間不兼容。可以使用附帶的snort2lua命令將舊的Snort 2配置和規則文件轉換為Snort 3格式。
參考文檔Snort 3.1.0.0 on Ubuntu 18 & 20


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM