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模式)

 

 Snort搭建教程——Snort 2.9.9.x on Ubuntu 14 and 16

 

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

 

Snort搭建教程——Snort 2.9.9.x on Ubuntu 14 and 16

上一篇:shell命令


下一篇:Linux(3)-vim编辑器