使用Jail和ipfilter结合构建高安全服务器【原创】

发表于:2007-06-09来源:作者:点击数: 标签:
[code:1:88ab746125] 使用Jail和ipfilter结合构建高安全 服务器 作者信息 三轮车夫★可乐∮,EasyPP,Easy2go MSNeasy2go@msn.comQQ223480Mailpostmaster@easy2go.org 版权声明 本文档版权归三轮车夫★可乐∮,EasyPP,Easy2go所有!如需转载,请保留该声明,谢

[code:1:88ab746125]
使用Jail和ipfilter结合构建高安全服务器
作者信息:
三轮车夫(★可乐∮,EasyPP,Easy2go)
MSN:easy2go@msn.com   QQ:223480  Mail:postmaster@easy2go.org
版权声明:
本文档版权归三轮车夫(★可乐∮,EasyPP,Easy2go)所有!如需转载,请保留该声明,谢谢!
前言:
以前写过一份《使用jail构建安全的Vsftpd》的文章(见www.cnfug.org)!对jail的使用有了一个初步的了解!这篇文章应该是上一篇文章的姐妹篇吧!闲话少说!步入正题!
上一篇文章只是通过jail来chroot一个服务(vsftpd)以实现服务的安全管理!这篇文章着重点在jail一个独立的系统!构建的网络大体的拓扑结构如下!
 
具体实现方法:通过Jail做一个独立的系统,在该系统上面提供一些网络服务,然后在该FreeBSD系统上通过ipfilter构建一个防火墙,同时通过ipnat对jail的系统做相应的端口映射!

系统配置参数:
OS:FreeBSD 4.8 Stable
IP: fxp0 10.0.1.1 192.168.1.201
Dns:10.0.0.251
Defaultrouter:10.0.1.1
ifconfig显示的信息:
/**
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.0.1.1 netmask 0xff000000 broadcast 10.255.255.255
        inet 192.168.1.201 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:00:e2:2d:8b:a5
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
**/
实现步骤:
一:建立jail环境:(安装系统的全部源代码)
mkdir –p /jail/Jail-A/
建立一个shell脚本jail.sh,内容如下:
D=/jail/Jail-A
cd /usr/src
mkdir -p $D
make world DESTDIR=$D
cd etc
make distribution DESTDIR=$D -DNO_MAKEDEV_RUN
cd $D/dev
sh MAKEDEV jail
cd $D
ln -sf dev/null kernel
编辑/etc/make.conf将一些不需要的东西去掉!(可以根据你具体情况进行设定)
CPUTYPE=i686
COPTFLAGS= -O –pipe
INSTALL=install –C
NO_CVS= true    # do not build CVS
NO_BIND=        true    # do not build BIND
NO_FORTRAN=     true    # do not build g77 and related libraries
NO_I4B= true    # do not build isdn4bsd package
NO_LPR= true    # do not build lpr and related programs
NO_MAILWRAPPER=true     # do not build the mailwrapper(8) MTA selector
NO_SENDMAIL=    true    # do not build sendmail and related programs
NO_SHAREDOCS=   true    # do not build the 4.4BSD legacy docs
NO_X=           true    # do not compile in XWindows support (e.g. doscmd)
NOGAMES=        true    # do not build games (games/ subdir)
NOINFO= true    # do not make or install info files
NOLIBC_R=       true    # do not build libc_r (re-entrant version of libc)
NOMAN=          true    # do not build manual pages
NOUUCP= true    # do not build uucp related programs
执行jail.sh,开始建立jail的基本环境
#sh jail.sh
执行完毕以后进行如下操作:
#ifconfig fxp0 alias 192.168.1.201 netmask 255.255.255.0
或者在/etc/rc.conf中加入:
ifconfig_fxp0_alias0="inet 192.168.1.201  netmask 255.255.255.0"
#mkdir –p /jail/Jail-A/stand
#cp /stand/sysinstall /jail/Jail-A/stand/
#touch /jail/Jail-A/etc/fstab
#vi /jail/Jail-A/etc/rc.conf 加入如下内容:
sendmail_enable=”NONE”
sshd_enable=”YES”  //这个一定需要!可以远程进行管理
inetd_enable=”YES”  //如果打开一定要添加下面一行
inetd_flags=”-wW –a 192.168.1.201”  //这个修改成你jail的系统的地址!
syslogd_enable=”YES”
syslogd_flags=”-ss”
  开始配置jail的系统:
#jail /jail/Jail-A/ powerbsd.org 192.168.1.201 /bin/csh
如果没有任何错误,执行:
#passwd root 修改root密码
#/stand/sysinstall ->Configure->
选择: Time Zone 设置时区
选择: Networking 配置网络的一些信息
选择User Management 建立一个wheel组的帐号
选择: Startup 配置需要的一些服务
退出,编辑/jail/Jail-A/etc/rc.conf去掉一些无用的信息!
可以参照如上的一些信息!
测试启动jail的系统:
#jail /jail/Jail-A/ powerbsd.org 192.168.1.201 /bin/sh /etc/rc
如下是我机器上面启动jail的信息!
/**
#jail /jail/Jail-A/ powerbsd.org 192.168.1.201 /bin/sh /etc/rc
Skipping disk checks ...
adjkerntz[662]: sysctl(set_disrtcset): Operation not permitted
Doing initial network setup:.
ifconfig: ioctl (SIOCDIFADDR): permission denied
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
Additional routing options: TCP keepalive=YESsysctl: net.inet.tcp.always_keepalive: Operation not permitted
.Routing daemons:.
Additional daemons: syslogd.
Doing additional network setup:.
Starting final network daemons:.
ELF ldconfig path: /usr/lib /usr/lib/compat
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout
Starting standard daemons: inetd cron sshd.
Initial rc.i386 initialization:.
Additional ABI support:.
Local package initialization:.
Additional TCP options:.
2003年 7月14日 星期一 16时26分43秒 ICT
**/
现在你可以通过ssh登陆到jail的系统了!为了测试方便,我通过inetd.conf提供了ftp和telnet的服务!
下面是我通过ssh登陆到jail系统上面的一些信息:
/**
powerbsd# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem), 3(sys), 4(tty), 5(operator), 20(staff), 31(guest)
powerbsd# uname -a
FreeBSD powerbsd.org 4.8-STABLE FreeBSD 4.8-STABLE #1: Mon Jul 14 14:27:53 CST 2003     root@powerbsd.org:/usr/src/sys/compile/PowerBSD  i386
powerbsd# ifconfig
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.201 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:00:e2:2d:8b:a5
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
powerbsd# ps auxww
USER PID %CPU %MEM   VSZ  RSS  TT  STAT STARTED      TIME COMMAND
root  748  0.0  0.1   400  252  p1  R+J   4:30PM   0:00.00 ps auxww
root  709  0.0  0.3  1092  788  ??  IsJ   4:26PM   0:00.00 /usr/sbin/inetd -wW -a 192.168.1.201
root  711  0.0  0.3  1032  764  ??  SsJ   4:26PM   0:00.00 /usr/sbin/cron
root  713  0.0  0.8  2632 2080  ??  IsJ   4:26PM   0:00.12 /usr/sbin/sshd
root  727  0.0  0.9  5332 2296  ??  IJ    4:27PM   0:00.03 sshd: PowerBSD [priv] (sshd)
PowerBSD 729  0.0  0.9  5332 2352  ??  SJ    4:27PM   0:00.03 sshd: PowerBSD@ttyp1 (sshd)
PowerBSD  730  0.0  0.4  1364  972  p1  IsJ   4:27PM   0:00.01 -csh (csh)
root  732  0.0  0.4  1368  972  p1  SJ    4:27PM   0:00.02 -su (csh)
root  702  0.0  0.3   992  664  ??  SsJ   4:26PM   0:00.00 /usr/sbin/syslogd -ss
powerbsd#
**/
到现在为止,jail的基本系统已经配置完毕!
现在开始配置ipfilter,来实现端口的映射!

二.配置FreeBSD的ipfiter和ipnat
#cd /sys/i386/conf
#cp GENERIC PowerBSD
在PowerBSD这个核心配置文件中加入:
options         IPFILTER                 #ipfilter support
options         IPFILTER_LOG            #ipfilter logging
#config PowerBSD
#cd ../../compile/PowerBSD/
#make depend;make;make install
vi /etc/rc.conf 在改文件中添加如下参数:
ipfilter_enable="YES"  //ipfilter
ipfilter_program="/sbin/ipf"
ipfilter_rules="/etc/ipf.rules"
ipnat_enable="YES" //ipnat
ipnat_program="/sbin/ipnat -CF"
ipnat_rules="/etc/ipnat.rules"
ipmon_enable="YES"   //ipfilter log
ipmon_program="/sbin/ipmon"
ipmon_flags="-Ds"
建立ipfilter需要的文件:
touch /etc/ipf.rules    
//因本篇文章重点不在ipfiter防火墙的建立,具体的信息可以参照/usr/share/example/ipfilter/中的文档
touch /etc/ipnat.rules
touch /var/log/ipflog
 vi /etc/ipf.rules(如下规则是我测试的规则,不是很完善!具体请参照ipfilter的文档)
