关键词

  • Snort:轻量级的开源IDS系统。

  • Acid(Analysis Console for Intrusion Databases) ***数据库分析控制台,它是一个基于PHP的分析引擎,可以搜索和处理snort具所生成的安全事件数据库。

  • BASE(Basic Analysis and Security Engine)直译为基本安全分析引擎,它用来查看Snort IDS告警的Web应用程序,是Acid的升级版。

  • Barnyard2 用来将Snort发出的告警事件存入数据库。

    背景

    大家在安装基于Snort NIDS系统, 感觉很难,总是出错,其他安装Snort并不难,难的是准备工作做得不充分,如配置不当,当设置Snort的可视化报警时会遇到各种问题,例如:

  • 为什么Snort编译总报错?
  • 为什么启动Snort后会立刻退出?
  • 为什么新添加的snort规则,不能展现在BASE控制台?
  • Snort不报警怎么办?
  • MySQL数据库里无法存储Snort报警怎么办?
  • 浏览器打开ACID,里面一片空白怎么办?
    看着别人安装成功了,我却怎么也装不上?真是折磨人呐!下面我们看看应对这些问题的方法。

一、准备工作

手动编译安装Snort时所需的准备工作如下所示。
步骤 1.准备软件环境。在安装前,必须在交换机上设置SPAN。中高端Cisco交换机都有SPAN功能。SPAN须为一个专用端口。以下是在虚拟机环境下的实验,须把网卡设置为混杂模式。
步骤2.安装最新版VMware Workstations虚拟机,并准备远程连接 工具。
步骤3.到异步社区的本书页面中统一获取安装资源。
步骤4.使用镜像CentOS-6.8-x86_64-mini在虚拟机中安装操作系统。
步骤5.重启系统后设置系统IP、网关及DNS,更新系统。
默认安装时,网络IP是自动获取的,需要改成静态IP地址。
#ifconfig -a //查看网卡配置信息
#vi /etc/sysconfig/network-scripts/ifcfg-eth0 //编辑网卡配置文件
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:0C:29:BA:53:4E"
IPV6INIT="yes"
NM_CO***OLLED="yes" //由于敏感词被限制此出为星号。
ONBOOT="yes"
TYPE="Ethernet"
UUID="685d0725-02ab-41b9-b9bf-6a52fc68c0f8"

修改为静态IP地址的方法是将BOOTPROTO="dhcp"中的"dhcp"改为"static",然后增加以下内容(根据内网环境配置IP):
IPADDR=192.168.x.y
NETMASK=255.255.255.0
GATEWAY=192.168.x.z
DNS1=192.168.x.z
DNS2=8.8.8.8 //DNS地址可以多个,要根据当地网络供应商进行添加

最后保存退出,重启网络服务。

更新系统
#yum -y update //升级时间较长

步骤6.复制软件到指定目录。
将libdnet-1.12.tgz、daq-2.0.4.tar.gz、snort-2.9.7.0.tar.gz、snortrules-snapshot-2970.tar.gz这4个文件复制到CentOS 6.8系统/usr/local/src/目录下。
经过以上6个步骤之后,Snort安装的准备工作完成。另外,Snort安装配置路线图参见《开源安全运维平台OSSIM疑难解析:提高篇》一书中附录中的图1、图2。网络安装包名称及用途参见附录中的表1、表2、表3,这三张表以及按照路线图可以让初学者清晰的完成本文所介绍的各项试验。

二、编译并安装Snort

准备工作完成之后,接着开始正式安装Snort。编译安装Snort需要如下10个步骤。
步骤1.安装基本环境和依赖包。
#yum install -y gcc gcc-c++ flex bison zlib-devel zlib-static libxml2 libpcap pcre-devel pcre-static libpcap-devel.x8664 tcpdump git libtool curl man make

注意,如果没有安装pcre,在预编译时就会出现以下问题,比如我们执行./configure时,报错提示如下:
ERROR! Libpcre library not found, go get it from http://www.pcre.org

步骤2.解压libdnet、DAQ及Snort安装包。
在服务器的安装配置过程中,大家很可能会到官网下载最新版本的源码包,但是那样就会遇到各种依赖包缺失的问题,导致无法安装成功。因为有些软件(比如Snort)要在DAQ(Data AcQuisition,数据采集器)library安装好之后才能继续安装,而只有先libdnet安装完成,才能继续安装DAQ,否则会报错找不到依赖文件,具体操作如下:
#cd /usr/local/src
#tar -zxvf libdnet-1.12.tgz
#tar -zxvf daq-2.0.4.tar.gz
#tar -zxvf snort-2.9.7.0.tar.gz

下面必须依次安装libdnet、DAQ和Snort这3个包。
● 安装libdnet-1.12.tgz。
#cd /usr/local/src/libdnet-1.12/
#./configure
#make && make install

● 安装DAQ。
#cd daq-2.0.4
#./configure

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
编译环境检查完成之后,我们可以看到AFPacket DAQ module,Dump DAQ module,IPFW DAQ module,PCAP DAQ module的状态都是“yes”只有这样才能继续编译软件包。

#make && make install

