来源:https://dallinwarne.com/networking/getting-started-with-bro-intrusion-detection-system-ids/
如果您拥有计算机网络,那么您需要确保入侵检测系统(IDS)是您网络安全策略的一部分。监控网络流量的价值远远超过入侵的成本。虽然大多数IDS系统都是商业的,但是也有一些开源的IDS解决方案。
Snort和Suricata是流行的开源防火墙/IDS解决方案,但也有一些缺点。对于小型企业来说,它们可能工作得很好,但对于中型或大型网络,它们可以带来更多的工作,而带来更少的价值。目前它们的主要缺点是,支持Snort/ suricata的设备不能与网络上其他支持Snort的设备通信,也不能集中管理它们。随着网络攻击变得越来越复杂,一个具有安全意识的组织需要更好的解决方案。
这里是开放源码IDS游戏的第三个主要参与者。Bro网络安全监视器最初是由高等教育开发的,它提供了一个网络协议分析器和一个安全工具。它的优点是能够跨网络上多个Bro设备关联流量,并添加额外的和可定制的插件。换句话说,与其在你的网络上有多个独立的IDS盒,你还可以有一个集群系统把信息通过网络连接起来。
Bro的缺点是比较高级,需要一些耐心来为初学者进行设置。本介绍指南旨在帮助您消除一些痛苦,并概述您可以采取的步骤来构建自己的Bro集群。请记住,根据操作系统和设置的不同,有些步骤可能有所不同。
一、系统规格:
操作系统:红帽Linux 7
Manager服务器:8 CPU, 32 GB RAM, 1 TB硬盘,带有一个大的日志分区。
工作人员:12个物理超线程cpu, 96GB RAM, 120gb SSD, 10gbps Intel X710 NIC
网络信息:我将要测试的网络总流量超过1Gbps (Tx和Rx),因此在worker中有10gbps的NIC。这是一个典型的网络,它的网页浏览量很大,但也使用许多其他应用程序。正如在典型的网络中看到的那样,它也具有微突发。
二、大视图
首先,我将告诉您我是如何安装Bro的先决条件和准备操作系统的。接下来,我将编译Bro并安装它以及一些所需的Bro插件。第三,我将介绍故障诊断、调优和调整。最后,我要讲的是Elasticsearch的整合。逻辑图和物理图显示了本系列文章最后的架构。
三、Bro先决条件
首先,我建议为Bro生成的日志和文件设置一个单独的分区。系统管理员可以相应地对磁盘进行分区,或者为您提供一些附加的存储。你不需要这样做,但是要知道如果你的日志填满了根分区,那么Bro就会崩溃,操作系统就会变得不稳定。
为了安装Bro,需要安装所有的先决条件。其中包括:
(1)C++ Actor 框架
(2)LibGeoIP 数据库
(3)Gperftools
(4)Ipsumdump
(5)PF_RING (吞吐量超过1Gbps时需要)
(6)其它一些东西
四、其它一些东西
有几个包可以通过yum安装。只需从CLI运行以下命令:
sudo yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python-devel swig zlib-devel
检查输出中的错误。如果yum无法找到一个包,您可能需要启用一个额外的存储库: 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地址。如果您打算稍后将日志发送到Elasticsearch或Splunk,您可能可以跳过这一步,让它们处理GeoIP特性。如果您想让Bro这样做,请记住,必须在集群中的所有工人和管理人员之间一致地安装它,并定期进行更新。
安装、运行:sudo yum install GeoIP-devel
要提供更精确的位置(如按城市),请运行这些命令下载和安装数据库。
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转储文件总结为一种便于人类和程序阅读的自描述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不一定附带标准存储库。你必须为它找到另一个rpm。只要确保操作系统版本和存储库版本匹配即可。
yum install gperftools-lib
前面的命令安装库,但是您仍然需要开发包。
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
当网络吞吐量超过1gbps时,默认的Linux驱动程序是一个糟糕的选择。要充分利用10gbps网卡,需要一个第三方驱动程序。如果您的worker处理的内存小于1Gbps,那么您可能可以跳到本指南后面的“编译Bro”一节。
Ntop提供了一个名为PF_RING Vanilla的免费驱动程序,以及一个名为PF_RING- zc的付费版本。ZC应该提供更好的性能,因为它不像默认内核或PF_RING Vanilla那样复制包。其他替代方案包括AF_PACKET、NetMap和Myricom。后者与Myricom nic合作,而其他大部分与Intel nic合作。目前还无法对每一个进行比较。目前,我将重点介绍PF_RING Vanilla,因为它比较流行。
就像其他先决条件一样,PF_Ring库需要安装在一个跨所有工作人员和管理人员一致的目录中。如果PF_Ring库已经安装在默认安装位置(通常是/usr/local),则在继续之前删除它。在编译Bro时,编译器可能会找到默认实例,而不是您在configure命令中指定的实例。
PF_Ring版本可能有所不同,您可能会选择更通用的名称。此外,尽管驱动程序的目录在其名称中有“ZC”,但是除非您有许可证并正确设置它,否则您实际上不会使用ZC特性。
我喜欢在目录的名称中包含PF_Ring的版本号。虽然我是从6.5版开始的,但是6.6版是在发布本文之前发布的。
我使用的是i40e驱动程序,它的通用性不如其他驱动程序。我听说ixgbe虽然可能更老,但在环形插槽等设置上允许更大的灵活性和调整。
#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
加载驱动程序的脚本需要修改以优化NIC和OS设置。
vim load_driver.sh
由于此NIC仅用于接收通信量,而不用于传输数据包,因此,我修改了行insmod . . / . / . / . / . / . /kernel/ pf_ring.ko
insmod ../../../../../kernel/pf_ring.ko enable_tx_capture=0
由于Red Hat没有“killall”命令,我将“killall irqbalance”行替换为
pkill irqbalance
“NIC队列”指定想要NIC发送中断的cpu数量。对于i40e驱动程序,如果组合
Ethtool -L $IF combined 23
我修改的其他设置:
ethtool -K $IF rxvlan off txvlan off
接下来要修改的这一行对Bro的性能非常重要。Bro会计算哈希值,如果它从NIC接收到哈希值,就有点疯狂了。我们关闭这些设置的NIC的行:
ethtool -K $IF rxhash off tx off rx off
我修改的最后一行是从512到1024的HUGEPAGES_NUM变量。看起来无论我选择的数字是多少,操作系统只会分配一半的请求页面。
保存脚本并退出VIM之后,我通过运行加载驱动程序:
./load_driver.sh
通过运行下面的ethtool命令来验证你的网卡设置:
ethtool -k em1
ethtool -c em1
ethtool -G em1
PF_RING提供了一些与驱动程序一起使用的基本工具。虽然这些对于Bro来说不是必需的,但是在故障排除时它们是有帮助的。运行make编译PF_RING/userland/示例。一个简单的测试工具是pfcount,它提供有关NIC的统计信息,包括吞吐量以及在读取之前在NIC上丢弃了多少数据包。
./pfcount -I em1
如果您没有看到丢弃的数据包和吞吐量,那么您应该已经准备好了。为您的特定操作系统、网卡和驱动程序优化这些设置可能需要时间和耐心,以及一些反复试验。
九、操作系统准备
我需要准备操作系统来与集群中的其他worker进行通信。这包括调整iptables(或系统的防火墙设置)和分发SSH密钥。我不会详细介绍这些设置,因为它们与您的系统设置高度相关,而且已经有了一些很好的指南。我将在IP表中注意到,可能很难预测Bro manager和worker需要相互开放哪些端口。一开始可能更容易将所有端口相互打开,然后当您有工作要锁定哪些端口实际上是打开的。例如,这个iptable规则打开了管理器上Bro通常使用的端口范围。
iptables -A IN_public_allow -s 10.1.0.10 -p tcp --dport 47760:47771 -j ACCEPT
需要注意的是,bro manager流程默认使用端口22启动连接并管理一个worker。worker使用更高的端口号通过SSH连接回manager,因此manager需要向worker开放更高的端口号。否则,您将只能得到单向通信。
十、调整操作系统缓冲区
Linux分配一些内存(即缓冲区)来存储等待进程读取的数据包。大多数Linux发行版的默认设置都不够。通常发生的情况是网络流量可能会有大的突发。拥有更大缓冲区的另一个原因是,用于短实例的计算机有时可能无法跟上传入的流量。这可能是由于某些类型的分析需要更多的时间。我希望有足够的内存来接收短时间的突发事件,并在处理上给我一些灵活的空间。
遵循http://dak1n1.com/blog/7-performance-tuning-intel-10gbe/上的方法2可以很好地调整这些设置。当加载PF_Ring驱动程序时,我们已经处理了irqbalance的介绍。它也包括cpuspeed,但是我没有看到有什么不同。方法1是用来传输数据的,我不需要担心这个。第三种方法是榨出最后一点果汁,但是我还没有看到令人惊讶的结果。
这就完成了安装Bro IDS之前所需的先决条件。这是指南中4部分的第1部分。继续第2部分,编译和安装Bro。