Building Escorting Firewall with OpenBSD4.2 AMD64 stable&Snort

来自 ChinaUnix Wiki

构建基于OPENBSD 4.2 AMD64 stable的主动防火墙

版权:没有 引用请注明出处,谢谢! 作者:尘羽星翔

目录

第一篇――安装篇

前言

为什么要用OpenBSD?

因为他够简单、直接、该有的都有了,给人的感觉是白羊座(正好本人也是白羊:)
另外就是够安全,本人也是极其懒散的人,即不愿意个星期三打系统补丁,也不愿动不动就make kernel

为什么要用64位版本?

因为现在的内存太便宜,1G内存150,1M内存比不上1口黄瓜,而且64位是触手可及的未来
(本人有计划把这套系统做成ramdisk,大容量内存能弥补存储空间的不足)

什么是Snort?

一套开源的IDS系统,应用广泛、使用方便,如果你的网站还在受跨站之类的古老黑客技术困扰,或者说不愿再
被那些脚本族欺负的话,可以试试这个系统,会给你很大的惊喜。
Snort的口号:每种攻击都有其代码特征,只要你找到它,一个规则可以解决问题!(我自己加的:)


这篇文章面对的对象是没有太多基础的朋友们,所以内容尽量详细,希望能让不怎么会用OpenBSD的朋友入门。

另:OpenBSD 90%的问题可以通过查询Obsd的FAQ解决,如果你的问题是本文没有涉及到的,请先查询FAQ

阅读指南:所有需要手工录入的部分都用加阴影的字符表示,需要特别注意的地方以红色字符加阴影表示.

一、主要安装组件:

 OpenBSD 4.2 AMD64
 Mysql
 PHP 5
 Snort 2.6.
 Spoink-v1.0(snort日志>pf的工具,插件)
 Oinkmaster(snort规则升级工具)
 Snort2c(snort日志>pf的工具,外部程序)
 BASE(类似于acid的snort记录管理工具)
 PFW(基于web的pf规则定制界面)

二、软件安装

1、OpenBSD安装(省略)

不会安装系统的搜以前的文章,回头有时间一定写一个白菜版的安装教程,注意:4.2版本的openbsd编译时需要的很多的库文件都在X*.tgz里面,安装的时候最好把所有的组件都装上,xfont42不需要,如果安装系统的时候没有安装,进入系统以后

 tar xzvpf /你的包的位置/X*.tgz -C /

一定要加上p参数来保证权限

2、OpenBSD升级

1)解压src、sys和ports包

tar xzvf /你的包的位置/src.tar.gz -C /usr/src/
tar xzvf /你的包的位置/sys.tar.gz -C /usr/src/
tar xzvf /你的包的位置/ports.tar.gz -C /usr/

2)加速原代码下载

vi /etc/mk.conf

加入如下代码

MASTER_SITE_OVERRIDE=ftp://ftp.freebsdchina.org/pub/OpenBSD/distfiles/${DIST_SUBDIR}/ \
                     http://ports.hshh.org/${DIST_SUBDIR}/  \
                     http://ports.cn.freebsd.org/${DIST_SUBDIR}/ \
                     ftp://ftp.openbsd.org.tw/pub/OpenBSD/distfiles/${DIST_SUBDIR}/ \
                     ftp://ftp.tw.openbsd.org/pub/OpenBSD/distfiles/${DIST_SUBDIR}/
#FETCH_CMD=/usr/local/bin/wget

(如果你想知道这些代码这么来的,看看 /usr/ports/infrastructure/mk/bsd.port.mk就能明白)

其中FETCH_CMD前面的井号安装完wget后再去掉

3)安装wget

cd /usr/ports
make search key=wget
cd  net/wget 
make install

启用wget作为默认下载工具

vi /etc/mk.conf

将”#FETCH_CMD=/usr/local/bin/wget”前的井号删除 如果安装文件时提示文件校验失败的话,输入

make checksum REFETCH=ture

来重新下载源码包

4)安装cvsync

因为cvsup不支持amd64,不喜欢cvs的就用这个代替吧

cd /usr/ports
make search key=cvsync
cd  net/cvsync &&make install

5)使用cvsync升级src和ports

mkdir /usr/cvs
vi /etc/cvsync_conf

加入如下代码:

config {
	    hostname cvsync.openbsd.org.tw
	    # If your network link is a T1 or faster, comment out the following line.
	    compress
	    collection {
		name openbsd release rcs
		prefix /usr/cvs
		umask 002
	    }
	}

cvsync使用

cvsync -c /etc/cvsync_conf

然后开始升级同步你的代码树 cvsync提示完成以后,输入

cd /usr
cvs -d /usr/cvs checkout -rOPENBSD_4_2 src ports

来升级src和ports

6)stable系统

A升级新内核
cd /usr/src/sys/arch/amd64/conf
/usr/sbin/config GENERIC
cd /usr/src/sys/arch/amd64/compile/GENERIC
make clean && make depend && make&&make install&&reboot
B升级binaries

重启以后

 rm -rf /usr/obj/*
 cd /usr/src
 make obj
 cd /usr/src/etc && env DESTDIR=/ make distrib-dirs
 cd /usr/src
 make build&& make install

3、安装mysql

cd /usr/ports/databases/mysql
make install

ports默认只安装mysql client,mysql server需要自己手工安装

cd /usr/ports/packages/amd64/all/
pkg_add mysql-server-5.0.45.tgz

如果没有安装p5-DBD-mysql,会提示 Can't find p5-DBD-mysql-3.0008 /usr/sbin/pkg_add: p5-DBD-mysql-3.0008:Fatal error

下面安装p5-DBD-mysql

cd /usr/ports
make search key=p5-DBD-mysql
cd databases/p5-DBD-mysql
make install

安装完毕以后,再安装mysql server

cd /usr/ports/packages/amd64/all/
pkg_add mysql-server-5.0.45.tgz

安装默认的mysql数据库

/usr/local/bin/mysql_install_db

修改mysql相关配置

vi /etc/sysctl.conf

加入

kern.maxfiles=4096

建议将这个值改大一点,不要超过65535就可以

vi /etc/login.conf

加入

mysql:\
                :openfiles-cur=1024:\
                :openfiles-max=2048:\
                :tc=daemon:

保存退出后运行

cap_mkdb /etc/login.conf

修改rc.local

vi /etc/rc.local

加入

# MySQL startup
if [ -x /usr/local/bin/mysqld_safe ] ; then
                su -c mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &'
                echo -n ' mysql'
fi

保存退出 测试mysql,输入

mysql

如果出现mysql>

就没有问题了 输入quit退出 现在要为mysql设置密码

/usr/local/bin/mysqld_safe &
/usr/local/bin/mysqladmin -u root password '你的密码’

4、安装php5

cd /usr/ports
make search key=php5
cd www/php5
make install

完成以后只会安装php5-core-5.2.3和php5-extensions-5.2.3

其他的需要手工安装


启用php5

/usr/local/sbin/phpxs –s

安装并激活php-mysql、gd、xmlrpc、gmp模块

cd /usr/ports/packages/amd64/all/
pkg_add php5-mysql-5.2.3.tgz
/usr/local/sbin/phpxs -a mysql
pkg_add php5-gd-5.2.3-no_x11.tgz
/usr/local/sbin/phpxs -a gd
pkg_add php5-xmlrpc-5.2.3.tgz
/usr/local/sbin/phpxs -a xmlrpc
pkg_add  php5-gmp-5.2.3.tgz
/usr/local/sbin/phpxs -a gmp

安装php5-sqlite-5.2.3.tgz,这是因为PFW需要sqlite,如果你不需要PF的web控制的话,这个可以不装

pkg_add php5-sqlite-5.2.3.tgz
/usr/local/sbin/phpxs -a sqlite

5、安装Snort

Snort是整个安装过程的核心,其中Spoink-v1.0是以输出插件的形式和snort一起编译安装的,安装里面比较麻烦,而另一个和Spoink功能类似的snort2c要容易安装的多,怕难的朋友可以跳过Spoink安装。

1)同时安装snort和Spoink-v1.0

Spoink-v1.0下载地址:http://spoink.sourceforge.net/#download

安装spoink之前,需要先解压缩snort,snort有很多可选的编译选项

cd /usr/ports/net/snort
make show=FLAVORS

显示postgresql mysql flexresp prelude,如果要看这四个选择的具体说明

vi pkg/DESCR

其中要注意的是下面的几段

        postgresql - enable postgresql database logging support
       mysql     - enable mysql database logging support
       flexresp   - enable dynamic connection killing support
       prelude    - enable prelude-ids support

简单翻译一下

postgresql是启用postgresql数据库来记录log

mysql是启用mysql数据库来记录log

flexresp是启用动态杀死连接

prelude是启用prelude-ids(传感器模式)支持

我把后三项都启用了,这里启用带参数的编译有两种方法

○1env法

env FLAVOR="mysql flexresp prelude" make extract

○2编辑 Makefile法

vi Makefile 

搜索FLAVOR? 原来是

FLAVOR?=

改成

FLAVOR?=mysql flexresp prelude

(我喜欢这种方法,打字少,升级的时候方便)

保存退出后,运行

make extract

接下来要修改snort的文件了,先要解压缩spoink-v1.0.tar.gz,我把下载的spoink-v1.0.tar.gz放在了home里面

cd ~
tar xzvf spoink-v1.0.tar.gz

解压缩以后出现spoink-1.0

cd spoink-1.0
cp sp* /usr/ports/net/snort/w-snort-2.6.0.2p1-mysql-flexresp-prelude/snort-2.6.0.2/src/output-plugins/

接下来修改snort的代码来支持spoink,需要修改plugbase.c、Makefile.am和Makefile.in

A修改src/plugbase.c
cd /usr/ports/net/snort/w-snort-2.6.0.2p1-mysql-flexresp-prelude/snort-2.6.0.2/
vi src/plugbase.c

在找到void InitOutputPlugins()部分 原来是

 AlertSyslogSetup();
 LogTcpdumpSetup(); 
 DatabaseSetup();   
 AlertFastSetup();  
 AlertFullSetup();

加入AlertPfSetup(); 变成

    AlertSyslogSetup();
   LogTcpdumpSetup(); 
   DatabaseSetup();   
   AlertFastSetup();  
   AlertFullSetup();  
  AlertPfSetup();

找到/* built-in output plugins */部分 原来是