● 安装Snort 2.9(安装Snort前一定要正确安装libdnet和DAQ以及zlib)。
#cd /usr/local/src/snort-2.9.7.0
#./configure --enable-sourcefire
#make && make install
编译过程中没有报错信息即可进行安装。

步骤3.添加用户和组。
创建用户和组,并设置权限。在root身份下解包的文件权限都与root有关,所以要修改成Snort用户的属主和相关权限。
#groupadd -g 40000 snort //新添加一个Snort组
#useradd snort -u 40000 -d /var/log/snort -s /sbin/nologin -c SNORT_IDS -g snort
//将Snort用户加入Snort组,新建目录/var/log/snort,并且不允许登录系统

步骤4.配置Snort。
● 新建目录/etc/snort/。
#mkdir /etc/snort/

● 将snortrules-snapshot-2970.tar.gz解压到/etc/snort/目录下。
#cd /etc/snort
# tar –zxvf /usr/local/src/snortrules-snapshot-2970.tar.gz –C .(此步骤很关键,解压到当前目录)
完成此命令之后会在/etc/snort/目录下生成etc 、preproc_rules 、rules、so_rules共4个目录。
#cp /etc/snort/etc/sid-msg.map /etc/snort

● 将下载的Snort压缩包(snort-2.9.7.0.tar.gz),解压缩后复制到/etc/snort/目录下。
#cd /etc/snort/
#cp /usr/local/src/snort-2.9.7.0/etc/* .

● 设置目录/etc/snort及其下所有文件的属主和属组。

#chown -R snort:snort *

● 新建黑白名单规则文件。
#touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules

在/etc/snort/rules下新建white_list.rules和black_list.rules两个文件。
● 编辑配置文件snort.conf,修改以下几行的内容。
#vi /etc/snort/snort.conf

官方的snort.conf配置文件注解中包含9个步骤
手动打造Snort+barnyard2+BASE可视化报警平台
为了加深大家对这个文件的理解,下面我们会对几个重要概念和主要步骤进行讲解。

配置Snort.conf中的变量
在snort.conf配置文件中有很多变量和选择,这些变量作用于rules目录下的所有规则。作为初学者需要掌握最重要的两个分别是:

  • $HOME_NET:你想监控的网络(用CIDR格式表示)。
  • $EXTERNAL_NET:连接外部,不受信任的网络。
  • 这两个变量的默认值都是“any”,简单理解就是“默认监控一切”。但是我们需要进行适当修改,下面我们来设置网络变量,首将第45行的ipvar HOME_NET any改为ipvar HOME_NET 192.168.x.x网段,并写成CIDR格式。也可以添加多个网段,本实验中监控网段为192.168.11.0/24,来看下面的例子。
    ipvar HOME_NET [192.168.11.0/24] //如果不加限制,网段地址也可以改为"any"
    将48行ipvar EXTERNAL_NET any 改为 ipvar EXTERNAL_NET $HOME_NET

如果当前网段还有DNS、SMTP、HTTP、SQLServer、SSH服务,我们推荐用如下方法定义变量。

ipvar DNS_SERVERS $HOME_NET
ipvar SMTP_SERVERS $HOME_NET
ipvar HTTP_SERVERS $HOME_NET
ipvar SQL_SERVERS $HOME_NET
ipvar SNMP_SERVERS $HOME_NET
ipvar SSH_SERVERS $HOME_NET
...

注意: 对于修改$HOME_NET、$EXTERNAL_NET变量为非必须项,对于初学者而言,不修改沿用原默认值any也可以。

但下面的相对规则路径就必须改成绝对路径了,否则启动snort时会报错。

第104行 var RULE_PATH ../ruls 改为 var RULE_PATH /etc/snort/rules
第105行 var SO_RULE_PATH ../so_rules 改为var SO_RULE_PATH /etc/snort/so_rules
第106行 var PREPROC_RULE_PATH ../preproc_rules 改为 var PREPROC_RULE_PATH/etc/snort/ preproc_rules
第113行 var WHITE_LIST_PATH ../rules 改为 var WHITE_LIST_PATH /etc/snort/rules
第114行 var BLACK_LIST_PATH ../rules 改为 var BLACK_LIST_PATH /etc/snort/rules

● 设置日志保存路径。
第186行 config logdir:/var/log/snort/

● 配置输出插件。
Snort可通过数据库插件(spo_database.c和spo_database.h)将预处理器输出的日志写入数据库,但下面的配置一方面将报警写入alert文件,另一方面将预处理器输出的日志写入到unified2格式的二进制文件中,以供Barnyard2读取使用。
将第521行修改成如下内容:
output unified2:filename snort.log,limit 128

以上几处修改完成后,保存退出,对snort.conf配置文件的修改告一段落。

步骤5.新建目录snort_dynamicrules并设置属主和属组权限。
#mkdir -p /usr/local/lib/snort_dynamicrules
#chown -R snort:snort /usr/local/lib/snort_dynamicrules
#chmod -R 755 /usr/local/lib/snort_dynamicrules

步骤6.在/usr/sbin/目录下新建名为Snort的软链接文件。
#cd /usr/sbin
#ln -s /usr/local/bin/snort snort

步骤7.添加测试规则。
我们在安装Snort时已经复制了很多规则文件,但这些文件内的规则默认都被注销了,先不要管这些注销的规则,下面我们来写一条规则。

#vi /etc/snort/rules/local.rules

加入如下内容:
alert icmp any any -> $HOME_NET any (msg:"ICMP Packet Detected";sid:1000003;rev:1;)
保存退出,我们就完成了第一条检测规则的编写。

步骤8.测试Snort。
#snort -T -i eth0 -u snort -g snort -c /etc/snort/snort.conf

注意:这里的参数“-T”表示测试完成之后即退出snort程序。

如果配置正确,则系统启动后显示如下内容。
pcap DAQ configured to passive.
Acquiring network traffic from "eth0".
Set gid to 113
Set uid to 109
--== Initialization Complete ==--
,,_ -> Snort! <-
o" )~ Version 2.9.3.1 IPv6 GRE (Build 40)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-team
Copyright (C) 1998-2012 Sourcefire, Inc., et al.
Using libpcap version 1.1.1
Using PCRE version: 8.02 2010-03-19
Using ZLIB version: 1.2.3.4
Rules Engine: SF_SNORT_DETECTION_ENGINE Version 1.16 <Build 18>
Preprocessor Object: SF_GTP (IPV6) Version 1.1 <Build 1>
Preprocessor Object: SF_SIP (IPV6) Version 1.1 <Build 1>
Preprocessor Object: SF_SMTP (IPV6) Version 1.1 <Build 9>
Preprocessor Object: SF_IMAP (IPV6) Version 1.0 <Build 1>
Preprocessor Object: SF_DNS (IPV6) Version 1.1 <Build 4>
Preprocessor Object: SF_REPUTATION (IPV6) Version 1.1 <Build 1>
Preprocessor Object: SF_DCERPC2 (IPV6) Version 1.0 <Build 3>
Preprocessor Object: SF_MODBUS (IPV6) Version 1.1 <Build 1>
Preprocessor Object: SF_SSH (IPV6) Version 1.1 <Build 3>
Preprocessor Object: SF_SDF (IPV6) Version 1.1 <Build 1>
Preprocessor Object: SF_POP (IPV6) Version 1.0 <Build 1>
Preprocessor Object: SF_SSLPP (IPV6) Version 1.1 <Build 4>
Preprocessor Object: SF_FTPTELNET (IPV6) Version 1.2 <Build 13>
Preprocessor Object: SF_DNP3 (IPV6) Version 1.1 <Build 1>
Snort successfully validated the configuration!
... ...
按下Ctrl+C组合键可以退出当前程序。
Snort exiting

如出现“Snort successfully validated the configuration!”的提示,则表示安装配置成功。

步骤9.用ping命令测试。
用ping命令进行测试的目的是为了让snort产生报警。ping命令使用ICMP协议,在IDS中使用libpcap函数所捕获的也是ICMP数据包。下面在Snort主机上操作:
#snort -i eth0 -c /etc/snort/snort.conf -A fast

Tips:以上命令中-A fast的含义如下。
-A fast含义:该参数报警信息包括以下内容:

  • timestamp时间戳
  • 报警消息
  • 源/目的IP地址
  • 端口

输入上面的命令之后,报警记录在/var/log/snort/alert和/var/log/snort/snort.log.timestamp(这是一个存储数据包的二进制文件,用tail命令无法读取)中。用下面的命令直观查看alert报警。
#cd /var/log/snort/
#tail -f /var/log/snort/alert //查看报警

实例:
手动打造Snort+barnyard2+BASE可视化报警平台
可以看到这些都是文本文件。

alert文件收到报警,代表这一步实验成功,如果收不到报警,请大家返回到第一步重新检查。实验步骤环环相扣,每个关键节点必须成功,下面要将这些报警存储到数据库。

注意:在上面介绍的第6、7步骤中如果没有设置正确的路径,那么在启动Snort时,就会出现找不到动态规则的文件,发生致命错误导致程序异常退出。
ERROR:parser.c(5047)

加深理解:我们说理解/etc/snort/sid-msg.map这个文件的意义非常重要,实体signature表示的是报警信息列表规范化,即将报警事件信息按规则编号(sig_id)、规则描述(sig_name)、规则分类编号(sig_class_id)规则优先级(sig_priority)规则版本号(sig_rev),规则在snort中的内部编号(sig_sid;sig-gid)进行规范化存储。其中的sig_class_id和sig_prority的具体内容包含在classification.config文件中;而sid_sid和sid_gid将文件/etc/snort/gen-msg.map中的一个消息和该snort规则建立一个映射关系。
做为基础用户我们需要了解 snort将1-1000000做为自己的保留的内部编号,而将大于1000000 de 编号供使用者自己使用。这是一种习惯,而非强制,所以我们自己编写规则时,需要在sid-msg.map添加自己的规则编号和消息。里面实体sig_reference、sig_class是对他其中sig_id和sig_class_id属性的扩展描述。

三、将Snort报警存入MySQL数据库

将Snort报警存入MySQL数据库需要如下几个步骤。
步骤1.安装MySQL数据库及PHP扩展。
#yum install -y mysql-server mysql-devel php-mysql php-pear php-gd libtool php-imap php-ldap php-odbc php-xml php-pecl-apc
#chkconfig --level 235 mysqld on //将MySQL服务设置为在运行级别为2、3、5时都是开启状态
#/etc/init.d/mysqld start

