最近几天搭建了一个入侵防御系统,主要用到的软件有:
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-util、pcre等,提到缺什么库用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目录下会生成mysql和test两个目录,即使上面的--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-development,php.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之前需要先安装如下几个包
Libpcap、PCRE、Libdnet、DAQ
将这几个软件都安装在/usr/local目录下,configure的参数基本上没啥可说的,直接加上--prefix=/usr/local就行,不加也行的,默认就是该目录,但更明确点还是加上吧,其它的选项不懂可以用./configure --help命令查看帮助。
安装完这几个库之后都记得执行下ldconfig命令
接下来就是安装snort了,为了能让snort和snortsam一起工作,我们需要给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.cache
,
configure
,Makefile.in
,config.h
,config.h.in
,config.status
,libtool
,ltmain.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也安装好了,整个入侵检测系统也差不多了。如果想这个检测系统能成为一个入侵防御系统,那么我们还得安装snortsam和iptables
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,到此整个入侵防御系统搭建完毕!
所用到的软件包如下图: