FreeBSD自带有一个基于包过滤的防火墙--ipfw,虽然功能没有专业防火墙那么强大,但是应付一个Web站点的安全还是足够的,所以我们决定选用该防火墙来保护我们的Web服务器。


1. 安装ipfw

IPFW 的主要部分是在内核中运行的, 因此会需要在FreeBSD内核配置文件中添加部分选项。(注意,如果你没有安装FreeBSD核心源代码,是无法进入以下目录的,所以运行之前一定要先安装内核源代码)我们先进入内核配置文件:

# cd /sys/i386/conf
# cp GENERIC ./kernel_fw

打开内核配置文件:
# ee ./kernel_fw



添加四个选项,不需要后面的注释信息:
options IPFIREWALL # 将包过滤部分的代码编译进内核。
options IPFIREWALL_VERBOSE
# 启用通过syslogd记录的日志。如果没有指定这个选项,即使您在过滤规则中指定记录包, 也不会真的记录它们
options IPFIREWALL_VERBOSE_LIMIT=10
# 限制通过 syslogd( 记录的每项包规则的记录条数。在恶劣的环境中如果您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这将把默认的规则动作从 ``deny'' 改为 ``allow''。这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 如果您经常使用 ipfw( 来解决一些问题时它也非常有用。尽管如此,在使用时应该小心,因为这将使防火墙敞开, 并改变它的行为。


编译内核:

# /usr/sbin/config kernel_fw
# cd ../compile/kernel_fw (注意你的版本,如果是低于5.0的版本用../../compile/kernel_fw)
# make depend
# make
# make install



重 启系统。注意,我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项,就是说默认系统启动后是打开防火墙的,并且防火墙默认是不允许任何连接的(deny from any to any),所以一定要在本地操作,否则你将被“锁在门外”,如果你选择了该选项则可以使用ssh等连接不受影响,不过这相对不安全。


2. 配置ipfw

如果配置普通情况下的规则,使用命令配置的模式:
ipfw的配置命令:ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]
例如:

# ipfw add allow tcp from any to 10.10.10.1 80 #允许外界访问我的web服务
# ipfw add allow tcp from any to 10.10.10.1 21 #允许外面访问我的ftp服务
# ipfw add allow tcp from any to 10.10.10.1 22 #允许外界访问我的ssh服务



如果使用规则包的形式,那么查看下面内容。
系统启动后,我们还要配置rc.conf文件来运行我们的防火墙:

# ee /etc/rc.conf



加入如下内容:

gateway_enable="YES" # 启动网关
firewall_enable="YES" # 激活firewall防火墙
firewall_script="/etc/rc.firewall" # firewall防火墙的默认脚本
firewall_type="/etc/ipfw.conf" # firewall自定义脚本
firewall_quiet="NO" # 起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。
firewall_logging_enable="YES" # 启用firewall的log记录。



设置完成后我们再编辑/etc/syslog.conf文件:

# ee /etc/syslog.conf
加入以下行:
!ipfw
*.* /var/log/ipfw.log



现在到了最重要的编辑规则包了:
# ee /etc/ipfw.conf
我们添加一下规则:(注意 10.10.10.1是我们服务器的IP)

######### TCP ##########
add 00001 deny log ip from any to any ipopt rr
add 00002 deny log ip from any to any ipopt ts
add 00003 deny log ip from any to any ipopt ssrr
add 00004 deny log ip from any to any ipopt lsrr
add 00005 deny tcp from any to any in tcpflags syn,fin
# 这5行是过滤各种扫描包

add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。
add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。
add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in
# 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。
# 如果你登陆服务器的IP不固定,那么就要设为:add 10000 allow tcp from any to 10.10.10.1 22 in

add 19997 check-state
add 19998 allow tcp from any to any out keep-state setup
add 19999 allow tcp from any to any out #这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)

########## UDP ##########
add 20001 allow udp from any 53 to 10.10.10.1 # 允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~
add 29999 allow udp from any to any out # 允许自己的UDP包往外发送。

########## ICMP #########
add 30000 allow icmp from any to any icmptypes 3
add 30001 allow icmp from any to any icmptypes 4
add 30002 allow icmp from any to any icmptypes 8 out
add 30003 allow icmp from any to any icmptypes 0 in
add 30004 allow icmp from any to any icmptypes 11 in
#允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。


五、Unix/Linux上的后门技术和防范