步骤2.为数据库管理员root赋予密码(为调试方便暂设定纯数字密码)。
#/usr/bin/mysqladmin -u root password '123456'

注意,root用户登录phpMyAdmin时,同样使用这个密码。
步骤3.创建Snort数据库并设定读取权限。

#mysql -u root -p //连接MySQL
输入步骤2中设置的密码“123456”。

mysql>CREATE DATABASE snort; //新建数据库

mysql>USE snort;

mysql>CREATE USER 'snort'@'localhost' IDENTIFIED BY '123456';

在以上命令中,“123456”是MySQL中用户Snort的密码。
接着创建名为snort、密码为“123456”的数据库用户,并赋予名为“snort”的数据库权限
在进行下面的操作之前,先将barnyard2-1.9.tar.gz解压到/usr/local/src/

下面授权用户snort对数据库的操作权限
mysql>GRANT CREATE,SELECT,UPDATE,INSERT,DELETE ON snort.* TO snort@localhost IDENTIFIED BY '123456';

mysql>SET PASSWORD FOR 'snort'@'localhost'=PASSWORD('123456'); //为用户snort设置访问密码

mysql>SOURCE /usr/local/src/barnyard2-1.9/schemas/create_mysql; //通过引入文件create_mysql来创建数据库结构,该命令不可重复输入,在后面的安装BASE步骤中还会在snort库中写入多个表。
该命令执行成功之后大家会看到下列提示信息:
Query OK, 0 rows affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)

执行完create_mysql脚本后,用户可以通过在mysql提示符下,运行下面的SQL语句来验证配置的正确性。
mysql> SHOW TABLES;
+------------------+
| Tables_in_snort |
+------------------+
| data |
| detail |
| encoding |
| event |
| icmphdr |
| iphdr |
| opt |
| reference |
| reference_system |
| schema |
| sensor |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+------------------+
16 rows in set (0.00 sec)

mysql>FLUSH PRIVILEGES; //刷新数据库权限

mysql>exit

注意:在导入barnyard2-1.9中的mysql数据库表时所在路径使用绝对路径。

步骤4.安装和配置Barnyard2。
Barnyard2的作用是读取Snort产生的二进制事件文件(/var/log/snort/snort.log.XXXXXXXXXX)并存储到MySQL中。Snort的配置文件自身含有插件,它允许将Snort报警记录到MySQL中,但这样一来,系统数据会激增。当IDS系统检测到***行为时,它会用INSERT语句向数据库中写入数据,导致更新非常慢。所以如果直接将Snort输出到数据库,在数据量增大时这种方案的效率并不高,故使用外部代理将报警输出到Barnyard2。
●源码包安装。
我们再次进入barnyard2-1.9/目录
#cd /usr/local/src/barnyard2-1.9/
#./configure --with-mysql --with-mysql-libraries=/usr/lib64/mysql //此处配置参数很重要,切勿出错
手动打造Snort+barnyard2+BASE可视化报警平台
#make //见到如下内容后,才可继续安装
手动打造Snort+barnyard2+BASE可视化报警平台
只有确保上面关键两步不出错,才能继续安装。如果报错,需要根据提示查找错误原因,如忽略错误,继续往下做都是徒劳的。
#make install

● 配置Barnyard2。
首先在/var/log/中创建目录Barnyard2和文件barnyard2.waldo。
#mkdir /var/log/barnyard2
#touch /var/log/snort/barnyard2.waldo

● 设置文件barnyard2.waldo的属主和属组。
#chown snort:snort /var/log/snort/barnyard2.waldo

● 复制Barnyard2的配置文件。
与Snort配置类似,Barnyard的初始化配置也是通过复制已有的.conf配置文件来完成。因此先将Barnyard2的配置模板文件复制到/etc/snort目录下。
#cp /usr/local/src/barnyard2-1.9/etc/barnyard2.conf /etc/snort

● 修改配置文件barnyard2.conf。
#vi /etc/snort/barnyard2.conf

找到对应行并将其修改成如下内容:
第44行 config logdir:/var/log/barnyard2 //注意该目录属主和属组权限为snort.snort,如设置错误会导致实验失败。
第56行 config hostname: localhost
第57行 config interface: eth0
第131行 config waldo_file:/var/log/snort/barnyard2.waldo

下面这条语句用来设置数据库访问权限,其中定义了用户名为snort,密码为123456,数据库名称为snort,主机名为localhost。
第318行 output database: log,mysql,user=snort password=123456 dbname=snort host=localhost

编辑完成后保存退出。至此对barnyard2.conf文件的修改到此结束。
● 修改目录的属主和属组。
#chown snort:snort /var/log/barnyard2

● 启动Snort和Barnyard2进行联合测试
#snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0 –D
手动打造Snort+barnyard2+BASE可视化报警平台

执行完这条命令之后,不会看到大量输出,只会出现以下三行提示信息:
Spawning daemon child...
My daemon child 12903 lives...
Daemon parent exiting (0)
Snort程序安静的在后台运行(“-D”参数表示以后台进程运行)。

