本文继续《从源码打造Snort+barnyard2+BASE可视化报警平台之一》的部分继续讲解
本文继续《从源码打造Snort+barnyard2+BASE可视化报警平台之一》的部分继续讲解
上文讲解了两个环节内容。
将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
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
如果以上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 的报错级别并返回当前级别,错误报告是分级的,下面我们了解一下这个函数错误报告等级。
步骤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是常用的开源数据库管理工具,在这里有助于我们对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。
全文讲解结束!