zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    多线程-死锁代码示例
    区块链技术:以太方学习文档
    svn 不能校验路径“XXX”的锁;没有匹配的可用锁令牌 故障解决方法
    Oracle ORA-27102的解决办法(out of memory)
    Linux常用命令语法+示例
    Java如何实现form表单提交的数据自动对应实体类(源码)
    Java分布式锁看这篇就够了
    quartz时间配置
    volatile 实现原理
    == 和 equals()的区别
  • 原文地址:https://www.cnblogs.com/taoyuanming/p/12722263.html
Copyright © 2011-2022 走看看