从源码打造Snort+barnyard2+BASE可视化报警平台(一)

晨光

 关键词

  • 背景

一、准备工作

手动编译安装Snort时所需的准备工作如下所示。

步骤 1.准备软件环境。在安装前,必须在交换机上设置SPAN。中高端Cisco交换机都有SPAN功能。SPAN须为一个专用端口。以下是在虚拟机环境下的实验,须把网卡设置为混杂模式。

步骤2.安装最新版VMware Workstations虚拟机,并准备SSH远程连接 工具(SecureCRT 或者Xshell)。

步骤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.yNETMASK=255.255.255.0GATEWAY=192.168.x.zDNS1=192.168.x.zDNS2=8.8.8.8 //DNS地址可以多个,要根据当地网络供应商进行添加

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

步骤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 libxml2 libpcap pcre* 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

#make && make install

● 安装Snort 2.9(安装Snort前一定要正确安装libdnet和DAQ)。

#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组,并且不允许登录系统

步骤4.新建目录/var/log/snort并设置其属主和属组。#mkdir /var/log/snort#chown –R snort:snort /var/log/snort

步骤5.配置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 .此步骤很关键,解压到当前目录

#cp /etc/snort/etc/sid-msg.map /etc/snort

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

● 设置目录/etc/snort及其下所有文件的属主和属组。#cd /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.conf中的变量在snort.conf配置文件中有很多变量和选择,这些变量作用于rules目录下的所有规则。作为初学者需要掌握最重要的两个分别是:

如果当前网段还有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,也没有问题。

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

第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

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

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

以上几处修改完成后,保存退出。

步骤6.新建目录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

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

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

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

加入如下内容:alert icmp any any -> $HOME_NET any (msg:"ICMP Packet Detected";sid:1000003;rev:1;)

保存退出,我们就完成了第一条检测规则的编写。

步骤9.测试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 113Set 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-teamCopyright (C) 1998-2012 Sourcefire, Inc., et al.Using libpcap version 1.1.1Using PCRE version: 8.02 2010-03-19Using ZLIB version: 1.2.3.4Rules 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!”的提示,则表示安装配置成功。

步骤10.用ping命令测试。用ping命令进行测试的目的是为了产生报警。ping命令使用ICMP协议,在IDS中使用libpcap函数所捕获的也是ICMP数据包。

下面在Snort主机上操作:#snort -i eth0 -c /etc/snort/snort.conf -A fast

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

  1. timestamp时间戳
  2. 报警消息
  3. 源/目的IP地址
  4. 端口

与此同时,日志文件记录在/var/log/snort/alert和/var/log/snort/snort.log中。可用下面的命令查看。#cd /var/log/snort/#tail -f /var/log/snort/alert

实例:可以看到这些都是文本文件。

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

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

ERROR:parser.c(5047)

未完待续!