对 黑客来讲,入侵一个系统只是万里长征的开始,最主要的是长期占有一个肉鸡(傀儡机),所以,后门技术往往非常重要。对于我们来讲,总是处于被动的地位,百 密一疏,总有没有做到位的地方,谁都不能保证自己的系统是绝对安全的,所以不能避免我们可能会被入侵。黑客入侵后肯定会留后门,当然,除了那些高手,境界 非常高,入侵只是为了测试或者技术挑战,对于一般黑客来讲,入侵之后留个后门是很重要的,我们要防范,当然就要了解常用的后门技术,下面就简单的讲将在 Unix/Linux系统中比较常见的后门技术。

1. 帐号后门

最普通和原始的后门技术,一般就是在系统中添加一个管理员帐户。
# echo "heiyeluren:*:0:0::/root:/bin/sh" >;>; /etc/passwd
# echo "heiyeluren::0:0::0:0::/root:/bin/sh" >;>; /etc/shadow
给系统增加一个 uid和gid都为0(root)的帐号,无口令。
FreeBSD的密码是存储在 /etc/master.passwd里面的,那么后面的命令就应该改成:
# echo "heiyeluren:::::::::" >;>; /etc/master.passwd
也可以使用程序来实现:
/* Add super user */
#include "stdio.h"
#define PASSWD_PATH "/etc/passwd"
#define SHADOW_PATH "/etc/master.passwd"
main()
{
FILE *fd;
fd = fopen(PASSWD_PATH, "a+";
fprintf(fd, "heiyeluren:*:0:0::/root:/bin/shn";
fclose(fd);
fd = fopen(SHADOW_PATH, "a+";
fprintf(fd, "heiyeluren::0:0::0:0::/root:/bin/shn";
fclose(fd);
}
# gcc -o adduser adduser.c
# ./adduser


这种方法比较傻,一般比较容易发现,特别是系统帐户不多的时候。也有的用户名起的比较迷惑人,比如起个r00t的用户名,uid和gid都是0,这样如果不注意,可能就会被蒙混过关了。

* 防范方法:
这 种方法虽然比较容易发现,但是我们还是要防范,要多注意观察系统的帐户情况,本来我们系统帐户就不多,检查起来比较方便,另外也要注意那些比较少使用的帐 户是不是被更改过,比如默认的帐户有bind,它的shell是 /usr/sbin/nologin,就是不能登陆的,但是黑客入侵后把它改了,比如改为/bin/csh,那么对方就能登陆了,但是你确不知道。所以最 好办法是把/etc/passwd另外备份一份,不定期的检查,同时把/etc/passwd和/etc/master.passwd设为只有root才 能查看。


2. shell后门

这个比较常用,也比较流行。一般就是把root执行的shell程序通过setuid的形式把shell程序拷贝到其他能够执行的地方,然后只要用小权限用户执行该shell就能够直接获取root权限。
比如:

# cp /bin/sh /tmp/.backdoor
# chown root:root /tmp/.backdoor
# chmod +s /tmp/.backdoor


这 样只是把sh复制了,如果你喜欢其他shell,比如ksh、csh也可以,具体你看各个不同的操作系统而定。你就可以把那个加了s标记的shell程序 放到任何目录,最好是深一点,不容易被人发现的地方,比如/usr/local/share/man之类的目录,然后你使用小权限用户登陆后执行该 shell就可以了,比如我们上面复制的shell,我们只要用小权限用户登陆后执行:
$ /tmp/.backdoor
#
就可以了,当然,如何获得小权限用户,你可以使用暴力破解一些帐户,或者自己创建一个小权限的帐户。

* 防范方法:
首先给各个主要目录加上我们上面说的文件指纹校验,知道某个目录下有什么文件,如果多出了可疑文件可以仔细检查。还有使用find命令来查找有没有危险的root suid程序:

find / -type f (-perm -4000 -o -perm -2000 ) -print




3. Crontab服务后门

crontab命令就相当于windows下的at命令,定期执行某些任务。对黑客来讲,比如定期建立一个帐户,然后过多久就删除,这样管理员永远看不到系统中有后门,这样是非常保险的。。

* 防范方法:
cron的服务默认是存储在 /var/spool/crontab/root目录下,定期检查cron服务,看是否有异常的任务在执行,或者如果你不使用cron的话,直接关闭掉它。


4. rhosts后门

Rhosts 文件常常被黑客利用来制作后门,如果系统开了rlogin、rexec等r的服务,因为象rlogin这样的服务是基于rhosts文件里的主机名使用简 单的认证方法,所以黑客只要将.rhosts文件设置成"++",那么就允许任何人从任何地方使用该用户名,无须口令登陆513端口的 rlogin服务就行。而且r之类的服务没有日志能力,不容易被发现。
实现方法:

# echo "++" >; /usr/heiyeluren/.rhosts
# rlogin -l heiyeluren localhost


这样就不需要任何密码,直接输入用户名heiyeluren就登陆到了系统。

* 防范办法:
不要使用rlogin等服务,同时也不推荐使用telnet等服务,因为telnetd等守护进程溢出漏洞一堆,而且在数据传输过程中是没有加密的,很容易被嗅探,建议使用ssh等经过安全加密的服务来替代。


5. Login后门

login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login的原代码并修改使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入。

* 防范方法:
一般针对这类后门,一般都是使用"string"命令搜索login程序中是否有中是否有密码等字符串来进行检查。如果密码经过加密,那么就对login文件进行指纹记录和MD5值的记录,觉得异常时进行检测。


6. Bind后门

就是通过常用的网络连接协议 TCP/UDP/ICMP 来建立连接的后门,这个在Windows下可是轰轰烈烈。
比 较普遍的有TCP协议的后门都是写一段程序开一个指定的端口进行监听,然后从客户端进行连接后登陆系统。也有黑客为了隐蔽使用UDP协议来连接。 icmp后门也常见,一般是。有时候可能bind后门跟服务后门结合,黑客通过自己写的bind后门来替换inetd中的服务。

* 防范方法:
经常使用netstat命令检查有没有非法的端口打开,最好直接用防火墙屏蔽除了正常访问的端口之外的端口。对于ping后门的话,直接在防火墙上禁止ping服务器


7. 服务后门

一 般是替换或者添加服务来实现后门。比如在 /etc/inetd.conf 中添加或者替换某个服务来运行自己的后门程序,或者在某些服务中加入自己的后门代码。如果是替换服务的话,该服务必须不被使用,而且不容易发现。如果是自 己添加的服务,那么必须在/etc/services中设置对应的服务和端口才能使用。

* 防范方法:
经常检查服务,最好备份 /etc/inetd.conf 、/etc/services等文件,同时在FreeBSD下也要时常检查 /usr/loca/etc/rc.d 下面的脚本是否是合法的并且是否那些脚本里面有没有启动非法程序。如果是在服务程序中添加自己的代码,那么就要对文件的指纹进行校验,比如md5值看是否 匹配。


8. rootkit后门

rootkit后门一般是替换管理员使用的工具,比如ls、ps、netstat、who等常用文件,把那些程序替换成被黑客加了特殊代码的程序,那样就能达到控制的效果。而且现在已经有很多现成能下载使用的rootkit。

* 防范方法:
按照我们前面的方法,给每个文件建立系统指纹档案和md5校验值,如果觉得不对劲的时候查看文件指纹是否匹配,有没有别修改过,就知道是否着了rootkit的道。


9. 内核后门

通过加载内核模块的方式来加载后门,比较复杂。一般内核后门都是针对操作系统而言的,不同的操作系统内核模块设置编写方法都不一样,一般不通用。内核后门一般无法通过md5校验等来判断,所有基本比较难发现,目前针对内核后门比较多的是Linux和Solaris下。

* 防范方法:
FreeBSD下通过我们上面讲的设置内核安全等级来控制加载内核模块。


10. 其他后门
还有包括.forward等其他各类后门,另外很多后门可能是结合多种技术,比如把rootkit和内核后门结合在一起,实际过程中,黑克是会更难对付的。当然还有许多我们没有发现高手独门秘诀,这需要灵活检查,不过只要勤劳一点,安全会提升很多。

六、结束语

安 全是一个整体,即使那么服务你设置的非常安全,但是不能保证永远安全,安全是动态的,必须不断的充实自己的知识,发现新漏洞、新技术。如果你需要更安全的 系统,一定要自己有时常能够手工作入侵检测或者使用部分工具帮助你进行入侵检测。同时推荐你安装一些网络入侵检测系统(NIDS),比如Snort。
我想这个题目真的有点大了,开始写的时候没有那种感觉,越做到后来越觉得想要说的很多,最后只能泛泛而谈了一下,虽然如此,也希望能够给在使用FreeBSD的网管和网络安全爱好者一点点的帮助,那就足够了。

感谢所有致力于开源世界安全研究和管理并且愿意共享自己学习心得的朋友!

最后谢谢你能够耐心阅读本文。