來源:https://dallinwarne.com/networking/getting-started-with-bro-intrusion-detection-system-ids/
如果您擁有計(jì)算機(jī)網(wǎng)絡(luò),那么您需要確保入侵檢測系統(tǒng)(IDS)是您網(wǎng)絡(luò)安全策略的一部分。監(jiān)控網(wǎng)絡(luò)流量的價(jià)值遠(yuǎn)遠(yuǎn)超過入侵的成本。雖然大多數(shù)IDS系統(tǒng)都是商業(yè)的,但是也有一些開源的IDS解決方案。
Snort和Suricata是流行的開源防火墻/IDS解決方案,但也有一些缺點(diǎn)。對于小型企業(yè)來說,它們可能工作得很好,但對于中型或大型網(wǎng)絡(luò),它們可以帶來更多的工作,而帶來更少的價(jià)值。目前它們的主要缺點(diǎn)是,支持Snort/ suricata的設(shè)備不能與網(wǎng)絡(luò)上其他支持Snort的設(shè)備通信,也不能集中管理它們。隨著網(wǎng)絡(luò)攻擊變得越來越復(fù)雜,一個(gè)具有安全意識的組織需要更好的解決方案。
這里是開放源碼IDS游戲的第三個(gè)主要參與者。Bro網(wǎng)絡(luò)安全監(jiān)視器最初是由高等教育開發(fā)的,它提供了一個(gè)網(wǎng)絡(luò)協(xié)議分析器和一個(gè)安全工具。它的優(yōu)點(diǎn)是能夠跨網(wǎng)絡(luò)上多個(gè)Bro設(shè)備關(guān)聯(lián)流量,并添加額外的和可定制的插件。換句話說,與其在你的網(wǎng)絡(luò)上有多個(gè)獨(dú)立的IDS盒,你還可以有一個(gè)集群系統(tǒng)把信息通過網(wǎng)絡(luò)連接起來。
Bro的缺點(diǎn)是比較高級,需要一些耐心來為初學(xué)者進(jìn)行設(shè)置。本介紹指南旨在幫助您消除一些痛苦,并概述您可以采取的步驟來構(gòu)建自己的Bro集群。請記住,根據(jù)操作系統(tǒng)和設(shè)置的不同,有些步驟可能有所不同。
一、系統(tǒng)規(guī)格:
操作系統(tǒng):紅帽Linux 7
Manager服務(wù)器:8 CPU, 32 GB RAM, 1 TB硬盤,帶有一個(gè)大的日志分區(qū)。
工作人員:12個(gè)物理超線程cpu, 96GB RAM, 120gb SSD, 10gbps Intel X710 NIC
網(wǎng)絡(luò)信息:我將要測試的網(wǎng)絡(luò)總流量超過1Gbps (Tx和Rx),因此在worker中有10gbps的NIC。這是一個(gè)典型的網(wǎng)絡(luò),它的網(wǎng)頁瀏覽量很大,但也使用許多其他應(yīng)用程序。正如在典型的網(wǎng)絡(luò)中看到的那樣,它也具有微突發(fā)。
二、大視圖
首先,我將告訴您我是如何安裝Bro的先決條件和準(zhǔn)備操作系統(tǒng)的。接下來,我將編譯Bro并安裝它以及一些所需的Bro插件。第三,我將介紹故障診斷、調(diào)優(yōu)和調(diào)整。最后,我要講的是Elasticsearch的整合。邏輯圖和物理圖顯示了本系列文章最后的架構(gòu)。


