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

晨光

本文继续《从源码打造Snort+barnyard2+BASE可视化报警平台之一》的部分继续讲解

上文讲解了两个环节内容。

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

将Snort报警存入MySQL数据库需要如下5个步骤。

步骤1.安装MySQL数据库及PHP扩展。

#yum install -y mysql-server mysql-devel php-mysql php-pear php-gd libtool php-imap php-ldap php-mbstring php-odbc php-pear 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

输入步骤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包)。

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; //该命令不可重复输入

mysql>SHOW TABLES;

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

mysql>exit

注意:先解压barnyard2-2-1.13压缩包;在执行前确保Snort库被选中;barnyard2-2-1.13所在路径要正确(使用绝对路径)。

步骤4.安装和配置Barnyard2。

Barnyard2的作用是读取Snort产生的二进制事件文件(/var/log/snort/snort.log.XXXXXXXXXX)并存储到MySQL中。Snort的配置文件自身含有插件,它允许将Snort报警记录到MySQL中,但这样一来,系统数据会激增。当IDS系统检测到入侵行为时,它会用INSERT语句向数据库中写入数据,导致更新非常慢。

所以如果直接将Snort输出到数据库,在数据量增大时这种方案的效率并不高,故使用外部代理将报警输出到Barnyard2。

●源码包安装。

#cd /usr/local/src/

#tar zxvf barnyard2-1.9.tar.gz

#cd barnyard2-1.9/

#./configure --with-mysql --with-mysql-libraries=/usr/lib64/mysql //此处配置参数很重要,切勿出错

#make //见到如下内容后,才可继续安装只有确保上面关键两步不出错,才能继续安装。如果报错,需要根据提示查找错误原因,如忽略错误,继续往下做都是徒劳的。

#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

编辑完成后保存退出。

● 修改目录的属主和属组。#chown snort:snort /var/log/barnyard2

● 启动Snort和Barnyard2进行联合测试。#snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0 –D

此时不会看到输出结果,因为程序在后台运行(“-D”参数表示以后台进程运行)。

● 测试Barnyard2。

#barnyard2 –c /etc/snort/barnyard2.crnf –d /var/log/snort/-f snort.log –w /var/log/snort/barnyard2 waldo-g snort –u snort -T

同样ping主机,继续执行以下命令。

#barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f snort.log –w /var/log/snort/barnyard2.waldo

命令参数的解释如下所示。

● -c:该选项指定Barnyard配置文件的路径。该参数为必选项。

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

● -f:该选项指定Barnyard以连续方式运行时的Unified文件名。

Snort在每次生成的Snort Unified文件后面都加了一个UNIX时间戳,去掉时间戳后缀就是文件名。根据上面命令执行结果会在/var/log/snort/目录下生成如下报警文件:大家可以看到报警文件格式都是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:

实际操作效果如下所示。

如果在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 = snor

tdatabase: sensor name = localhost:eth0 //Snort传感器在eth0网卡

database: sensor id = 1

database: sensor cid = 1database: data encoding = hexdatabase: detail level = fulldatabase: ignore_bpf = nodatabase: 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

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的可视化入侵检测系统

如果以上4部分中所有环节均正常,说明已经安装了Snort系统并将报警信息存入数据库。

接下来开始安装BASE(Basic Analysis and Security Engine,基于ACID构建)的步骤,Barnyard将MySQL中的Snort报警信息通过Web展示的具体原理如图1所示。

图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、php-mbstring、php-mcrypt。

命令如下所示。

#yum install –y httpd mysql-server php php-mysql php-mbstring php-mcrypt mysql-devel php-gd

步骤2.安装PHP插件(mcrypt、libmcrypt、libmcrypt-devel),命令如下所示。

#yum install –y mcrypt libmcrypt libmcrypt-devel php-pear

更新插件的时间比较长,操作如下所示。#pear upgrade PEAR

步骤3.继续执行下列命令。#pear channel-update pear.php.net

安装 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命令来完成安装。

查看已安装包方法如下:

[root@localhost barnyard2-1.9]# pear list

Installed packages, channel pear.php.net:

Package Version StateArchive_Tar 1.4.9 stableConsole_Getopt 1.3.1 stableImage_Canvas 0.3.5 alphaImage_Color 1.0.4 stableImage_Graph 0.8.0 alphaNumbers_Roman 1.0.2 stablePEAR 1.9.5 stableStructures_Graph 1.0.4 stableXML_RPC 1.5.4 stableXML_Util 1.2.3 stable

步骤4.安装ADOdb包。

虽然PHP是建构Web系统强有力的工具,但是PHP存取数据库的功能并未标准化,MySQL使用了另一种不同且不兼容的应用程序接口。此时需要使用ADOdb作为中介进行转换。ADOdb的最大优点是不管后端数据库如何,存取数据库的方式都是一致的。目前ADOdb的最新版本是5.20,它支持的数据库种类非常多,例如MySQL、PostgreSQL、Oracle等。

下面开始安装ADOdb,首先将adodb520.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包。#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 的报错级别并返回当前级别,错误报告是分级的,下面我们了解一下这个函数错误报告等级。

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

步骤7.改变属主和属组并设置权限。

#chown –R apache:apache /var/www/html

#chmod -R 755 /var/www/html

步骤8.重启MySQL、Web和Firewall服务。

#service mysqld restart //启动数据库服务

#service httpd restart //重启Web服务

#service iptables stop //关闭防火墙

步骤9.在Web界面设置BASE。

打开浏览器输入网址http://192.168.1.120/base/setup/index.php,

输入完毕后弹出安装界面,如图1-7所示。

单击Continue按钮,开始选择语言和ADOdb路径,

如图1-8所示。

语言项选择中文,ADOdb路径中输入/var/www/html/adodb,单击Continue按钮。

接下来输入数据库名称、访问用户名和密码,如图1-9所示。

图1-7 开始设置BASE

图1-8 设置ADOdb路径

图1-9 设置数据库

下一步将管理员名称设置为root,密码依然是“123456”,Full Name不必设置,如图1-10所示。

图1-10 设置root密码下一步开始创建BASE表结构,如图1-11、图1-12所示。

图1-11 准备创建BASE表结构图1-12 BASE表创建完成如果看到表acid有创建完成的提示并且BASE tables状态显示为“DONE”,则表示安装完成。

单击屏幕最下方的step5…按钮结束安装。在客户机终端命令行中ping主机192.168.1.120,随后就能在BASE界面中收到ICMP报警,如图1-13所示。图1-13 收到报警如果在Web的BASE界面中收到ICMP报警,则表明BASE安装设置完成。

六 、安装phpMyAdmin(非必选项)

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

重启Web服务#service httpd restart

打开phpMyAdmin的Web UI网址:http://yourip/phpmyadmin/图14

在Web界面下输入用户名snort,密码为123456图15

此时我们可以更加直观的查看报警。图16

如何在BASE下删除报警?

如果要删除报警,首先勾选需要删除的报警,然后在“动作”下拉菜单中选择“删除报警”选项,如图1-17所示。图1-17 删除报警

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

七、开机自动运行脚本

假设Snort服务器中只有一块网卡设备名称为eth0。为让Snort和Barnyard2自动运行,我们需要编写如下SHELL代码:

#!/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.local末尾即可。

sh /root/idsrun.sh start
service httpd start

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

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

全文讲解结束!