#include "output-plugins/spo_alert_syslog.h"
#include "output-plugins/spo_log_tcpdump.h" 
#include "output-plugins/spo_database.h"    
#include "output-plugins/spo_alert_fast.h"  
#include "output-plugins/spo_alert_full.h"  
#include "output-plugins/spo_alert_unixsock.h"
#include "output-plugins/spo_csv.h"
#include "output-plugins/spo_unified.h"
#include "output-plugins/spo_log_null.h"
#include "output-plugins/spo_log_ascii.h"

加入#include "output-plugins/spo_pf.h" 变成

/* built-in output plugins */
#include "output-plugins/spo_alert_syslog.h"
#include "output-plugins/spo_log_tcpdump.h" 
#include "output-plugins/spo_database.h"    
#include "output-plugins/spo_alert_fast.h"  
#include "output-plugins/spo_alert_full.h"  
#include "output-plugins/spo_alert_unixsock.h"
#include "output-plugins/spo_csv.h"
#include "output-plugins/spo_unified.h"
#include "output-plugins/spo_log_null.h"
#include "output-plugins/spo_log_ascii.h"
#include "output-plugins/spo_pf.h"

保存退出

B修改src/output-plugins/Makefile.am
vi src/output-plugins/Makefile.am

原来是

libspo_a_SOURCES = spo_alert_fast.c spo_alert_fast.h \
spo_alert_full.c spo_alert_full.h \
spo_alert_syslog.c spo_alert_syslog.h spo_alert_unixsock.c     \
spo_alert_unixsock.h spo_csv.c spo_csv.h spo_database.c spo_database.h\
spo_log_null.c spo_log_null.h spo_log_tcpdump.c \
spo_log_tcpdump.h spo_unified.c spo_unified.h spo_log_ascii.c
spo_log_ascii.h \
spo_alert_sf_socket.h spo_alert_sf_socket.c spo_alert_prelude.c
spo_alert_prelude.h

加入红色部分 \(这个是在原来最后一句后边加的)

spo_pf.h spo_pf.c 变成

libspo_a_SOURCES = spo_alert_fast.c spo_alert_fast.h \
spo_alert_full.c spo_alert_full.h \
spo_alert_syslog.c spo_alert_syslog.h spo_alert_unixsock.c     \
spo_alert_unixsock.h spo_csv.c spo_csv.h spo_database.c spo_database.h\
spo_log_null.c spo_log_null.h spo_log_tcpdump.c \
spo_log_tcpdump.h spo_unified.c spo_unified.h spo_log_ascii.c
spo_log_ascii.h \
spo_alert_sf_socket.h spo_alert_sf_socket.c spo_alert_prelude.c
spo_alert_prelude.h \
spo_pf.h spo_pf.c