三、Bro先決條件
首先,我建議為Bro生成的日志和文件設(shè)置一個(gè)單獨(dú)的分區(qū)。系統(tǒng)管理員可以相應(yīng)地對磁盤進(jìn)行分區(qū),或者為您提供一些附加的存儲(chǔ)。你不需要這樣做,但是要知道如果你的日志填滿了根分區(qū),那么Bro就會(huì)崩潰,操作系統(tǒng)就會(huì)變得不穩(wěn)定。
為了安裝Bro,需要安裝所有的先決條件。其中包括:
(1)C++ Actor 框架
(2)LibGeoIP 數(shù)據(jù)庫
(3)Gperftools
(4)Ipsumdump
(5)PF_RING (吞吐量超過1Gbps時(shí)需要)
(6)其它一些東西
四、其它一些東西
有幾個(gè)包可以通過yum安裝。只需從CLI運(yùn)行以下命令:
sudo yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python-devel swig zlib-devel
檢查輸出中的錯(cuò)誤。如果yum無法找到一個(gè)包,您可能需要啟用一個(gè)額外的存儲(chǔ)庫:?yum-config-manager –enable rhel-7-server-optional-rpms
五、C + +行為框架
如果您知道要查看何處,這也很簡單。從https://build.opensuse.org/package/show/devel:libraries:caf/caf.下載
make
make install
六、LibGeoIP
Bro使用LibGeoIP來定位地理上的IP地址。如果您打算稍后將日志發(fā)送到Elasticsearch或Splunk,您可能可以跳過這一步,讓它們處理GeoIP特性。如果您想讓Bro這樣做,請記住,必須在集群中的所有工人和管理人員之間一致地安裝它,并定期進(jìn)行更新。
安裝、運(yùn)行:sudo yum install GeoIP-devel
要提供更精確的位置(如按城市),請運(yùn)行這些命令下載和安裝數(shù)據(jù)庫。
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
#Rename the file and move to /var/lib/GeoIP:
mv GeoLiteCity.dat /var/lib/GeoIPCity.dat
#*note* - alternative path.
mv GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
#Now do the same for IPV6 addresses.
wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz
gunzip GeoIPv6.dat.gz
mv GeoIPv6.dat /var/lib/GeoIPv6.dat
#*note* - alternative path.
mv GeoIPv6.dat /usr/share/GeoIP/GeoIPCityv6.dat
Ipsumdump
七、IPsumdump
可以“將TCP/IP轉(zhuǎn)儲(chǔ)文件總結(jié)為一種便于人類和程序閱讀的自描述ASCII格式”。
下載最新版本http://read.seas.harvard.edu/~kohler/ipsumdump/
gunzip ipsumdump-1.86.tar.gz
tar -xvf ipsumdump-1.86.tar
cd ipsumdump-1.86/
./configure
make
sudo make install
八、gperftools
注意:gperftools-devel不一定附帶標(biāo)準(zhǔn)存儲(chǔ)庫。你必須為它找到另一個(gè)rpm。只要確保操作系統(tǒng)版本和存儲(chǔ)庫版本匹配即可。
yum install gperftools-lib
前面的命令安裝庫,但是您仍然需要開發(fā)包。
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/gperftools-devel-2.4-8.el7.x86_64.rpm
rpm -ivh gperftools-devel-2.4-8.el7.x86_64.rpm
九、PF_RING
當(dāng)網(wǎng)絡(luò)吞吐量超過1gbps時(shí),默認(rèn)的Linux驅(qū)動(dòng)程序是一個(gè)糟糕的選擇。要充分利用10gbps網(wǎng)卡,需要一個(gè)第三方驅(qū)動(dòng)程序。如果您的worker處理的內(nèi)存小于1Gbps,那么您可能可以跳到本指南后面的“編譯Bro”一節(jié)。
Ntop提供了一個(gè)名為PF_RING Vanilla的免費(fèi)驅(qū)動(dòng)程序,以及一個(gè)名為PF_RING- zc的付費(fèi)版本。ZC應(yīng)該提供更好的性能,因?yàn)樗幌衲J(rèn)內(nèi)核或PF_RING Vanilla那樣復(fù)制包。其他替代方案包括AF_PACKET、NetMap和Myricom。后者與Myricom nic合作,而其他大部分與Intel nic合作。目前還無法對每一個(gè)進(jìn)行比較。目前,我將重點(diǎn)介紹PF_RING Vanilla,因?yàn)樗容^流行。
就像其他先決條件一樣,PF_Ring庫需要安裝在一個(gè)跨所有工作人員和管理人員一致的目錄中。如果PF_Ring庫已經(jīng)安裝在默認(rèn)安裝位置(通常是/usr/local),則在繼續(xù)之前刪除它。在編譯Bro時(shí),編譯器可能會(huì)找到默認(rèn)實(shí)例,而不是您在configure命令中指定的實(shí)例。
PF_Ring版本可能有所不同,您可能會(huì)選擇更通用的名稱。此外,盡管驅(qū)動(dòng)程序的目錄在其名稱中有“ZC”,但是除非您有許可證并正確設(shè)置它,否則您實(shí)際上不會(huì)使用ZC特性。
我喜歡在目錄的名稱中包含PF_Ring的版本號。雖然我是從6.5版開始的,但是6.6版是在發(fā)布本文之前發(fā)布的。
我使用的是i40e驅(qū)動(dòng)程序,它的通用性不如其他驅(qū)動(dòng)程序。我聽說ixgbe雖然可能更老,但在環(huán)形插槽等設(shè)置上允許更大的靈活性和調(diào)整。
#Install git and download latest PF_RING driver
yum install git
git clone https://github.com/ntop/PF_RING
#Compile and install libraries
cd ./PF_RING/userland/lib
./configure prefix=/opt/pf_ring-6.5.0
make
make install
#Compile and install pcap libraries
cd ../libpcap
./configure prefix=/opt/pf_ring-6.5.0
make
make install
#Compile and install kernel module
cd ../../../PF_RING/kernel
make
make install
#Compile driver
cd ../../PF_RING/drivers/intel/i40e/i40e-1.5.18-zc/src
make
加載驅(qū)動(dòng)程序的腳本需要修改以優(yōu)化NIC和OS設(shè)置。
vim load_driver.sh
由于此NIC僅用于接收通信量,而不用于傳輸數(shù)據(jù)包,因此,我修改了行insmod . . / . / . / . / . / . /kernel/ pf_ring.ko
insmod ../../../../../kernel/pf_ring.ko enable_tx_capture=0
由于Red Hat沒有“killall”命令,我將“killall irqbalance”行替換為
pkill irqbalance
“NIC隊(duì)列”指定想要NIC發(fā)送中斷的cpu數(shù)量。對于i40e驅(qū)動(dòng)程序,如果組合<number>設(shè)置,則在ethtool -L $中指定。</number>由于我的機(jī)器有24個(gè)邏輯內(nèi)核,并且我喜歡將一個(gè)內(nèi)核空閑用于其他管理過程,所以我修改了這一行
Ethtool -L $IF combined 23
我修改的其他設(shè)置:
ethtool -K $IF rxvlan off txvlan off
接下來要修改的這一行對Bro的性能非常重要。Bro會(huì)計(jì)算哈希值,如果它從NIC接收到哈希值,就有點(diǎn)瘋狂了。我們關(guān)閉這些設(shè)置的NIC的行:
ethtool -K $IF rxhash off tx off rx off
我修改的最后一行是從512到1024的HUGEPAGES_NUM變量??雌饋頍o論我選擇的數(shù)字是多少,操作系統(tǒng)只會(huì)分配一半的請求頁面。
保存腳本并退出VIM之后,我通過運(yùn)行加載驅(qū)動(dòng)程序:
./load_driver.sh
通過運(yùn)行下面的ethtool命令來驗(yàn)證你的網(wǎng)卡設(shè)置:
ethtool -k em1
ethtool -c em1
ethtool -G em1
PF_RING提供了一些與驅(qū)動(dòng)程序一起使用的基本工具。雖然這些對于Bro來說不是必需的,但是在故障排除時(shí)它們是有幫助的。運(yùn)行make編譯PF_RING/userland/示例。一個(gè)簡單的測試工具是pfcount,它提供有關(guān)NIC的統(tǒng)計(jì)信息,包括吞吐量以及在讀取之前在NIC上丟棄了多少數(shù)據(jù)包。
./pfcount -I em1
如果您沒有看到丟棄的數(shù)據(jù)包和吞吐量,那么您應(yīng)該已經(jīng)準(zhǔn)備好了。為您的特定操作系統(tǒng)、網(wǎng)卡和驅(qū)動(dòng)程序優(yōu)化這些設(shè)置可能需要時(shí)間和耐心,以及一些反復(fù)試驗(yàn)。
九、操作系統(tǒng)準(zhǔn)備
我需要準(zhǔn)備操作系統(tǒng)來與集群中的其他worker進(jìn)行通信。這包括調(diào)整iptables(或系統(tǒng)的防火墻設(shè)置)和分發(fā)SSH密鑰。我不會(huì)詳細(xì)介紹這些設(shè)置,因?yàn)樗鼈兣c您的系統(tǒng)設(shè)置高度相關(guān),而且已經(jīng)有了一些很好的指南。我將在IP表中注意到,可能很難預(yù)測Bro manager和worker需要相互開放哪些端口。一開始可能更容易將所有端口相互打開,然后當(dāng)您有工作要鎖定哪些端口實(shí)際上是打開的。例如,這個(gè)iptable規(guī)則打開了管理器上Bro通常使用的端口范圍。
iptables -A IN_public_allow -s 10.1.0.10 -p tcp --dport 47760:47771 -j ACCEPT
需要注意的是,bro manager流程默認(rèn)使用端口22啟動(dòng)連接并管理一個(gè)worker。worker使用更高的端口號通過SSH連接回manager,因此manager需要向worker開放更高的端口號。否則,您將只能得到單向通信。
十、調(diào)整操作系統(tǒng)緩沖區(qū)
Linux分配一些內(nèi)存(即緩沖區(qū))來存儲(chǔ)等待進(jìn)程讀取的數(shù)據(jù)包。大多數(shù)Linux發(fā)行版的默認(rèn)設(shè)置都不夠。通常發(fā)生的情況是網(wǎng)絡(luò)流量可能會(huì)有大的突發(fā)。擁有更大緩沖區(qū)的另一個(gè)原因是,用于短實(shí)例的計(jì)算機(jī)有時(shí)可能無法跟上傳入的流量。這可能是由于某些類型的分析需要更多的時(shí)間。我希望有足夠的內(nèi)存來接收短時(shí)間的突發(fā)事件,并在處理上給我一些靈活的空間。
遵循h(huán)ttp://dak1n1.com/blog/7-performance-tuning-intel-10gbe/上的方法2可以很好地調(diào)整這些設(shè)置。當(dāng)加載PF_Ring驅(qū)動(dòng)程序時(shí),我們已經(jīng)處理了irqbalance的介紹。它也包括cpuspeed,但是我沒有看到有什么不同。方法1是用來傳輸數(shù)據(jù)的,我不需要擔(dān)心這個(gè)。第三種方法是榨出最后一點(diǎn)果汁,但是我還沒有看到令人驚訝的結(jié)果。
這就完成了安裝Bro IDS之前所需的先決條件。這是指南中4部分的第1部分。繼續(xù)第2部分,編譯和安裝Bro。