pass out on fxp0 all
pass in on fxp0 all 
pass out quick on lo0 all
pass in quick on lo0 all
block in proto icmp from any to 10.0.1.1 
pass in quick on fxp0 proto tcp from any to any port = 22 flags S/SA keep state
pass in quick on fxp0 proto tcp from any to any port = 80 flags S/SA keep state
pass in quick on fxp0 proto tcp from any to any port = 23 flags S/SA keep state
pass in quick on fxp0 proto tcp from any to any port = ftp flags S/SA keep state
pass in quick on fxp0 proto tcp from any to any port = ftp-data flags S/SA keep state
pass out quick on fxp0 proto udp from any to any port = 53
block in log quick on fxp0 proto tcp form any to any port = 3306
block in quick all
  vi /etc/ipnat.rules 添加nat的规则
rdr fxp0 10.0.1.1/32 port 21 -> 192.168.1.201 port 21
rdr fxp0 10.0.1.1/32 port 23 -> 192.168.1.201 port 23
rdr fxp0 10.0.1.1/32 port 80 -> 192.168.1.201 port 80
vi /etc/rc.local 在该文件中添加启动jail的代码
jail /jail/Jail-A/ powerbsd.org 192.168.1.201 /bin/sh /etc/rc
注意不要忘记在/etc/rc.conf中添加:
ifconfig_fxp0_alias0="inet 192.168.1.201  netmask 255.255.255.0"
三.最后重新启动你的系统,进行测试:
telnet 10.0.1.1
ftp –A 10.0.1.1
如果成功,一切OK!
总结:
以上通过ipfilter的nat功能,结合jail强大的功能,可以构建非常安全的服务器系统!但是具体服务在jail下面执行的效率怎么样?我没有具体进行测试!希望测试过的朋友多多指点!如上只是记录我的一个测试过程!在整理的过程中难免会有一些错误!请发现的朋友告诉我,我进行修改!谢谢!
如果你们在按照该文档配置过程中遇到什么问题,可以发邮件给我,邮件地址在这篇文档的刚开始已经说明! 
[/code:1:88ab746125]



拓扑图


 gsging 回复于:2003-07-14 18:50:16
像这等好文章,不论看没看懂,一律收藏先   

 aborigen 回复于:2003-07-15 10:06:00
[quote:25350822cb="★可乐∮"][/quote:25350822cb]     

好文,狂顶 !!!!       

 hdcola 回复于:2003-07-15 16:34:43
这样做。。。。。。。。。感觉有点过于复杂了罢。不过总是一个尝试。

 ★可乐∮ 回复于:2003-07-15 18:36:22
[quote:12f80d886f="hdcola"]这样做。。。。。。。。。感觉有点过于复杂了罢。不过总是一个尝试。[/quote:12f80d886f]     
可以说出你的想法吗?
请多多指教啦!
我做上面的东西,只是测试FreeBSD的一些功能!
以后可以结合更多的功能做更多的事情!
当然啦!在很多的细节上面不能够深入的去进行分析!
以后可以进一步改进!     
而且做上面那个东西,可以了解一些思路的可行性!
你说呢?

 南非蜘蛛 回复于:2003-07-15 18:40:13
加个精华,鼓励一下吧,呵呵

 ★可乐∮ 回复于:2003-07-15 18:44:05
加精华,不加精华,无所谓的啦!
更重要的是理解更多的东西!
从我上次那篇文档,hdcola提出了一些建议!我就做了进一步的学习!
也就是这篇文档的诞生!在这里对hdcola表示感谢!
希望能够得到更多朋友的建议!
我想,这样我可以做得更好!

 hdcola 回复于:2003-07-15 18:58:24
[quote:81641bec84="★可乐∮"]    
可以说出你的想法吗?
请多多指教啦!
我做上面的东西,只是测试FreeBSD的一些功能!
以后可以结合更多的功能做更多的事情!
当然啦!在很多的细节上面不能够深入的去进行分析!
以后可以进一步改进!   ..........[/quote:81641bec84]     

我一直认为:
本机带的防火枪和一般的外部的防火枪到底该如何对待?bsd带有ipfw和ipfilter,可是是不是每台机器都应该这样做。   我做的机器大多并不装ipfw或ipfilter。 而是在外部用更统一的办法来管理安装问题,这样的分布到所有的机器上进行安全管理的办法感觉对于BSD这样的管理第一的系统来说有点。。。。。 