存盘退出

C修改src/output-plugins/Makefile.in
vi src/output-plugins/Makefile.in

找到

libspo_a_LIBADD =
am_libspo_a_OBJECTS = spo_alert_fast.$(OBJEXT) \
        spo_alert_full.$(OBJEXT) spo_alert_syslog.$(OBJEXT) \
        spo_alert_unixsock.$(OBJEXT) spo_csv.$(OBJEXT) \     
        spo_database.$(OBJEXT) spo_log_null.$(OBJEXT) \
        spo_log_tcpdump.$(OBJEXT) spo_unified.$(OBJEXT) \
        spo_log_ascii.$(OBJEXT) spo_alert_sf_socket.$(OBJEXT) \
        spo_alert_prelude.$(OBJEXT)

加入

\

spo_pf.$(OBJEXT)

变成

am_libspo_a_OBJECTS = spo_alert_fast.$(OBJEXT) \
        spo_alert_full.$(OBJEXT) spo_alert_syslog.$(OBJEXT) \
        spo_alert_unixsock.$(OBJEXT) spo_csv.$(OBJEXT) \
        spo_database.$(OBJEXT) spo_log_null.$(OBJEXT) \ 
        spo_log_tcpdump.$(OBJEXT) spo_unified.$(OBJEXT) \
        spo_log_ascii.$(OBJEXT) spo_alert_sf_socket.$(OBJEXT) \
        spo_alert_prelude.$(OBJEXT) \
        spo_pf.$(OBJEXT)

找到

libspo_a_SOURCES = spo_alert_fast.c spo_alert_fast.h \
spo_alert_full.c spo_alert_full.h \
spo_alert_syslog.c spo_alert_syslog.h spo_alert_unixsock.c     \
spo_alert_unixsock.h spo_csv.c spo_csv.h spo_database.c spo_database.h \
spo_log_null.c spo_log_null.h spo_log_tcpdump.c \
spo_log_tcpdump.h spo_unified.c spo_unified.h spo_log_ascii.c
spo_log_ascii.h \
spo_alert_sf_socket.h spo_alert_sf_socket.c spo_alert_prelude.c
spo_alert_prelude.h

加入红色部分 \

spo_pf.h spo_pf.c 变成

libspo_a_SOURCES = spo_alert_fast.c spo_alert_fast.h \
spo_alert_full.c spo_alert_full.h \
spo_alert_syslog.c spo_alert_syslog.h spo_alert_unixsock.c     \
spo_alert_unixsock.h spo_csv.c spo_csv.h spo_database.c spo_database.h\
spo_log_null.c spo_log_null.h spo_log_tcpdump.c \
spo_log_tcpdump.h spo_unified.c spo_unified.h spo_log_ascii.c
spo_log_ascii.h \
spo_alert_sf_socket.h spo_alert_sf_socket.c spo_alert_prelude.c
spo_alert_prelude.h \
spo_pf.h spo_pf.c    

存盘退出

2)只安装带参数的snort

只安装snort的话,就简单很多

env FLAVOR="mysql flexresp prelude" make install

或者修改了Makefile以后直接make install 不过现在安装的话会提示缺少pcre-7.1、libdnet-1.10p2、prelude-libprelude-0.9.14

3)安装pcre-7.1、libdnet-1.10p2、prelude-libprelude-0.9.14

A安装pcre-7.1
cd /usr/ports
make search key=pcre-7.1
cd  devel/pcre
make install
B安装libdnet-1.10p2
cd /usr/ports
make search key=libdnet-1.10p2
cd net/libdnet
make install
C安装prelude-libprelude-0.9.14
cd /usr/ports
make search key= prelude-libprelude-0.9.14
cd security/prelude/libprelude
make install

4)安装完毕以后,就可以安装snort了

cd /usr/ports/net/snort/
make install

安装完以后,可以输入

snort –vde

测试,如果一切正常的话,能看到很多的数据包里面的能容,那就恭喜你,snort已经安装好了

5)配置snort

