基于snort和snortsam的入侵防御系统的搭建

最近几天搭建了一个入侵防御系统,主要用到的软件有:

linux Apache  Mysql PHP  Snort Snortsam  Base Barnyard

 

在安装的过程中,对于一些库,尽量选择安装在/usr/local目录下,对于安装在其它目录下的库或的软件进行修改/etc/ld.so.conf,然后执行ldconfig命令,必要时修改下PATH变量,如果权限有限制,那就用root或者sudo执行。

 

首先搭建LAMP系统

Linux+Apache+Mysql+PHP

参考资料:http://blog.csdn.net/dlutxie/article/details/8218078

我用的是ubuntu9.04的系统2.6.28的内核

 

Apache的安装

Apache有很多种服务器,在这里我要用的是httpd的服务,用的版本是httpd-2.4.3.tar.gz

tar  xvf  httpd-2.4.3.tar.gz

cd httpd-2.4.3

./configure --prefix=/usr/local/apache/ --enable-rewrite--enable-so

make && make install

接下来就是对配置文件 /usr/local/apache/conf/httpd.conf进行配置

DocumentRoot那行填上你所希望的网站文件的目录。如:DocumentRoot  "/var/www"。特别注意,www后面不要加“/”,当然用默认的也行。注意下紧接着的那一行<Directory"var/www">也是要改的。

/usr/local/apache/bin/apachectl start启动服务器之后就可以在浏览器中输入:http://127.0.0.1/来进行访问了(在默认的hdocs目录下是有一个测试html文件的),如果访问没有反应那就清空下缓存再试试。

如果访问的时候出现:Forbidden,就在配置文件里面紧跟着DomentRoot“/var/website”下面加入如下内容:

Option FollowSymLinks
AllowOverrideNone
Order allow,deny
Allow from all

 

         安装的时候如果权限不够就用sudo或者root用户执行

         对于configure对配置,具体的可以用./configure–help查看帮助。configure中基本参数的意义可以参考:http://blog.csdn.net/dlutxie/article/details/8191877

各个系统不一样,在安装httpd之前可能有其它一些软件包需要安装,如apr(apache运行时库)apr-utilpcre等,提到缺什么库用apt-get install 安装就行或者自己下载软件包安装,大部分情况下我是自己下载最新的软件包安装的,在安装这些库时,最好是选择默认的路径(一般都是/usr/local)或者自己用--prefix=/usr/local指定,需要强调的是最好不要设置成:--prefix=/usr/local/这个后面多了一个“/”符号,这有可能出错,我就在安装apr-util时因为把—prefix=/usr/local/apr-util/再安装httpd时出现如下的错误:

exports.c:3012: error: previous definitionof 'ap_hack_apu_version' was here

exports.c:3021: error: redefinition of'ap_hack_apu_version_string'

exports.c:3013: error: previous definitionof 'ap_hack_apu_version_string' was here

make[2]: *** [exports.lo] Error 1

make[2]: Leaving directory`/home/xgy/tmp/httpd-build/server'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory`/home/xgy/tmp/httpd-build/server'

make: *** [all-recursive] Error 1

我是另外建了一个httpd-build目录来编译的,打开/home/xgy/tmp/httpd-build/server/exports.c文件搜索ap_hack_apu_version_string字符串,发现注释部分有:/usr/local/apr-util//include/apr-1/apu_version.h,这个路径多了一个/,另一个定义没有这个/这就是错误的原因,重定义了,所以后来重新编译了这个库就好了。

         如果安装的时候不是选择默认的/usr/local路径下,而是自己指定一个目录如/usr/local/apr-util,那么安装完后就要在/etc/ld.so.conf文件中加入一行:/usr/local/apr-util/lib

然后再执行下:ldconfig命令才能让刚安装的动态库立即加载到内存中,要不编译httpd时还是会说找不到相应的库或者相应的头文件,所以对于库的安装,最好还是安装在默认的路径下,这样就不用自己去设置库的查找路径和头文件的查找路径了。关于库还有头文件的查找可以参考:http://blog.csdn.net/dlutxie/article/details/6776936

 

接下来安装Mysql