● 测试Barnyard2。
下面执行的这条命令用于测试Barnyard2程序是否能正常执行。
#barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f snort.log -w /var/log/snort/barnyard2.waldo -g snort -u snort -T
该命令产生输出信息如下:
Running in Test mode

    --== Initializing Barnyard2 ==--

Initializing Input Plugins!
Initializing Output Plugins!
Parsing config file "/etc/snort/barnyard2.conf"
database: compiled support for (mysql)
database: configured to use mysql
database: schema version = 107
database: host = localhost
database: user = snort
database: database name = snort
database: sensor name = localhost:NULL
database: sensor id = 1
database: sensor cid = 1
database: data encoding = hex
database: detail level = full
database: ignore_bpf = no
database: using the "log" facility

    --== Initialization Complete ==--

__ -> Barnyard2 <-
/ ,,_ \ Version 2.1.9 (Build 263)
|o" )~| By the SecurixLive.com Team: http://www.securixlive.com/about.php

  • '''' + (C) Copyright 2008-2010 SecurixLive.

       Snort by Martin Roesch & The Snort Team: http://www.snort.org/team.html
       (C) Copyright 1998-2007 Sourcefire Inc., et al.

Barnyard2 successfully loaded configuration file!
Snort exiting
database: Closing connection to database "snort"

如果大家的机器也出现上述信息,说明程序可以正常运行,此时我们才能继续下面的操作。

同样ping主机,开始正式启动barnyard2程序,继续执行以下命令。
#barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f snort.log –w /var/log/snort/barnyard2.waldo
手动打造Snort+barnyard2+BASE可视化报警平台
命令参数的解释如下所示。
● -c:该选项指定Barnyard配置文件的路径。该参数为必选项。

● -d:指定Unified格式文件的路径,这里指定为/var/log/snort/,所有Unified文件必须放在该目录下。该参数为必选项。

● -f:该选项指定Barnyard以连续方式运行时的Unified文件名。Snort在每次生成的Snort Unified文件后面都加了一个UNIX时间戳,去掉时间戳后缀就是文件名。
根据上面命令执行结果会在/var/log/snort/目录下生成如下报警文件:
手动打造Snort+barnyard2+BASE可视化报警平台
大家可以看到报警文件格式都是snort.log.时间戳。而为什么格式必须是snort.log.XXXXXXX呢?我们在配置snort.conf的第五步曾经配置过一行语句:
output unified2:filename snort.log,limit 128
这里定义了输出报警文件的格式,假如你想把snort.log.XXXXX,改成unified2.alert.XXXXX,请按照下面语句修改:
output unified2:filename unified2.alert,limit 128
与此同时 -f参数后面就要跟 unified2.alert,而不是snort.log啦,这里要注意一一对应的关系。

● -w:该选项打开检验功能,告诉Barnyard检验文件名(也称为waldo文件)。该文件用于记录文件中最近处理的报警。如果不使用waldo文件,则Barnyard必须完整地载入一个日志文件,该参数的作用是将报警信息传送至***数据库。

如果在以上显示中发现最后一行出现“Waiting for new spool file”,则表示上面的操作成功。在/var/log/snort目录下有一些snort.log+times_stamp的二进制文件,这些文件由Snort输出插件所生成。

步骤5.使用下述命令查询报警信息是否存入数据库。
#mysql -u snort -p -D snort -e "SELECT COUNT(*) FROM event"
Enter password:

实际操作效果如下所示。
手动打造Snort+barnyard2+BASE可视化报警平台
如果在count(*)下方没有数字,则表示报警信息没有存入数据库,那么需要从头检查配置过程。
下面的命令非常重要,再次强调Barnyard2完整启动命令:
[root@localhost ~]# barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f snort.log -w /var/log/snort/barnyard2.waldo -g snort -u snort
Running in Continuous mode
--== Initializing Barnyard2 ==--
Initializing Input Plugins!
Initializing Output Plugins!
Parsing config file "/etc/snort/barnyard2.conf" //配置文件路径
Log directory = /var/log/barnyard2 //日志存储路径
database: compiled support for (mysql)
database: configured to use mysql
database: schema version = 107
database: host = localhost
database: user = snort //启动程序用户为snort
database: database name = snort
database: sensor name = localhost:eth0 //Snort传感器在eth0网卡
database: sensor id = 1
database: sensor cid = 1
database: data encoding = hex
database: detail level = full
database: ignore_bpf = no
database: using the "log" facility

    --== Initialization Complete ==--

__ -> Barnyard2 <-
/ ,,_ \ Version 2.1.9 (Build 263)
|o" )~| By the SecurixLive.com Team: http://www.securixlive.com/about.php

  • '''' + (C) Copyright 2008-2010 SecurixLive.

       Snort by Martin Roesch & The Snort Team: http://www.snort.org/team.html
       (C) Copyright 1998-2007 Sourcefire Inc., et al.

WARNING: Ignoring corrupt/truncated waldofile '/var/log/snort/barnyard2.waldo'
Waiting for new spool file

注意:程序在启动过程中会弹出很多信息,当出现“Waiting for new spool file”字样表示该命令启动成功,如没有,则从该环节的步骤1开始检查。

四 、访问权限设置

如果在一个简单的模拟环境下实验,该步骤可忽略。