安装完snort以后,虽然snort可以启动,但是很多功能都不能用,需要修改snort的配置文件,

snort的配置文件是/etc/snort/snort.conf,

在修改这个文件之前,我们要为snort增加一个mysql的数据库来保存log日志

A操作mysql数据库

这里需要你注意的是不要忘记了刚刚安装mysql是设置的密码,安装完snort以后不要做make clean,因为还需要一个源码中的文件来创建snort的log数据库,如果你做了的话,或者是用pkg安装的话,也没有关系,重新下载一个snort的源码,解压缩就可以了,这个创建数据库用的文件就是源码下schemas/create_mysql 创建snort数据库和用户

mysql -u root –p

出现

Enter password:

后数据你设置的mysql密码,这里建议你的是设置两个snort数据库,一个用来存放日志,另一个用来存放重要信息的备份,出现

mysql>

后输入sql命令

create database snort_log;
grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort_log.* to snort_log@localhost identified by "你的密码";
create database snort_bak;
grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort_bak.* to snort_bak@localhost identified by "你的密码";
flush privileges;
exit
B导入mysql数据表
cd /usr/ports/net/snort/w-snort-2.6.0.2p1-mysql-flexresp-prelude/snort-2.6.0.2/schemas(或者是到你的create_mysql所在的位置)
mysql -u snort_log -p< create_mysql snort_log

输入你设置的snort_log用户密码

mysql -u snort_bak -p< create_mysql snort_bak

输入你设置的snort_bak用户密码

C修改snort配置文件
vi /etc/snort/snort.conf

需要修改的有六类:定义网络、配置动态加载的库、定义预处理器、配置输出插件、配置运行时的文件目录和定制规则。

如果是做测试研究的话,需要定义以下内容

○1内网ip段 搜索

var HOME_NET any

修改any为你的内网ip,要用CIDR地址格式,比如我定义的是10.1.1.0/24,我修改以后变成

var HOME_NET 10.1.1.0/24

如果你有两个或者以上的ip段,需要用[]扩起来,比如:

var HOME_NET [10.1.1.0/24,192.168.1.0/24]

○2打开lowmem方式,否则的话snort要占很多内存,我开以前是480多M,打开以后是100M左右 搜索

config detection: search-method lowmem

将前面的井号删除

○3配置输出log到mysql数据库


搜索

database: log to a variety of databases

将下面的

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

修改成

output database: log, mysql, user=snort_log password=你的密码 dbname=snort_log host=127.0.0.1

注意localhost一定要改成127.0.0.1,否则运行snort是会提示连不上mysql

○4如果你安装snort的时候,选择安装了Spoink-v1.0的话,就需要添加一个Spoink的输出插件 我是在刚刚修改的mysql的上面加了上去

output alert_pf: /etc/snort/wl.txt,sn_table

一切做完以后,保存退出

○5定制你需要的规则 搜索

include $RULE_PATH

把你需要的rule前面的井号删除,我运行的提示telnet.rules的第43行规则有问题,于是手动把那条规则注释调了,如果你只是学习的话,建议不开启其他规则,并把telnet注释掉,注释掉telnet.rules(43)

vi /etc/snort/rules/telnet.rules

把第43行加上井号,保存退出

D下载snort规则

下载snort的规则有两种方法,一是到snort.org上自己下载,然后手动解压到/etc/snort/里面,注意要下载Snort-2.6的规则;如果你想以后实现定时升级的话,可以用Oinkmaster来实现

○1 Oinkmaster 安装

cd /usr/ports
make search key=Oinkmaster
net/oinkmaster
make install

○2 Oinkmaster使用

首先你要在snort.org注册一个账号,登陆后在登陆页面的最下面有Oinkmaster的配置例子,点oink code下面的Get code会出现一串字符,把这个字符保存下来

vi /etc/oinkmaster.conf

搜索Example for Snort 2.4,把这个例子前面的井号去掉,并把这个例子修改成

url =http://www.snort.org/pub-bin/oinkmaster.cgi/你的oink code/snortrules-snapshot-2.6.tar.gz

保存退出,输入

oinkmaster -C /etc/oinkmaster.conf -o /etc/snort/rules

提示完成以后你的snort规则就已经更新的最新了

E启用PF

系统默认的情况下PF是关闭的,为了以后测试Spoink和snort2c,现在需要把PF打开,输入