开始自己也是打算自己通过源码编译,用的版本是mysql-5.1.66,自己几乎没有用过Mysql,更没有编译过,估计是有些问题没有处理好,总是编译出错,后来就直接用了预编译好的版本mysql-5.0.96-linux-i686-glibc23.tar.gz

将该文件解压在/usr/local目录下就行,如果是解压在其它目录下,而再复制到/usr/local/mysql目下时,记得用cp –a命令,要不一些链接文件会被源文件替代!!

安装命令如下:

cd /usr/local

tar xvf /tmp/mysql-5.0.96-linux-i686-glibc23.tar.gz

mv mysql-5.0.96 mysql

接下来是对mysql进行配置:

cd /usr/local/mysql

groupadd mysql             #增加一个用户组

useradd -g mysql mysql       #增加一个用户

chown -R mysql:mysql  .     #注意这块最后有个点,表示当前目录

scripts/mysql_install_db  --user=mysql

执行完后在data目录下会生成mysqltest两个目录,即使上面的--user=snort也是这两个目录,这个命令是对用户进行授权,具体的我也还不懂。

chown -R root .

chown -R mysql  var       #这几个更改文件拥有者啥的,不会弄就先别弄吧,如果哪块有权限问题了,那就改用root用户执行吧。

cp support-files/my-medium.cnf /etc/my.cnf    #该命令是可选的,放在/etc目录下的my.cnf是对mysql所有用户的一个全局的配置文件,每个用户也还可以有自己的配置文件的。

cp support-files/mysql.server/etc/init.d/mysql.server这个命令也是可选的,可以把mysql.server文件放在mysql/bin/目录下

mysql.server  start  #启动mysql数据库

mysql.server  stop  #关闭mysql数据库

mysql.server  restart #重启mysql数据库

启动mysql数据库服务器之后会自动生成/tmp/mysql.sock,服务器关闭后这个文件会自动消失,所以不要去动这个文件。

然后接着执行

./bin/mysqladmin -u root password root 修改密码

执行上面的命令后在data目录下会多出几个文件

idbata1 :该文件用于存储数据

ib_logfile0 ib_logfile1: 这两个是数据库的日志文件,数据的恢复就全靠它了

ubuntu.pid 这个像是存放进程的pid的,服务器启动之后才有,具体作用不太清楚。

mysql的安装差不多就完成了,需要强调下的是关闭服务器是最好不要用kill -9命令,要不可能造成下次mysql启动不起来!

然后我们在/etc/ld.so.conf文件下加入/usr/local/mysql/lib,然后执行命令ldconfig加载库文件,此时可能会出现一个错误,libmysqlclient_r.so不是一个链接文件啥的,然后用ls –l命令查看/usr/local/mysql/lib发现该文件确实不是链接文件,还有其它几个文件也不是,可能是cp的时候没有加-a选项!那个我们自己改下就行了

cd /usr/local/mysql/lib

ln  -svf  libmysqlclient_r.so.15.0.0   libmysqlclient_r.so

ln  -svf  libmysqlclient_r.so.15.0.0   libmysqlclient_r.so.15

ln  -svf  libmysqlclient.so.15.0.0   libmysqlclient.so

ln  -svf  libmysqlclient.so.15.0.0   libmysqlclient.so.15

ln  -svf  libndbclient.so.2.0.0   libndbclient.so

ln  -svf  libndbclient.so.2.0.0   libndbclient.so.2

然后再重新执行一次ldconfig命令就行

 

接下来安装PHP,我用的是php-5.4.8的版本,当时是最新的版本了。

在安装PHP之前也有几个软件包需要安装,当提示缺啥时用apt-get install安装或自己下载最新的相应的软件包安装在/usr/local目录下就行

安装命令:

cd ~/tmp

tar xvf /tmp/php-5.4.8.tar.gz

mkdir –v php-build     #我是单独建一个目录来进行编译的

cd php-build

../php-5.4.8/configure   --prefix=/usr/local/php  --with-xml--with-apxs2=/usr/local/apache/bin/apxs   --with-mysql=/usr/local/mysql   --with-gd

最后一个—with-gd如果没有选,那么后面安装base后,有一个带人图形的分析功能用不了。