呵呵,测试BSD的功能感觉很不错的了,但是jail最差的功能就是在你试的这个东东上面了----net。对于jail来说,操作自己的网络模块简直是一个灾难。所有在jail下的网络应用现在都还不能很好的支持。我想这些需要期待BSD的jail group的工作。

你的make.conf中的配置不错,这样可以进一步的减少jail安装的目标大小。

但是有一点:
sshd_enable=”YES”  //这个一定需要!可以远程进行管理 
这项如果在host和vhost中加上了。。。。。。。。。应该冲突出错才对。应该给大家说清楚。

 ★可乐∮ 回复于:2003-07-15 19:24:05
看你说的,是有点道理,但是根据我具体测试的结果,sshd是没有任何问题!
我做了一个nat,大概就是这样的!
rdr fxp0 10.0.1.1/32 port 222 -> 192.168.1.201 port 22
然后我在外部通过ssh,进行登陆,端口为222端口!是没有任何问题的!
没有出现你说所的回产生冲突!
还有,今天看到了security的mail list,上面公布了一个jail的patch
可以在jail下面使用多个ip地址!
应该对目前来说,是一个非常不错的功能!
而且jail和linux下面的chroot来进行比较的话,应该是非常不错的一个东西!
而且我可以做一个jail的系统,来做成一个密罐!这样对于我学习安全非常有用!
还有,我不想在本地系统安装一些服务器,我可以在jail的系统上面进行测试!
而且我这边在jail的系统上面成功配置了Apache+php+Mysql
外部的访问方式,还是通过ipnat做的一个端口映射!
以前对于jail的认识只是初步的一些了解!
看了man 2 jail,还有/usr/share/doc/papaers/jail的文档!对jail有了一个比较深入的了解!
我同样希望FreeBSD的jail小组能够开发出功能更强大的jail!
还有你说你的服务器上面都没有安装ipf或者ipfw,其实在我调试ipf和ipfw的时候出现了不少的问题!
有好几次,我自己都远程登陆不上我的测试机器了!
只好跑到我们公司的机房,接上键盘和显示器,对rules进行修改!
呵呵……
还有你可以具体说说你对你的FreeBSD如何做安全设置的呢?
这不光是我一个人好奇,我想在论坛中的朋友都想进一步的深入了解!
希望你不惜赐教!
谢谢!

 hdcola 回复于:2003-07-16 06:45:27
我也发现了sshd不冲突了,查了一下rc中的脚本,看来现在的版本有所改进,原来的ssh启时必须在sshd.conf中加入真听的local才成,不然会冲的,vhost中的sshd会被 kkkkk

 i2era 回复于:2003-07-15 21:24:12
[quote:7895185659="hdcola"]    
sshd_enable=”YES” //这个一定需要!可以远程进行管理 
这项如果在host和vhost中加上了。。。。。。。。。应该冲突出错才对。应该给大家说清楚。 
.[/quote:7895185659]
东哥,好象没有冲突呀
     [code:1:7895185659]
[bsdnat etc]#pwd
/usr/jail/i2/etc
[bsdnat etc]#cat rc.conf
# -- sysinstall generated deltas -- # Sun Mar 30 15:14:14 2003
# Created: Sun Mar 30 15:14:14 2003
network_interfaces=""
inetd_enable="NO"
syslogd_flags="-ss"
sshd_enable="YES"                # Enable sshd
sendmail_enable="NONE"
update_motd="NO"

[bsdnat /etc]#pwd
/etc
[bsdnat /etc]#cat rc.conf
#
...
sshd_enable="YES"                # Enable sshd
...
#

[bsdnat ~]#ps ax |grep ssh
   93  ??  Is     0:00.65 /usr/sbin/sshd
  163  ??  IsJ    0:01.18 /usr/sbin/sshd

[bsdnat ~]#ifconfig fxp0
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 172.16.0.254 netmask 0xfffffffc broadcast 172.16.0.255
        inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255

[bsdnat ~]#sockstat -4 |grep ssh
root     sshd       163    3 tcp4  10.0.0.2:22       *:*
root     sshd        93    3 tcp4   *:22                  *:*

[bsdnat ~]#uname -r
4.7-RELEASE

/etc/ssh的东东都是默认的,没有修改
已测试client可以ssh到172.16.0.254(host)和10.0.0.2(vhost)

[/code:1:7895185659]

 hdcola 回复于:2003-07-16 06:52:28