pfctl –e

来启用PF,如果要关闭的话,输入

pfctl –d

如果要在让PF在系统启动启用,需要修改/etc/rc.conf

vi /etc/rc.conf

搜索pf,到第二个搜索到的地方 把前面的

pf=NO

改成

pf=YES

现在的环境是作防火墙的,所以还要启用路由转发功能 输入

sysctl net.inet.ip.forwarding=1

来启用ipv4的路由功能,如果要让系统启动是启用路由转发功能,需要修改/etc/sysctl.conf

vi /etc/sysctl.conf

把第七行

#net.inet.ip.forwarding=1

前面的井号删除,保存后退出

F设置PF与Spoink协同

Spoink的工作原理大概是:从snort的报警日志中过滤出非法访问的受保护主机的ip(攻击源),再把这些攻击源ip发送到PF中加以处理,snort2c的工作原理和Spoink类似。现在我们再看一下snort.conf中Spoink配置,

output alert_pf: /etc/snort/wl.txt,sn_table

其中定义了两部分:

/etc/snort/wl.txt 这是设置受保护ip的文档。可以使用CIDR地址格式,而snort2c不行

sn_table 这是定义的PF中的table,对攻击源的处理就是通过对这个table来实现的


○1建立/etc/snort/wl.txt

vi /etc/snort/wl.txt

可以输入CIDR格式的地址

我直接写10.1.1.0/24

保存退出

○2在PF中加入sn_table,你可以现在用vi编辑,也可以等下试试web的PFW编辑

vi /etc/pf.conf

加入

table <sn_table> persist
block in quick from <sn_table> to any

保存退出以后要检测、加载PF新规则,输入

pfctl -Nf /etc/pf.conf

检测规则,如果没有提示错误的话,输入

pfctl -f /etc/pf.conf

加载新规则

G测试snort+PF的配置

输入

snort -c /etc/snort/snort.conf -u _snort -g _snort -i 外网网卡名称 -l /var/snort/log

不知道你的网卡的话,输入

ifconfig –a

看一下输出,不提示错误的话就说明没有问题了,可以使用

snort -c /etc/snort/snort.conf -u _snort -g _snort -l /var/snort/log -D &

让snort后台运行,返回的是一个snort的进程号,如果想让snort在系统随启动的话,需要和mysql一样编辑rc.local

vi /etc/rc.local

加入

if [ -x /usr/local/bin/snort ] ; then
/usr/local/bin/snort -c /etc/snort/snort.conf -u _snort -g _snort -t /var/snort -i 外网网卡名称-l /var/snort/log -D &
echo -n ' snort  \n'
fi
H Snort2c+PF的实现

Snort2c是功能和Spoink一样的程序,安装简单,使用方便,不足之处就是受保护主机不能用CIDR格式表示

Snort2c-v0.2下载地址:http://snort2c.sourceforge.net/

○1安装,我把我下载的snort2c-0.2.tar.gz放在了home里面

cd ~
tar xzvf snort2c-0.2.tar.gz
cd snort2c-0.2/snort2c
make
make install
cd ../mons2c
make
make install

snort2c安装完以后会有两个程序Snort2c和mons2c。

○2Snort2c用来监控snort的报警文件中攻击受保护主机的,和Oinkmaster一样需要指定一个受保护主机列表,我是建立在/etc/snort下面,和Oinkmaste的wl.txt放在一起,名称是snort2c_ip

vi /etc/snort/snort2c_ip

输入几个收保护的主机ip每行一个,不能加子网掩码,我输入的是

10.24.1.2
10.25.1.3

输完以后保存退出,和Oinkmaste一样需要在PF中加入table

vi /etc/pf.conf

加入

table < snort2c> persist
block in quick from < snort2c> to any

保存退出后,需要更新一下PF规则,输入

pfctl -Nf /etc/pf.conf

检测规则,如果没有提示错误的话,输入

pfctl -f /etc/pf.conf

加载新规则 运行snort2c的命令是

snort2c -w 你的受保护主机ip表位置

○3mons2c是用来管理攻击源ip的

显示被屏蔽的ip

mons2c –l

清空被屏蔽的ip

mons2c –f

删除被屏蔽的ip

mons2c -d 要删除的ip

○4如果想让snort2c在系统随启动的话,需要编辑rc.local

vi /etc/rc.local

加入

