Snort搭建教程——Snort 2.9.9.x on Ubuntu 14 and 16
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