jail之我所用:

1.学习:jail的目标系统可以在5分钟之内装好并初始化完成。这不是一个最好的学习环境吗?
2.安全防护:如果你给一个人登录你的机器的权力,哪么给他一个jail的vhost罢。他是root,他是可以做所有的管理员,但是要知道,他的系统在host中每天被backup一次数据,安全再差也不怕了。
3.利用资源:一台机器的cpu和ram实际上远没有用完,而jail并不像vmware一样的使用资源,它是在kernel级进行资源共享,也就是说系统中只有一个kernel。所以它自身的资源使用很少,但又可以真正充分的使用一台机器中完全没有被用到的资源。
4.认证分离:要知道掌握一切的host的认证是最珍贵的,而一个vhost中的帐户可以加许多的。充分享受当上帝的乐趣罢 

还有其它什么,一时还说不上来。使用一个东东在于自己的感觉,不在于一个固定的方法。大家说对不对?

 hdcola 回复于:2003-07-16 06:59:52
我的机器的安全:
呵呵,其实小新知道一点的。

所有的机器在公网上,但在idc内部是一个本地子网。

负载量真的很大的机器会使用一台防火枪,通常它是专用的,用BSD的机会很少。如果网络流量不大(也是我最多的情况),都在峰值10M以内,我会使用一台BSD集中做防火枪来防护外部的服务器。

另会有一台服务器,配置双IP或是能直接从外网访问到,这有可能是一个安全漏洞,但是很重要的,它对外只提供一个VPND的服务,用来真正的网管进入内部进行管理。 

通常我的机器都不装ipfw或是ipnat的,原因:装之后网络负载能力明显不如不装的时候。出了问题,死都没办法,老大,给自己留条后路好不好。所有的机器都有防火枪到是感觉好了,可是,老大,哪么多台机器的规则你管的过来吗?如果要变,你变的过来吗? 

所以,集中还是统一让大家自己选择了?

还有一台机器做防火枪的同时做nat来负载均横也是我常用的办法,感觉很好的。即解决负载的问题,也解决安全的问题。

希望大家都来说说自己的安全方案。 其实我也没什么方法的,做一件事看一件事的内部原则,使用最合适于它的方法来形成它的安全方案,不太可以全部一样的。

 kinux 回复于:2003-07-16 09:24:29
说的也是, 我安裝过ipf和ipfw, ipf感觉是沒有什么慢, 但用了ipfw很快就发现这个问题...

最好还是用hardware 防火牆(有錢的话)...

我只有兩台測试机子, 沒有网络可言...

 i2era 回复于:2003-07-16 09:59:49
主要还是与ipfw配合的那个natd比较慢

 ★可乐∮ 回复于:2003-07-16 10:09:24
我还是用ipfilte习惯!
ipfw,总是感觉不容易掌握,也许是我太笨的原因吧!

 kinux 回复于:2003-07-16 11:02:28
[quote:67c4eca1a5="★可乐∮"]我还是用ipfilte习惯!
ipfw,总是感觉不容易掌握,也许是我太笨的原因吧![/quote:67c4eca1a5]     

我也是有这样的感觉..

 i2era 回复于:2003-07-16 11:18:06
[quote:8afbc04045="★可乐∮"]我还是用ipfilte习惯!
ipfw,总是感觉不容易掌握,也许是我太笨的原因吧![/quote:8afbc04045]     
我也是这么认为,ipf的规则语法比较简单

 黑夜编码人 回复于:2003-07-16 12:36:41
我喜欢ipfilter主要是因为它通用,这样如果用openbsd,netbsd,solaris就不想再去专门学习防火墙的语法了。

我这种懒人就喜欢方便、通用。 

 ★可乐∮ 回复于:2003-07-16 13:17:42
但是据说,ipfw的效率比ipfilter要高!
好像最好的防火墙是OpenBSD下面的pf!

 wmeng 回复于:2003-07-16 14:48:57
[quote:69d90d13e0="i2era"]主要还是与ipfw配合的那个natd比较慢[/quote:69d90d13e0]     

我其实不知道我们这样做的防火墙的安全性能到底有多高?

比硬件的有逊色吗?

我希望在安全方面有非常大的优势

 powerplane 回复于:2003-08-06 12:04:34
好文章,偶最近也看jail。
一个好的jail也应该注意jail base的安全性,例如devfs的规则设置,不能够让人随意访问/dev/里头的东东。
偶同意hdcola提出的5分钟部署jail的提议。关键要有好的jail base就行了。

原文转自:http://www.ltesting.net