if [ -x /usr/local/bin/snort ] ; then
/usr/local/sbin/snort2c –w 你的受保护主机ip表位置 -s
echo -n ' snort2c  \n'
fi

三 WEB界面安装

安装WEB界面需要apache(系统已经默认安装)、BASE和PFW。

BASE 1.3.9   下载地址http://sourceforge.net/projects/secureideas
PFW-0.7.8.tgz下载地址http://www.allard.nu/pfw/download/pfw-0.7.8.tgz

1、apache设置

OpenBSD中apache是默认安装的,而默认情况下apache是没有运行,所以我们要让apache运行起来。WEB服务器有两个端口没有加密的80端口和加密的443端口。80端口传输的是明文,安全性比较低,所以不推荐作为管理的WEB界面上使用,而443端口是经过证书加密的,安全性能要好很多,OpenBSD已经默认安装了ssl,需要我们生成一个证书来加密WEB通信。

1)生成证书

/usr/sbin/openssl genrsa -out /etc/ssl/private/server.key 1024
/usr/sbin/openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

需要填写一些信息

Country Name (2 letter code) []:(国家代码中国是CN)
State or Province Name (full name) []:(省的全称)
Locality Name (eg, city) []:(所在城市名)
Organization Name (eg, company) []:(组织名称)
Organizational Unit Name (eg, section) []:(部门名称)
Common Name (eg, fully qualified host name) []:(主机名)
Email Address []:(邮箱地址)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(要求密码)
An optional company name []:(任意公司名)

2)安装证书,设置证书有效期为1年(365天)

/usr/sbin/openssl x509 -req -days 365 -in /etc/ssl/private/server.csr -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

如果提示pem错误

cd /etc/ssl/private/
cp server.csr server.pem

然后再重新输入

3)修改apache配置

apache的配置文件是/var/www/conf/httpd.conf

vi /var/www/conf/httpd.conf

搜索DirectoryIndex,加入index.php,变成

DirectoryIndex index.html index.php

保存退出

4)启用apache

证书安装完毕以后,就可以启用带有ssl支持的apache了,首先要修改apache的运行参数

vi /etc/rc.conf

搜索http,并修改为

httpd_flags="-uDSSL"

保存后退出。其中DSSL是启用ssl加密支持-u是禁用apache的chroot功能,禁用是因为要让PFW能修改/etc/pf.conf文件,在chroot模式这是不能实现的

现在启用apache,输入

apachectl start

如果提示apache已经启动,现在你在IE里面输入主机ip就可以看到欢迎界面

5)测试apache php mysql的环境

apache默认的web目录是/var/www/htdocs,里面的文件都不需要,我们先把里面的文件删除

