1.方案:硬件?还是软件?
现在防火墙的功能越来越多越花哨,如此多的功能必然要求系统有一个高效的处理能力。
防火墙从实现上可以分为软件防火墙和硬件防火墙。软件防火墙以checkpoint公司的Firewall-I为代表,其实现是通过 dev_add_pack的办法加载过滤函数(Linux,其他操作系统没有作分析,估计类似),通过在操作系统底层做工作来实现防火墙的各种功能和优化。国内也有一些所谓的软件防火墙,但据了解大多是所谓“个人”防火墙,而且功能及其有限,故不在此讨论范围。
在国内目前已通过公安部检验的防火墙中,硬件防火墙占绝大多数。硬件防火墙一种是从硬件到软件都单独设计,典型如Netscreen防火墙不但软件部分单独设计,硬件部分也采用专门的ASIC集成电路。
另外一种就是基于PC架构的使用经过定制的通用操作系统的所谓硬件防火墙。目前国内绝大
多数防火墙都属于这种类型。
虽然都号称硬件防火墙,国内厂家和国外厂家还是存在着巨大区别。硬件防火墙需要在硬件和软件两方面同时下功夫,国外厂家的通常做法是软件运算硬件化,其所设计或选用的运行平台本身的性能可能并不高,但它将主要的运算程序(查表运算是防火墙的主要工作)做成芯片,以减少主机CPU的运算压力。国内厂家的防火墙硬件平台基本上采用通用PC系统或工业PC架构(直接原因是可以节省硬件开发成本),在提高硬件性能方面所能做的工作仅仅是提升系统CPU的处理能力,增大内存容量而已。现在国内防火墙的一个典型结构就是:工业主板+x86+128(256)M内存+DOC/DOM+硬盘(或不要硬盘而另增加一个日志服务器)+百兆网卡 这
样一个工业PC结构。
在软件性能方面,国内外厂家的差别就更大了,国外(一些著名)厂家均是采用专用的操作系统,自行设计防火墙。而国内所有厂家操作系统系统都是基于通用的 Linux,无一例外。各厂家的区别仅仅在于对Linux系统本身和防火墙部分(2.2内核为ipchains,2.4以后内核为netfilter)所作的改动量有多大。
事实上,Linux只是一个通用操作系统,它并没有针对防火墙功能做什么优化,而且其处理大数据量通信方面的能力一直并不突出,甚至比较低下(这也是 Linux一直只是低端服务器的宠儿的重要原因,我自己认为,在这一点上它还不如BSD系列,据说国外有用BSD做防火墙的,国内尚未见到)。现在绝大部分厂家,甚至包括号称国内最大的天融信,在软件方面所作的工作无非也就是系统有针对性的裁减、防火墙部分代码的少量改动(绝大部分还是没有什么改动)和少量的系统补丁。而且我们在分析各厂家产品时可以注意这一点,如果哪个厂家对系统本身做了什么大的改动,它肯定会把这个视为一个重要的卖点,大吹特吹,遗憾的是似乎还没有什么厂家有能力去做宣传(天融信似乎有一个类似于checkpoint的功能:开放式的安全应用接口 TOPSEC,但它究竟做了多少工作,还需要去仔细了解)。
目前国内厂家也已经认识到这个问题,有些在做一些底层的工作,但有明显成效的,似乎还没有。
在此我们仅针对以Linux(或其他通用操作系统)为基础的、以PC架构为硬件载体的防火墙做讨论,以下如不特别提出,均同。
2.内核和防火墙设计
现在有一种商业卖点,即所谓“建立在安全操作系统之上的第四代防火墙”(关于防火墙分代的问题,目前有很多讨论,比较一致的是把包过滤防火墙称为第一代防火墙,把应用型防火墙(一般结合了包过滤功能,因此也成为混合型防火墙)称为第二代防火墙,有些厂家把增加了检测通信信息、状态检测和应用监测的防火墙称为第三代防火墙,更有甚者在此基础上提出了采用安全操作系统的防火墙,并把这个称为第四代防火墙)。所谓安全操作系统,其实大多用的还是Linux,所不同的是需要做一些内核加固和简单改造的工作,主要有以下: 取消危险的系统调用,或者截获系统调用,稍加改动(如加载一些llkm);
限制命令执行权限;
取消IP转发功能;
检查每个分组的接口;
采用随机连接序号;
驻留分组过滤模块;
取消动态路由功能;
采用多个安全内核(这个只见有人提出,但未见到实例,对此不是很清楚)。
以上诸多工作,其实基本上都没有对内核源码做太大改动,因此从个人角度来看算不上可以太夸大的地方。
对于防火墙部分,国内大部分已经升级到2.4内核所支持的netfilter。netfilter已经是一个功能比较完善的防火墙框架,它已经支持基于状态的监测(通过connection track模块实现)。而且netfilter是一个设计很合理的框架,可以在适当的位置上登记一些需要的处理函数,正式代码中已经登记了许多处理函数,如在NF_IP_FORWARD点上登记了装发的包过滤功能(包过滤等功能便是由这些正式登记的函数实现的)。我们也可以登记自己的处理函数,在功能上作扩展(如加入简单的IDS功能等等)。这一点是国内厂家可以做文章的地方,至于netfilter源码的修改,对国内厂家来说似乎不太现实。
至于采用其它防火墙模型的,目前还没有看到(可能是netfilter已经设计的很成功,不需要我们再去做太多工作)。
3.自我保护能力(安全性)
由于防火墙的特殊功能和特殊位置,它自然是众多攻击者的目标,因此它的自我包括能力在设计过程中应该放在首要的位置。
A.管理上的安全性
防火墙需要一个管理界面,而管理过程如何设计的更安全,是一个很重要的问题。目前有两种方案。
a.设置专门的服务端口
为了减少管理上的风险和降低设计上的难度,有一些防火墙(如东方龙马)在防火墙上专门添加了一个服务端口,这个端口只是用来和管理主机连接。除了专用的服务口外,防火墙不接受来自任何其它端口的直接访问。这样做的显著特点就是降低了设计上的难度,由于管理通信是单独的通道,无论是内网主机、外网主机还是DMZ内主机都无法窃听到该通信,安全性显然很高,而且设计时也无需考虑通信过程加密的问题。
然而这样做,我们需要单独设置一台管理主机,显然太过浪费,而且这样管理起来的灵活性也不好。
b.通信过程加密
这样无需一个专门的端口,内网任意一台主机都可以在适当的情况下成为管理主机,管理主
机和防火墙之间采用加密的方式通信。
目前国内有采用的是使用自定义协议、一次性口令认证。对加密这个领域了解不多,不做详
细讨论。
B.对来自外部(和内部)攻击的反应能力
目前常见的来自外部的攻击方式主要有:
a.DOS(DDOS)攻击
(分布式)拒绝服务攻击是目前一种很普遍的攻击方式,在预防上也是非常困难的。目前防火墙对于这种攻击似乎没有太多的解决办法,主要是提高防火墙本身的健壮性(如增加缓冲区大小)。在Linux内核中有一个防止Syn flooding攻击的选项:CONFIG_SYN_COOKIES,它是通过为每一个Syn建立一个缓冲(cookie)来分辨可信请求和不可信请求。另外对于ICMP攻击,可以通过关闭ICMP 回应来实现。
b.IP假冒(IP spoofing)
IP假冒是指一个非法的主机假冒内部的主机地址,骗取服务器的“信任”,从而达到对网络的攻击目的。
第一,防火墙设计上应该知道网络内外的IP地址分配,从而丢弃所有来自网络外部但却有内部地址的数据包。实际实现起来非常简单,只要在内核中打开rp_filter功能即可。
第二,防火墙将内网的实际地址隐蔽起来,外网很难知道内部的IP地址,攻击难度加大。IP假冒主要来自外部,对内网无需考虑此问题(其实同时内网的IP假冒情况也可以得到遏制)。
c.特洛伊木马
防火墙本身预防木马比较简单,只要不让系统不能执行下载的程序即可。
一个需要说明的地方是必须指出的是,防火墙能抗特洛伊木马的攻击并不意味着内网主机也能防止木马攻击。事实上,内网主机可能会透过防火墙下载执行携带木马的程序而感染。内网主机的在预防木马方面的安全性仍然需要主机自己解决(防火墙只能在内网主机感染木马以后起一定的防范作用)。
d.口令字攻击
口令字攻击既可能来自外部,也可能来自内部,主要是来自内部。(在管理主机与防火墙通过单独接口通信的情况下,口令字攻击是不存在的)
来自外部的攻击即用穷举的办法猜测防火墙管理的口令字,这个很容易解决,只要不把管理部分提供给外部接口即可。
内部的口令字攻击主要是穷举和嗅探,其中以嗅探危害最大。嗅探指监测网络截获管理主机给防火墙的口令字,如果口令字已加密,则解密得到口令字。目前一般采用一次性口令和禁止直接登录防火墙的措施来防止对口令字的攻击。
e.邮件诈骗
邮件诈骗是目前越来越突出的攻击方式。防火墙本身防止邮件诈骗非常简单,不接收任何邮件就可以了。然而象木马攻击一样,内网主机仍可收发邮件,邮件诈骗的危险仍然存在,其解决办法一个是内网主机本身采取措施防止邮件诈骗,另一个是在防火墙上做过滤。
f.对抗防火墙(anti-firewall)
目前一个网络安全中一个研究的热点就是对抗网络安全产品如防火墙。一种是分析防火墙功能和探测防火墙内部网络结构,典型的如Firewalk。另外有一些其他的网络安全性分析工具本身具有双刃性,这类工具用于攻击网络,也可能会很有效的探测到防火墙和内部网络的安全缺陷,典型的如SATAN和ISS公司的 Internet Security Scanner。目前对于这种探测(攻击)手段,尚无有效的预防措施,因为防火墙本身是一个被动的东西,它只能靠隐藏内部网络结构和提高自身的安全性来对抗这些攻击。
C.透明代理的采用
应用代理防火墙一般是通过设置不同用户的访问权限来实现,这样就需要有用户认证体系。以前的防火墙在访问方式上主要是要求用户登录进系统(如果采用 sock代理的方式则需要修改客户应用)。透明代理的采用,可以降低系统登录固有的安全风险和出错概率,从而提高了防火墙的安全性。