假设场景,我只希望某一个IP能访问Snort服务器上的22、80端口,我们在Snort主机上做如下设置。

禁止所有的IP访问Snort服务器的22、80端口。

iptables -I INPUT -p tcp --dport 80 -j DROP

iptables -I INPUT -p tcp --dport 22 -j DROP

允许IP地址为192.168.11.2,访问Snort服务器的80、22端口。
#iptables -I INPUT -s 192.168.11.2 -ptcp --dport 80 -j ACCEPT
#iptables -I INPUT -s 192.168.11.2 -ptcp --dport 22 -j ACCEPT

保存iptables规则
#service iptables save

重启防火墙
#service iptables restart

五、搭建BASE的可视化***检测系统

如果以上3部分中所有环节均正常,说明已经安装了Snort系统并将报警信息存入数据库。接下来开始安装BASE(Basic Analysis and Security Engine,基于ACID构建)的步骤,Barnyard将MySQL中的Snort报警信息通过Web展示的具体原理如图1所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1 Barnyard存储原理
要将存储在数据库中的日志展现在Web端,需要安装BASE(***检测事件展示的前端程序),这里用到的版本是base-1.4.5.tar.gz。既然用到了Web服务,那么首先需要安装好LAMP环境,然后再安装BASE包。此处服务器IP地址为192.168.1.120。具体安装步骤如下。

步骤1.安装httpd、mysql-server、mysql-devel、php、php-mysql。
命令如下所示。
#yum install –y httpd mysql-server php php-mysql mysql-devel php-gd

步骤2.安装PHP插件(mcrypt、libmcrypt、libmcrypt-devel),命令如下所示。
#yum install –y mcrypt libmcrypt libmcrypt-devel php-pear

更新插件的时间比较长,操作如下所示。
#pear upgrade PEAR
手动打造Snort+barnyard2+BASE可视化报警平台

步骤3.继续执行下列命令。
#pear channel-update pear.php.net
手动打造Snort+barnyard2+BASE可视化报警平台

安装 Image_Graph-alpha、Image_Canvas-alpha、Image_Color、Numbers_Roman 这 4个包。
操作如下所示。
#pear channel-update pear.php.net
#pear install Image_Graph-alpha Image_Canvas-alpha Image_Color Numbers_Roman

Tips:Image_graph前身是GraPHPit,它是用于图表操作的包,也是一个开源项目,后来被整合到了Pear之中,被命名为Image_Graph(-alpha是他的版本号),所以它是通过pear命令来完成安装。

如没有正确安装pear之中的这几个软件包,在后面使用BASE控制台的环节中会出现报错画面如下:
手动打造Snort+barnyard2+BASE可视化报警平台

查看已安装包方法如下:
[root@localhost barnyard2-1.9]# pear list
Installed packages, channel pear.php.net:

Package Version State
Archive_Tar 1.4.9 stable
Console_Getopt 1.3.1 stable
Image_Canvas 0.3.5 alpha
Image_Color 1.0.4 stable
Image_Graph 0.8.0 alpha
Numbers_Roman 1.0.2 stable
PEAR 1.9.5 stable
Structures_Graph 1.0.4 stable
XML_RPC 1.5.4 stable
XML_Util 1.2.3 stable

步骤4.安装ADOdb包。
虽然PHP是建构Web系统强有力的工具,但是PHP存取数据库的功能并未标准化,MySQL使用了另一种不同且不兼容的应用程序接口。此时需要使用ADOdb作为中介进行转换。ADOdb的最大优点是不管后端数据库如何,存取数据库的方式都是一致的。目前ADOdb的最新版本是5.20,它支持的数据库种类较多,例如MySQL、PostgreSQL、Oracle等。下面开始安装ADOdb,首先将adodb519.tar.gz解压到/var/www/html/目录下。
# tar zxvf adodb519.tar.gz -C /var/www/html/

解压后发现增加了一个目录adodb5,将这个目录改名为adodb。
#mv /var/www/html/adodb5 /var/www/html/adodb

步骤5.解压BASE包。
[root@localhost src]# pwd
/usr/local/src
#tar zxvf base-1.4.5.tar.gz -C /var/www/html/

解压后发现增加了一个目录base-1.4.5,接着需要对它重命名。
#mv /var/www/html/base-1.4.5/ /var/www/html/base

步骤6.修改PHP配置文件。
#vi /etc/php.ini

将第513行内容改成如下内容。
error_reporting = E_ALL & ~E_NOTICE
修改完毕保存并退出。