make
sudo make install

接下来就是修改配置文件了,在这块我纠结了好久。

首先修改一下httpd.conf文件,让Apache支持PHP

sudo gedit /usr/local/apache/conf/httpd.conf
搜索AddType application,然后在那块添加:
AddType  application/x-httpd-php 
.php     #注意php之前有一个点,下面的也一样

AddType  application/x-httpd-php-source  .phps

 

接下来修改php.ini文件

php-5.4.8目录下有两个文件php.ini-developmentphp.ini-production其中development是开发人员用的,如果有错误会给出提示,production是用于最后产品的,测试基本上没问题了,在这,我们最好是用development版本的吧。将该文件拷贝到/usr/local/php/etc目录下,或者/usr/local/php/lib目录下都行,文件名改为php.ini,命令如下:

cd php-5.4.8

cp  php.ini.development  /usr/local/php/etc/php.ini

然后打开php.ini,搜索mysql,然后将;extension=php_mysql.dll之前的分号去掉,其它两个也一起去掉吧。

然后我们重启Apache服务器:

sudo /usr/local/apache/bin/apachectl restart
好,最后我们来写一个测试页面测试一下PHP有没有正常工作。创建一个文件叫做phpinfo.php,将其放入/var/www目录内,一定要注意权限,不要忘记设为755,其文件内容如下:
<?php   phpinfo();   
?>

然后在浏览器中输入:http://localhost/phpinfo.php就该能看到php的版本信息了。

PHP的安装到此结束

 

接下来就是安装snort相关的了

安装snort之前需要先安装如下几个包

LibpcapPCRELibdnetDAQ

将这几个软件都安装在/usr/local目录下,configure的参数基本上没啥可说的,直接加上--prefix=/usr/local就行,不加也行的,默认就是该目录,但更明确点还是加上吧,其它的选项不懂可以用./configure  --help命令查看帮助。

安装完这几个库之后都记得执行下ldconfig命令

 

接下来就是安装snort了,为了能让snortsnortsam一起工作,我们需要给snort打补丁,如果不想用snortsam,那也可以不打补丁的。snort我用的是最新的版本snort-2.9.3.1,下载的补丁文件为snortsam-2.9.3.1.dff这个文件当时在官网上还没有,是在其它地方找到的。命令如下:

cd ~/tmp

tar xvf   /tmp/snort-2.9.3.1.tar.gz

cd snort-2.9.3.1

patch -Np1 –i  ../ snortsam-2.9.3.1.dff

这个补丁文件会在snort-2.9.3.1目录下生成autojunk.sh文件,还有在相应的子目录下生成其它的几个源文件。

由于我们更改了源文件,所以需要重新生成configure文件,我们先把autojunk.sh文件改为如下内容:

#!/bin/sh

# the list of commands that need to runbefore we do a compile

libtoolize --automake --copy --force

aclocal -I m4

autoheader

automake --add-missing --copy

autoreconf -i –f

比原来的多加了几个选项而已,表示需要强制重新生成相应的文件。

然后在snort-2.9.3.1目录下执行

./autojunk.sh

执行这个命令的时候可能会出错,首先可能的就是提示没有automake,还有libtool,此处我是直接用apt-get install命令安装的。

然后我新建了一个目录 mkdir  -v ../snort-build目录来进行编译

cd  ../snort-build

../snort-2.9.3.1/configure   --prefix=/usr/local/snort   #其它的选项用—help看下

make

然后就出现了如下错误:

libtool: Version mismatch error.  This is libtool 2.4, but the

libtool: definition of this LT_INIT comesfrom libtool 2.2.6b.

libtool: You should recreate aclocal.m4with macros from libtool 2.4

libtool: and run autoconf again.

因为这个错误,我纠结了好久,刚开始是没有修改autojunk.sh的,直接用生成了autojunk.sh

按网上说的:先运行makemaintainer-clean,然后删除 snort-2.9.3.1目录下的aclocal.m4

autom4te.cacheconfigure,Makefile.inconfig.hconfig.h.inconfig.statuslibtoolltmain.sh,然后还修改了configure.in文件,将AC_PROG()注释掉然后在下面增加一行:LT_INIT

然后还自己重新下载了一个libtool 2.2.6b软件包,也许后面两步是没有必要的,但经过这些之后我的编译就顺利进行了。最后就是make  install

接下来运行如下命令又发现了错误:

root@ubuntu:/usr/local# snort/bin/snort--version

snort/bin/snort: error while loading sharedlibraries: libdnet.1: cannot open shared object file: No such file or directory

查看了下,这是因为libdnet.1的文件名命名不对,虽然它是个链接文件,但没有以.so结尾,所以用如下命令修改下就可以了。

root@ubuntu:/usr/local/lib# mv libdnetlibdnet.so

root@ubuntu:/usr/local/lib# mvlibdnet.1  libdnet.1.so -v

libdnet.1” -> “libdnet.1.so

接下来安装snort rules

sudo tar  zxvf  snortrules-snapshot-2931.tar.gz -C/usr/local/snort

sudo mkdir /usr/local/snort/lib/snort_dynamicrules

sudo cp /usr/local/snort/so_rules/precompiled/Ubuntu-10-4/i386/2.9.3.1/* \

/usr/local/snort/lib/snort_dynamicrules

sudo touch /usr/local/snort/rules/white_list.rules

sudo touch /usr/local/snort/rules/black_list.rules

sudo ldconfig

 

接下来就是对snort的配置文件进行修改了:

首先建立几个目录:

sudo mkdir /var/log/snort    #这个目录似乎是snort日志输出的默认目录

sudo groupadd snort

sudo useradd -g snort snort –s /sbin/nologin

sudo chownsnort:snort /var/log/snort

 

sudo vi /usr/local/snort/etc/snort.conf

将如下两行

var WHITE_LIST_PATH ../rules

var BLACK_LIST_PATH ../rules

改为:

var WHITE_LIST_PATH /usr/local/snort/rules

var BLACK_LIST_PATH /usr/local/snort/rules

将如下三行:

dynamicpreprocessor directory/usr/local/lib/snort_dynamicpreprocessor/

dynamicengine/usr/local/lib/snort_dynamicengine/libsf_engine.so

dynamicdetection directory/usr/local/lib/snort_dynamicrules

改为:

dynamicpreprocessor directory/usr/local/snort/lib/snort_dynamicpreprocessor/

dynamicengine/usr/local/snort/lib/snort_dynamicengine/libsf_engine.so

dynamicdetection directory/usr/local/snort/lib/snort_dynamicrules

 

在输入配置那块

#output unified2: filename merged.log, limit 128, nostamp, \

mpls_event_types, vlan_event_types

增加如下一行:

output unified2: filename snort.u2, limit 128

 

配置好之后运行 snort  -c  /usr/local/snort/etc/snort.conf  -T进行检查下!!!

 

接下来我们安装Barnyard2-1.9

cd ~/tmp

tar xvf  /tmp/Barnyard2-1.9.tar.gz

cd Barnyard2-1.9

./configure  --prefix=/usr/local  --with-mysql

make && make install

接下来就是做些配置了:

sudo cp etc/barnyard2.conf/usr/local/snort/etc

sudo mkdir /var/log/barnyard2     #这个目录,我并没有发现有啥日志写进去

sudo chmod 666 /var/log/barnyard2    

sudo touch/var/log/snort/barnyard2.waldo

sudo chown snort.snort/var/log/snort/barnyard2.waldo

sudo vim  /var/log/snort/barnyard2.waldo barnyard2.waldo文件内写入如下四行内容:

/var/log/snort/

snort.u2

0123456789

0

对于上面的0123456789这个十位数字,运行下snort后就会发现在/var/log/snort/目录下有snort.u2.1354179954类似的文件,随便选一个,将那10个数字填上去就行。这个文件一定不要空着,要不snort运行时会建立这个日志文件,但这个日志文件会是空的!!!

 

接下来就是创建相应的数据库表了

echo "create database snort;" | mysql -u root -p

mysql -u root -p -D snort < ./schemas/create_mysql

echo "grant create, insert, select, delete, update on snort.* tosnort@localhost \

identified by 'YOURPASSWORD'" | mysql -u root –p

 

下面修改barnyard2.conf的配置文件

 

mv -v /usr/local/etc/barnyard2.conf /usr/local/snort/etc

sudo vi /usr/local/snort/etc/barnyard2.conf

更改如下内容:

config reference_file:/etc/snort/reference.config

config classification_file:/etc/snort/classification.config

config gen_file:/etc/snort/gen-msg.map

config sid_file:/etc/snort/sid-msg.map

#config hostname: thor

#config interface: eth0

#output database: log, mysql,user=root password=test dbname=db host=localhost

config reference_file:/usr/local/snort/etc/reference.config

config classification_file:/usr/local/snort/etc/classification.config

config gen_file: /usr/local/snort/etc/gen-msg.map

config sid_file:/usr/local/snort/etc/sid-msg.map

config hostname:   localhost

config interface:   eth0

output database: log, mysql,dbname=snort user=snort password=snort host=localhost

需要特别注意的是最后配置数据库那一行,虽然配置文件中有相应的例子,但似乎不好使

当时我把dbname那个选项放在了user选项后面就不好使了,另外password选项前面多了一个空格都不行!!!

 

下面的几个配置是可选的

#config logdir: /tmp 下增加一行,不过我似乎没有见着有啥日志写到这个目录下

config logdir: /var/log/barnyard2

# enable daemon mode下增加一行

config daemon   #以服务的形式在后台运行barnyard2

 

OK ,Barnyard2也安装好了

 

接下来我们安装Base, Base是用PHP写的一个网站,主要是用来访问记录在mysql数据库中的snort的日志,我用的是Base-1.4.5版本

安装Base之前需要安装下pear,adodb

pear的安装和其它库一样安装就行(注意下,在安装PHP时,pear默认就安装了,在php/bin目录下可以找到)

adodb的安装:

cd ~/tmp

tar xvf /tmp/adodb518a.tar.gz

cp -av  adodb5  /var/www

OK ,adodb安装好了,接下来安装Base

cd ~/tmp

tar xvf  /tmp/Base-1.4.5.tar.gz

cp -av  base-1.4.5  /var/www/

OK,base安装好了,接下来我们行base的配置,打开浏览器输入:

http://localhost/base/setup

之后就会有一个页面,按那个提示做就行,有些是可以空的,这个可以参考:

http://linux.justinhartman.com/Intrusion_Detection_using_BASE_and_Snort

如果在配置时出现如下错误:

 

arning: include_once(Mail.php):failed to open stream: No such file or directory in/var/www/base-1.4.5/includes/base_action.inc.php on line 29

 

Warning: include_once(): Failedopening 'Mail.php' for inclusion (include_path='.:/usr/local/php/lib/php') in/var/www/base-1.4.5/includes/base_action.inc.php on line 29

 

那就到php/bin目录下执行如下命令:

pear install mail

pear install  mail_mime

 

如果出现如下警告:

Warning: date(): It is not safe torely on the system's timezone settings. You are *required* to use thedate.timezone setting or the date_default_timezone_set() function. In case youused any of those methods and you are still getting this warning, you mostlikely misspelled the timezone identifier. We selected the timezone 'UTC' fornow, but please set date.timezone to select your timezone. in/var/www/base-1.4.5/base_main.php on line 138

 

那就修改/usr/local/php/etc或者是/usr/local/php/lib下的php.ini文件,搜索datae.timezone,在下面增加一行:

date.timezone = "Asia/Shanghai"

 

如果出现类似如下的错误:

Strict Standards: Declaration ofMultipleElementCriteria::SanitizeElement() should be compatible withBaseCriteria::SanitizeElement() in/var/www/base-1.4.5/includes/base_state_citems.inc.php on line 292

 

那就修改/usr/local/php/etc或者是/usr/local/php/lib下的php.ini文件,搜索error_reporting,大约在463行的位置,把那一行:error_reporting = E_ALL 修改为如下形式。

error_reporting = E_ALL &~E_STRICT & ~E_DEPRECATED

 

 

OK Base也安装好了,整个入侵检测系统也差不多了。如果想这个检测系统能成为一个入侵防御系统,那么我们还得安装snortsamiptables

 

snortsam能支持很多防火墙,在linux下,我选择了iptables

iptables通过apt-get  install iptables安装就行

安装完之后,首先对其进行配置,测试防火墙好不好使,通过如下命令

 

iptables -A INPUT -s www.baidu.com-p tcp --sport 80 -j DROP

或者:

iptables -A INPUT -s 119.75.217.109-p tcp --sport 80 -j DROP

设置之后我就不能防问百度的主页了,说明防火墙安装成功,防火墙的配置可以参考:

http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html

 

接下来安装snortsam

由于先前我们已经对snort进行过打补丁了,所以此处只关注于snortsam的安装主行,如果是已经安装好snort后才想支持snortsam的,那得打补丁之后重新编译安装snort.安装snortsam的命令如下:

cd ~/tmp

tar xvf /tmp/snortsam-src-2.7.0

cd snortsam

chmod +x makesnortsam.sh

./makesnortsam.sh

OK ,这就编译好了,然后将生成的snortsam拷到/usr/local/bin目录下就行

接下来对snortsam进行配置,将conf目录下的snortsam.conf.example文件拷贝到/ect目录下,并命名为snortsam.conf命令如下:

cp conf/snortsam.conf.example  /etc/snortsam.conf

 

touch /var/snortsam.state   #建立一个空文件,默认位置为/var/db/snortsam.state

# accept <host>/<mask>,<key>那块加入:

accept  127.0.0.1   

#这个地址是你snort安装的地址,如果后面没有接那个加密的密钥,那就用默认的,如果填了加密的密钥,如如下配置accept 10.10.0.0/16, officepassword,那么在后面配置snort时也要写上相对应的密钥!!。如果没有写上子网掩码,那表明只接受来自某台主机的报警。最简单的配件就是只写上这一行了。

增加如下几行(这些配置是可选项):

logfile  snortsam.log     #大约在248

statefile  /var/snortsam.state   #大约在297

forcethreads                #大约在397

daemon                    #大约在406

fwsam   127.0.0.1         #配置防火墙的位置,大约在443,这一行最好是给配上

iptables  eth0             #大约在661

 

接下来对snort进行配置:

配置格式如下:output alert_fwsam:<snortsambox>:<port>/<password>

snortsambox是运行snortsam的主机的IP地址,或者DNS域名,如

output alert_fwsam:localhost/myhostpass sam.corp.com:1050/corppass

修改/usr/local/snort/etc/snort.conf

在输出那一块加上:

output alert_fwsam:   localhost

在这里我没有填加密密钥,如果果了,一定要记得和snortsam配置文件中的保持一致!否则snortsam会忽略点报警的。

 

为了能在开机的时候启动入侵检测系统,我们可以在/etc/rc.local文件下写入:

#启动mysql服务器

/usr/local/mysql/bin/mysql.server  start

#启动Apache服务器

/usr/local/apache/bin/apachectl  start

#启动Barnyard2服务

/usr/local/bin/barnyard2   -c /usr/local/snort/etc/barnyard2.conf  -f snort.u2  -d /var/log/snort  -w /var/log/snort/barnyard2.waldo

#启动snort

/usr/local/snort/snort  -c /usr/local/snort/etc/snort.conf  -i eth0

#启动snortsam

/usr/local/snortsam

 

/usr/local/snort/rules/local.rules文件中写入如下行:

alert tcp 119.75.217.109 80 ->10.28.250.224/16 any (content:"|2e 62 61 69 64 75 2e 63 6f6d|";msg:"www.baidu.com";sid:1000000;fwsam:src,1 minutes)

该规则是,如果从119.75.217.109:80来的数据包中包含了.baidu.com的内容,则阻止该IP1分钟

启动各项服务后,访问下百度的主页,就会发现接着访问不了了,过了一分钟又可以访问了,但接着又访问不了了,OK测试成功!

OK,到此整个入侵防御系统搭建完毕!

 

所用到的软件包如下图:

基于snort和snortsam的入侵防御系统的搭建_第1张图片

 

你可能感兴趣的:(基于snort和snortsam的入侵防御系统的搭建)