rm -rf /var/www/htdocs/*

建立一个phpinfo文件

vi /var/www/htdocs/phpinfo.php

输入

<?php
phpinfo();
?>

保存退出后,在IE中输入

https://主机ip/phpinfo.php

来测试apache的加密传输,查看apache支持情况,如果显示正确的话,就可以进行下面的配置了

2、BASE设置

BASE需要运行除了需要php外,还需要pear、Image_Color、Image_Canvas-alpha、Image_Graph-alpha和adodb库支持。其中adodb是必须的,如果你不需要BASE输出图形表的话,前面四个不用安装

1)安装pear图形库

cd /usr/ports/
make search key=pear |grep Path
cd www/pear
make install

会提示partial-pear-1.5.0p1失败,需要删除partial-pear-1.5.0p1

pkg_delete partial-pear-1.5.0p1

然后再输入

make install

安装完成以后,就需要安装剩下的三个图形库

pear install Image_Color
pear install Image_Canvas-alpha
pear install Image_Graph-alpha

2)安装adodb库

adodb502a.tgz 下载地址 http://adodb.sourceforge.net/#download

我把下载好的adodb502a.tgz放在home里面,现在要文件解压缩到apache目录下

cd ~
tar xzvf adodb502a.tgz -C /var/www/
cd /var/www/
mv adodb5 adodb

3)开始安装BASE

解压BASE并修改权限 我把下载的BASE放在了home里面,下面要把BASE解压缩到/var/www/htdocs里面并修改权限

cd ~
tar xzvf base-1.3.9.tar.gz -C /var/www/htdocs/
cd /var/www/htdocs/
mv base-1.3.9 base
chown -R www *
chmod -R 755 *

下面就可以WEB安装设置BASE了

A Step 1

IE中输入

https://你的主机ip/base/

如果显示的页面中出现Config Writeable YES

就可以继续设置,不是的话就需要按上一步配置权限

点击Continue,选择语言为中文

输入adodb的位置为,注意最后不带”/”

/var/www/adodb

然后点击提交查询内容

B在setp2的界面里面

数据库默认mysql不用改

Database Name:snort_log
Database Host:127.0.0.1
Database Port:留空
Database User Name: snort_log
Database Password:你设置的密码
Use Archive Database:前面点上对号
Archive Database Name:snort_bak
Archive Database Host:127.0.0.1
Archive Database Port: 留空
Archive Database User Name:snort_bak
Archive Database Password:你设置的密码
C在setp3的界面里面

选中Use Authentication System,并设置管理账号、密码和用户名全称

D在setp4的界面里面

点击Creat BASE AG 来创建BASE的table,成功的话会出现一些成功的提示

E在setp5的界面里面

出现登陆界面,输入你设置的用户名和密码就可以进入了,但是第一次登陆以后会提示snort_bak错误,这是因为BASE没有在snort_bak创建table,这里就需要手工输入

cd /var/www/htdocs/base/sql/
mysql -u snort_bak -p< create_base_tbls_mysql.sql snort_bak

输入你设置的snort_bak的密码,完成以后再次登陆BASE就不会提示错误了

3、安装PFW

PFW是PHP写的PF控制界面,要求系统中安装了SQLite,安装PFW以前,先要检测以下SQLite 是不是已经安装,输入

php -i | grep SQLite

如果显示不是什么都没有的话,就可以开始安装PFW了

A 解压PFW并修改权限,导入数据

我把下载的pfw-0.7.8.tgz放在了home里面,下面要把PFW解压缩到/var/www/下面并修改权限,并导入数据

cd ~ 
tar xzcf pfw-0.7.8.tgz -C /var/www/
cd /var/www/pfw
chown -R www:www conf
sqlite conf/config.db < docs/sql/sqlite.sq
B 在apache配置文件中加入PFW
vi /var/www/conf/httpd.conf

加入

Alias /pfw "/var/www/pfw/web/"
<Directory "/var/www/pfw/web">
    AllowOverride None
    Order allow,deny
Allow from all 
</Directory>

保存退出以后,重启apache,输入

apachectl restart
C 修改sudo配置,

PFW可以把WEB编辑的PF规则安装到系统中,所以要有root的权限,输入

visudo

添加

www ALL = NOPASSWD: /var/www/pfw/bin/*

保存退出,现在可以用在IE里面

http://主机ip/pfw/

来进行PF规则配置

四、优化存储性能

整个系统到这里就可以已经可以正常使用了,但是硬盘的性能会是整个系统的瓶颈,可以用softupdate来缓解

vi /etc/fstab 

加入softdep,我的fstab是

/dev/wd0a / ffs rw,softdep 1 1
/dev/wd0i /home ffs rw,nodev,nosuid,softdep 1 2
/dev/wd0e /tmp ffs rw,nodev,nosuid,softdep 1 2
/dev/wd0g /usr ffs rw,nodev,softdep 1 2
/dev/wd0h /var ffs rw,nodev,nosuid,softdep 1 2

然后输入reboot重启主机,安装过程到此结束!



《安装篇完》


后记:

终于写完了《构建基于OPENBSD 4.2 AMD64 stable的主动防火墙》,现在的系统如果你是学习的话已经足够用了,但是绝对不要应用到生产环境,系统还有很大的瓶颈,整个系统的瓶颈是mysql,因为mysql执行查询很快,但是执行插入很慢,而snort的执行方式是将抓到的文件都插入到mysql里面,整个系统都在等待mysql作慢慢的插入工作。另外PF只是简单的将攻击IP屏蔽掉,这很合理吗?如果要应用与生产环境的话,还要进行优化配置,甚至是分布式部署(还记得snort的prelude选择吗?),这些问题都要等到第二篇――部署篇 来解决

如果您发现本文有什么不对的地方,请和我联系

作者:尘羽星翔
E-mail:wosl2001@gmail.com

同时,希望欢迎有同样兴趣的朋友来一起研究

QQ群:51126069

欢迎您的加入!

个主工具