注意:对于error_reporting()函数的解释:
error_reporting() 设置 PHP 的报错级别并返回当前级别,错误报告是分级的,下面我们了解一下这个函数错误报告等级。

  • E_ALL - 所有的错误和警告
  • E_ERROR - 致命性运行时错
  • E_WARNING - 运行时警告(非致命性错)
  • E_PARSE - 编译时解析错误
  • E_NOTICE - 运行时提醒(这些经常是是你的代码的BUG引起的。

步骤7.改变/var/www/html/目录的属主和属组权限。
#chown -R apache:apache /var/www/html/

注意:如果该步骤设置不对,有可能在后期配置BASE过程中出现“Config Writeable:No”的错误提示,从而导致无法完成BASE的配置任务。

步骤8.分别重启MySQL和Web服务,最后停止Firewall服务。
#service mysqld restart //启动数据库服务
#service httpd restart //重启Web服务
#service iptables stop //为了调试方便暂时关闭防火墙。

步骤9.在Web界面设置BASE。
首先测试Web,我们打开Apache的页面http://yourip/,看到测试页面之后,开始正式打开BASE的页面。
打开浏览器输入网址http://yourip/base/setup/index.php,输入完毕后弹出安装界面,如图1-7所示。
Tips:yourip表示你的IP地址。

单击Continue按钮,开始选择语言和ADOdb路径,如图1-8所示。
语言项选择中文,ADOdb路径中输入/var/www/html/adodb,单击Continue按钮。接下来输入数据库名称、访问用户名和密码,如图1-9所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-7 开始设置BASE
手动打造Snort+barnyard2+BASE可视化报警平台
图1-8 设置ADOdb路径
手动打造Snort+barnyard2+BASE可视化报警平台
图1-9 设置数据库

这里不需要设置归档数据库,所以在图1-9中,红色大括号所包含的五项内容无需填写。下一步将管理员名称设置为root,密码依然是“123456”,Full Name不必设置,如图1-10所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-10 设置root密码
下一步开始创建BASE表结构,如图1-11、图1-12所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-11 准备创建BASE表结构
Tip:上图中“BASE AG”中的AG表示报警分组Alert Group。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-12 BASE表创建完成
如果看到表acid有创建完成的提示并且BASE tables状态显示为“DONE”,则表示安装完成。单击屏幕最下方的step5…按钮结束安装。在客户机终端命令行中ping主机192.168.1.120,随后就能在BASE界面中收到ICMP报警,如图1-13所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-13 收到报警
如果在Web的BASE界面中收到ICMP报警,则表明BASE安装设置完成。

六 、安装phpMyAdmin(非必选项)

phpMyAdmin是常用的开源数据库管理工具,在这里有助于我们对IDS日志存储进行研究和分析,下面开始安装。
#yum install phpmyadmin
修改配置文件
#vi /etc/httpd/conf.d/phpMyAdmin.conf
注销第24行的Deny from ALL
手动打造Snort+barnyard2+BASE可视化报警平台

重启Web服务
#service httpd restart

打开phpMyAdmin的Web UI
网址:http://yourip/phpmyadmin/
手动打造Snort+barnyard2+BASE可视化报警平台
图14

在Web界面下输入用户名snort,密码为123456
手动打造Snort+barnyard2+BASE可视化报警平台
图15

此时我们可以更加直观的查看报警。
手动打造Snort+barnyard2+BASE可视化报警平台
图16

如何在BASE下删除报警?

如果要删除报警,首先勾选需要删除的报警,然后在“动作”下拉菜单中选择“删除报警”选项,如图1-17所示。
手动打造Snort+barnyard2+BASE可视化报警平台
图1-17 删除报警

注意:在步骤3中需要特别留意Image_Graph的安装情况如果安装报错或者漏装,当你打开BASE界面时会出现无法绘制图象的错误。以上这些错误有很多都是准备工作(安装Snort和PHP组件)做的不充分。

七、开机自动运行脚本

假设Snort服务器中只有一块网卡设备名称为eth0。为让Snort和Barnyard2自动运行,我们需要编写如下SHELL代码(Centos 7需要修改代码,使用yum install psmisc -y命令安装killall):

#!/bin/bash
interface=eth0
case "$1" in
  stat)
    sn=`ps -ef | grep snort | grep -v grep |awk '{print $2}'`
    if [ "${sn}" = "" ]
        then
    echo snort is not runing
        else
    echo snort is running
    fi
  ;;
  start)
    echo "Starting snort"
        barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /var/log/snort/barnyard2.waldo -D 1>/dev/null

        snort -c /etc/snort/snort.conf -i $interface -D 1>/dev/null
  ;;
  stop)
    echo "Stopping snort"
        killall -9 snort barnyard2
  ;;
  restart)
    echo "Stopping snort"
        killall -9 snort barnyard2
    echo "Starting snort"
        barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /var/log/snort/barnyard2.waldo -D 1>/dev/null
        snort -c /etc/snort/snort.conf -i $interface -D 1>/dev/null     
  ;;

    help)
    cat <<HELP
    stop -- stops snort service
   start -- starts snort service
    stat -- displays status of snort service
 restart -- stops and restarts snort
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|stat|help}"
    exit 1
    ;;
esac

exit 0

将以上代码保存在文件/root/idsrun.sh中,赋予可执行权限,为设置自启动服务,我们只需要将下面两行命令加入到/etc/rc.d/rc.local末尾即可。注意rc.local文件需要具有可执行权限。

sh /root/idsrun.sh start
service httpd start

保存退出即可,如果没有执行,请检查是否加入了可执行权限。通常没有可执行权限会导致脚本无法执行。

至此我们已经将Snort安装过程讲解完毕,下面的时间就留给大家反复练习。另外大家网络环境可能各不相同,但操作系统和软件版本最好和本文中介绍的保持一致,实验时需要留意命令之间的大小写,空格,句点,单引号双引号等一些特殊符号的输入,为加深印象所有命令请大家一定要手动输入,不要使用^C ^V。

思考题:

1.为了在OSSIM前端能显示丰富的图形,系统中必须安装( )库,它是一种图形库,可以让PHP绘制各种图形,能够创建Jpg、PNG和BMP图像。
A.Zlib B.GD C.Glibc

2.下列选项中属于HIDS优势的选项包括( ),属于HIDS局限性包括( )。
A.HIDS需要将代理程序部署到要监视的每个主机,部署繁琐。
B.HIDS不能检测网络侦察或扫描
C.HIDS可以检测到***是否成功
D.HIDS监视系统活动
E.HIDS可检测文件或应用程序的变化

  1. 为了提高libpcap处理数据包的效率,OSSIM 2.3平台上采用了基于零拷贝思想的( ) 机制,由于这种机制避免了多次内存复制并减少CPU的干预,故可以在高速网环境下进行数据抓包分析。
    A.PF_RING B.NAPI C.DMA

4.snort规则中由reference选项定义所支持的外部系统,这些网址的内容保存在文件 ( ) 中。
A . /etc/snort/reference.config B /etc/snort/snort.conf C /etc/snort.conf
分析:
使用reference选项表示引用外部链接信息来源,从而为规则提供附加的背景资料,在snort和suricata系统中使用reference.config文件定义引用类型,该文件的名称和存储路径可以在snort.conf和suricata.yaml文件中配置。

  1. 在CentOS 7.0平台里安装Snort和Cent OS6.8有什么不同?

在CentOS 7.x下配置,有些配置习惯会有些不同,在新系统中ip add代替了ifconfig命令,网卡设备名称由eth0变为ens33等,那么在监听网络设备的时候,只要将配置命令中有关网卡的名称用新设备名称替换即可,另外在BASE配置期间,对于CentOS 7及其以上系统强烈建议临时关闭SELinux服务。
整个系统配置过程基本上大同小异,只要你理解了,就可以轻松从Centos 6.x过渡到CentOS 7.x系统。

6.为什么/var/log/snort/alert的大小总是没有变化?
请检查确保执行了snort -i eth0 -c /etc/snort/snort.conf -A fast命令,以及snort的规则已经正确加载。

7.如何在屏幕上输出Snort报警信息?
在屏幕上输出报警信息命令如下:
#snort -A console -u snort -g snort -i eth0 -c /etc/snort/snort.conf

8.用vi编辑器查看,snort生成的unified2格式的数据,为什么都显示乱码?
unified2是snort插件的一种输出方式,可以用来以二进制方式存储报警数据,如果你想手动查看他们,发现无法读取,Unified2这种输出格式并非设计为命令行可以读取的,而是为Barnyard2或者pigsty(Snortby中的小工具)工具使用做准备的。

9.我们在本地添加一条测试规则alert icmp any any -> $HOME_NET any (msg:"ICMP Packet Detected";sid:1000003;rev:1;),其中msg,sid,rev表示什么含义?

msg: 该选项用于规则相关文本的描述,这里设置为ICMP Packet Detected,当我们设置好BASE控制台之后,在页面上最直观展现出来的IDS引擎报警就是这条信息,所以这条信息尽可能详细。

sid: 特征标识符,用来唯一性标记规则。snort中每个规则不能重复,取值范围按如下习惯分布:
0~1000000,为Sourcefire VRT保留。
2000001-2999999 ,用于Emerging Threats (ET规则)
3000000+,为自定义。

rev,表示版本修订,该选项永固表示规则发生了修改,从1开始,数字越大,修订次数越多,每次修订我们不用修改SID,而是修改rev.

10.当重新启动httpd服务时出现下面报错提示,应该如何处理?
#service httpd restart
[root@snort ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for snort.localdomain
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[FAILED]
分析:出现上面的报错提示大家可以先检查/etc/sysconfig/network文件,在该文件中HOSTNAME=localhost.localdomain定义了主机名的原始参数,如果修改了HOSTNAME则会导致上面故障的发送。

11.BASE安装成功之后,想切换界面中/英文显示,要如何操作?

系统安装完成之后,有中文界面想转英文的,有英文想转中文界面 的,下面以英文转中文为例,开始下面的操作。
我们首先进入/var/www/html/base/目录下要找到base_config.php这个配置文件。
将$BASE_Language = 'english';
改为:$BASE_Language = 'simplified_chinese';
修改完成之后,保存退出,还需要重启Web服务,才能生效
#service httpd restart
刷新页面,搞定!

12.出现下面故障页面,最有可能是什么问题造成?
手动打造Snort+barnyard2+BASE可视化报警平台
目录需要加入可写权限,我们可以尝试改变/var/www/html/目录的属主和属组并设置其权限。
#chown –R apache:apache /var/www/html
#chmod -R 755 /var/www/html
为了安全起见,尽量不要给目录设置777权限。

13.Zlib、Libdnet、DAQ、ADOdb这些组件在整个系统中各起到什么作用?
对于这几道问题的解答,大家可以到我的新书中找到。

备注:已经安装好的Snort+barnyard+BASE的试验环境,虚拟机(OVA格式的文件采用最新版Virtual Box虚拟机导入)下载https://pan.baidu.com/s/1dFeMX9n
手动打造Snort+barnyard2+BASE可视化报警平台