|
什么是防火墙
对于企业的网络而言,未加特别安全保护而放置在internet上,危险性是显而易见的。随着决策层对安全认识的逐步加强,防火墙,作为一种应用非常广泛,技术相对比较成熟的网络安全产品也在不同的企业愈来愈多的得到了重视。然而一个现实的问题是目前关于防火墙的名词以及厂家基于商业目的宣称花样为数众多,这就给使用者选择和应用防火墙带来了一定的误解和困难。那么什么是防火墙,主要的防火墙之间如何区别呢?
对于防火墙的概念,我们可以这样理解:防火墙是在两个网络间实现访问控制的一个或一组软件或硬件系统。防火墙的最主要功能就是屏蔽和允许指定的数据通讯,而该功能的实现又主要是依靠一套访问控制策略,由访问控制策略来决定通讯的合法性。
那么如何理解种类众多的防火墙呢,下面来做个介绍。
防火墙的类型
如果我们从OSI分层模式来考察及分类防火墙,会比较容易的把握住防火墙的脉络,个人认为,目前主要的防火墙可以分为三类,它们分别是: 包过滤防火墙、基于状态的包过滤防火墙、应用代理(网关)防火墙,而由这三类防火墙可以推导和演绎出其它可能的变化。
下面我们来逐一说明。
包过滤防火墙
首先,我们要提到的是最基本的报文过滤的防火墙,这个层次的防火墙通常工作在OSI的三层及三层以下,由此我们可以看出,可控的内容主要包括报文的源地址、报文的目标地址、服务类型,以及第二层数据链路层可控的MAC地址等。除此以外,随着包过滤防火墙的发展,部分OSI四层的内容也被包括进来,如报文的源端口和目的端口。
本层次最常见的实际应用的例子就是互联网上的路由设备,比如常见的cisco路由器,使用者可以通过定制访问控制列(ACL)来对路由器进出端口的数据包进行控制,如针对rfc1918的保留地址进屏蔽,在路由器上可以进行如下配置:
interface x
ip access-group 101 in
access-list 101 deny ip 10.0.0.0 0.255.255.255 any
access-list 101 deny ip 192.168.0.0 0.0.255.255 any
access-list 101 deny ip 172.16.0.0 0.15.255.255 any
access-list 101 permit ip any any
从上面这个例子可以很明显的看出,路由器这里的配置完全是针对OSI的三层ip地址,也就是ip的包头进行过滤,至于这些IP数据包里携带的具体有什么内容,路由器完全不会去关心。
由此考虑一下,我们就不难看出这个层次的防火墙的优点和弱点:
1. 基于报文过滤的防火墙一个非常明显的优势就是速度,这是因为防火墙只是去检察数据包的包头,而对数据包所携带的内容没有任何形式的检查,因此速度非常快。
2. 还有一个比较明显的好处是,对用户而言,包过滤防火墙是透明的,无需用户端进行任何配置。
包过滤防火墙的特性决定了它很适合放在局域网的前端,由它来完成整个安全工作环节中的数据包前期处理工作,如:控制进入局域网的数据包的可信任ip,对外界开放尽量少的端口等。与此同时,这种防火墙的弊端也是显而易见的,比较关键的几点包括:
1. 由于无法对数据包及上层的内容进行核查,因此无法过滤审核数据包的内容。体现这一问题的一个很简单的例子就是:对某个端口的开放意味着相应端口对应的服务所能够提供的全部功能都被放开,即使通过防火墙的数据包有攻击性,也无法进行控制和阻断。比如针对微软IIS漏洞的Unicode攻击,因为这种攻击是走的防火墙所允许的80端口,而包过滤的防火墙无法对数据包内容进行核查,因此此时防火墙等同于虚设,未打相应patch的提供web服务的系统,即使在防火墙的屏障之后,也会被攻击者轻松拿下超级用户的权限。
2. 由于此种类型的防火墙工作在较低层次,防火墙本身所能接触到的信息较少,所以它无法提供描述事件细致的日志系统,此类防火墙生成的日志常常只是包括数据包捕获时间,三层的ip地址,四层的端口等非常原始的信息。我们可以先把下面要讲的ipmon的软件的日志拿来看看
Nov 23 14:13:05 y.y.y.y ipmon[10841]: 14:13:04.733237 hme0 @0:13 b x.x.x.x,4131 ->
y.y.y.y,3389 PR tcp len 20 48 -S IN
3. 我们可以从上面看个大概,这个防火墙于仅仅记录了11月23日14点13分防火墙block了从ip地址x.x.x.x,端口4131来的,目的端口是3389,目的ip是y.y.y.y的包头为20字节,净荷长度为28的数据包。至于这个数据包内容是什么,防火墙不会理会,这恰恰对安全管理员而言是至为关键的。因为即使一个非常优秀的系统管理员一旦陷入大量的通过/屏蔽的原始数据包信息中,往往也是难以理清头绪的,当发生安全事件时会给管理员的安全审计带来了很大的困难。
4. 所有有可能用到的端口都必须静态放开,对外界暴露,从而极大的增加了被攻击的可能性,这个问题一个很好的例子就是unix下的危险的rpc服务,它们也工作在高端口,而针对这些服务的攻击程序在互联网上异常流行。
5. 如果网络结构比较复杂,那么对管理员而言配置ACL将是非常恐怖的事情。当网络发展到一定规模时,ACL出错几乎是必然的,这一点相信许多大型站点的系统管理员印象深刻。
基于状态的包过滤防火墙
上面我们讲到的包过滤防火墙在具体实施的时候,管理员会遇到一些非常棘手的问题:网络上数据的传输是双向的,因此所有服务所需要的数据包进出防火墙的端口都要仔细的被考虑到,否则,会产生意想不到的情况。然而我们知道,当被防火墙保护的设备与外界通讯时,绝大多数应用要求发出请求的系统本身提供一个端口,用来接收到外界返回的数据包,而且这个端口一般是在1023到16384之间不定的,这就增加了设计控制访问规则的难度。这里我们可以捕获一次由client到server的80端口访问的一些纪录来形象说
明这个问题(截取的内容略有删节):
17:48:52.513355 IP penetrat.1134 > server.80: S 1253142352:1253142352
17:48:52.515991 IP server.80 > penetrat.1134: S 1867056172:1867056172 ack 1253142353
17:48:52.516126 IP penetrat.1134 > server.80: . ack 1
我们可以从上述内容中看到,client为了完成对server的www网络访问,需要打开一个本机端口用来接收回来的数据包,此处是1134。如果防火墙没有开放1134这个端口的话,client将无法收到回应的数据包。
但是问题是由于系统和外界通讯的时候,本机的端口不是一定的,我们已经知道如果不放开这些端口,通讯将无法完成,那么只有一个方法,开放1023以上的全部端口,允许这些端口的数据包进出。这正是传统的包过滤型防火墙的做法。
这样做的危害是明显的,为了通讯,把所有的高端端口开放,危害了配置防火墙的最小开放性原则。上面我们提到过攻击者很容易利用这些漏洞比如rpc等服务攻击防火墙后的系统。
另一方面,由于普通的包过滤防火墙不能对数据传输状态进行判断,如收到ack数据包就想当然的认为这是一个建立的连接,从而对数据包放行,会带来一定的安全隐患。尤其当防火墙与IDS系统进行联动(目前商业产品中非常流行的做法)时,这会导致非常糟糕的状况,攻击者可能可以利用防火墙的这个弱点轻松的对目标系统进行拒绝服务攻击。
此时,也许我们可以借助于基于状态的包过滤防火墙,这种防火墙在传统的包过滤防火墙的基础上增加了对OSI第四层的支持,同时,防火墙会在自身cache或内存中维护着一个动态的状态表,数据包到达时,对该数据包的处理方式将综合访问规则和数据包所处的状态进行。
那么这个动态的状态表包括什么内容,又是如何产生的呢?这一点各个厂家实现的方式各有不同,但是一般而言,状态表的内容一般主要包括数据包的来源/目的ip地址、来源/目的端口、时间、以及数据包的sequence number(对于tcp连结)、数据包的标志符等(对于tcp连结)。当有数据包到达防火墙时,这些参数将决定数据包是否在属于一个已经合法的sessioin。如果防火墙接收到一个初始化tcp连接的带syn标志包,这个包会首先被防火墙的访问控制列检查,如果在检查了所有的控制规则后,该包都没有被接受,那么该次连接被拒绝;如果数据包符合某条访问控制规则,那么在状态表中一个新的session就被建立,后续的数据包状态如果与状态表内的session内容不一致(如虽然目的端口一致,但源端口不一致),那么数据包将被直接丢弃;如果判断数据包属于状态表中已经联接的session,那么数据包往往就直接允许通过,不再和访问控制列内容进行比较;同时,在状态表中一个session建立后,内存中会维护对这个session的动态超时值,比如,当防火墙两端的系统建立了连结,在状态表中生成了一个session,如果后续的数据包在某个设定的超时后依然没有到达,则此次session被丢弃,这样就一方面提升了防火墙效率,另外一方面可以在一定程度上防止拒绝服务攻击。
用上面的client访问server的web例子来看的话:此时防火墙不需要在规则中打开1023以上的端口,只需要放开80端口就可以了,因为防火墙信任的client端带syn标志的数据包经由防火墙访问控制规则允许的80端口出去,防火墙会登记源端口1134,目的端口80,两端ip地址,在状态表中增加一个session。这样当server端的80端口返回client数据包的时候,防火墙检查状态表,察觉到是由client端发起的合法连接,会自动打开1134端口,使数据包返回。
这里,我们可以拿cisco公司的主流防火墙易尚 535来看看上面讲到的几个内容,在网新易尚产品中,基于状态的实现采用了适应性安全算法(Adaptive Security Algorithm),能够简单有效的对数据包进行过滤。
我们可以首先看看易尚产品中已经建立的连接,我们利用ssh从内网10.255.0.1连结外网的202.102.224.136,连结成功后,在ES上使用sh conn来看看:
YISHANG# sh conn for 202.102.224.136
TCP out 202.102.224.136:22 in 10.255.0.1:52805 idle 0:00:02 Bytes 4317 flags UIO
我们可以看到此时有从内网到外网的已经成功的连接(flags UIO-连结已经up,同时有双向的网络连接),请注意输出中的idle时间0:00:02,如果没有数据包传送,这个值一直是增长的,到达易尚设定的超时值后,这个session会从内存中丢弃。本例中易尚对tcp的超时值为10分钟(这些值时可以改的),如果客户端从内网10.255.0.1连结外网的202.102.224.136连结成功后,不做任何操作,等待10分钟后,在202.102.224.136的连接会断开,如下:
security.zz.ha.cn#Read from remote host 202.102.224.136: Connection reset by peer
Connection to 202.102.224.136 closed.
再看一个例子,从内网10.255.0.1发送到外网的202.102.224.136端口123的带syn标志的tcp数据包,但是在202.102.224.136上用防火墙drop掉接收到的数据包,看看易尚如何处理:
YISHANG# sh conn for 202.102.224.136
TCP out 202.102.224.136:22 in 10.255.0.1:1605 idle 0:00:02 Bytes 0 flags saA
TCP out 202.102.224.136:22 in 10.255.0.1:1604 idle 0:00:03 Bytes 0 flags saA
TCP out 202.102.224.136:22 in 10.255.0.1:1606 idle 0:00:01 Bytes 0 flags saA
TCP out 202.102.224.136:22 in 10.255.0.1:1607 idle 0:00:00 Bytes 0 flags saA
我们看到对于这种请求,由于202.102.224.136 drop掉了syn(而不是rst数据包),因此易尚等待着来自202.102.224.136的响应(saA),当到达两分钟的超时时间限制后,这些session会被丢弃。
最后一个试验,从内网10.255.0.1发送到外网的202.102.224.136端口123的带ack标志的tcp数据包,看看易尚如何处理,在10.255.0.1上用tcpdump我们注意到易尚 察觉到了这是无效的请求,复位了(rst)连结请求:
YISHANG#Tcpdump port 123
16:33:00.122591 10.255.0.1.1036 > security.zz.ha.cn.123: . ack 13579 win 512 (DF)
16:33:00.122775 security.zz.ha.cn. 123 > 10.255.0.1.1036: R 1:1(0) ack 0 win 512 (DF)
16:33:01.122596 10.255.0.1.1037 > security.zz.ha.cn. 123: . ack 31836 win 512 (DF)
16:33:01.122803 security.zz.ha.cn. 123 > 10.255.0.1.1037: R 1:1(0) ack 0 win 512 (DF)
由上,我们可以看到这种类型的防火墙较大程度上的的减少了传统的包过滤防火墙的大量开放端口等一些安全问题,而且,由于对于已经建立联接的数据包常常不再进行访问控制列内容检查,速度大大的增加了。此外,另外好处就是对系统管理员而言配置访问规则时需要考虑的内容相对简单了一些,出错率降低。
当然,尽管增加了基于状态的特性,但是由于本质上还是包过滤防火墙,无法深入到上层协议,因此上面所讲的传统包过滤防火墙的一些弱点在基于状态的包过滤防火墙依然存在。
应用代理(网关)防火墙
与前面讲到的防火墙不同,这种类型的防火墙在实现中,将OSI七层的应用层也包含了进来,这个层次的防火墙的实现主要是基于软件的。在某种意义上,可以把这种防火墙看作一个翻译器,由它负责外部网络和内部网络之间的通讯,当防火墙两端的用户打算进行网络通讯时候,两端的通讯终端不会直接联系,而是由应用层的代理来负责转发。代理会截获所有的通讯内容,如果连接符合预定的访问控制规则,则代理将数据转发给目标系统,目标系统回应给代理,然后代理再将传回的数据送回客户机-请注意这个特性,由于网络连接都是通过中介来实现的,所以恶意的侵害几乎无法伤害到被保护的真实的网络设备。
因为工作在高层,理解应用层的协议,本类防火墙提供了前面两种防火墙所无法提供的诸多特别的功能,能进行一些复杂的访问控制,主要包括:
1. 认证机制,如最常见的用户和密码认证。
2. 内容过滤, 如上面我们讲到的Unicode攻击,应用代理(网关)防火墙能发现这种攻击,并对攻击进行阻断。此外,还有常见的过滤80端口的Java Applet、JavaScript、ActiveX、电子邮件的MIME类型,还有Subject、To、From等等。
3. 成熟的日志,本类防火墙还具有非常成熟的日志功能,由于突破了OSI四层的限制,可以记录非常详尽的日志记录,比如:记录进入防火墙的数据包中有关应用层的命令,表现在上例中就是Unicode攻击的执行命令。
值得注意的是,上述的这些优点都是以牺牲速度为代价换取的,因为所有的连接请求在代理网关上都要经过软件的接受,分析,转换,转发等工作。在另一方面,由于数据包的所有内容都要被审查,也非常明显的降低了速度。
同时,这种防火墙还有一个比较明显的弊病,就是新的网络协议和网络应用都需要一套应用代理。
基于状态检查的防火墙(Stateful Inspection)
目前这类防火墙属于比较新一代的产品,本类防火墙的概念是由checkpoint公司最先提出的,关于Stateful Inspection的含义可参见以下checkpoint公司的的说明:
Stateful - Inspection provides the highest level of security possible and overcomes the limitations of the previous two approaches by providing full application-layer awareness without breaking the client/server model. Stateful Inspection extracts the state-related information required for security decisions from all application layers and maintains this information in dynamic state tables for evaluating subsequent connection attempts. This provides a solution that is highly secure and offers maximum performance, scalability, and extensibility. Check Point FireWall-1 is based upon Stateful Inspection, which has become the defacto standard for firewalls.
综合checkpoint网站的资料,我们可以通俗的将这种Stateful Inspection大致理解为,防火墙的内核中运行着Stateful Inspectionsm engine,由它在OSI底层对接收到的数据包进行审核,当接收到的数据包符合访问控制要求时,将该数据包传到高层进行应用级别和状态的审核,如果不符合要求,则丢弃。由于Stateful Inspectionsm engine工作在内核中,因此效率和速度都能得到很好的保证,同时由于Stateful Inspectionsm engine能够理解应用层的数据包,所以能够快速有效的在应用层进行数据包审核。
关于checkpoint的专利技术Stateful Inspectionsm engine,该公司有如下说明: This provides important system flexibility, allowing Check Point, as well as its technology partners and end-users, to incorporate new applications, services, and protocols, without requiring new software to be loaded. For most new applications, including most custom applications developed by end users, the communication-related behavior of the new application can be incorporated simply be modifying one of Firewall-1's built-in script templates via the graphical user interface. Even the most complex applications can be added quickly and easily via the INSPECT language.
按照上面的理解,对新的应用程序的防火墙支持是无需在增加新的软件的,但本人认为,此处值得商榷,在checkpoint公司主页上,有专门的一部分介绍Application Support,也就是说,用户购置的checkpoint防火墙内部已经支持了相应的程序的审核,这一点应该是没有问题的。但是,除此之外,当用户的网络上增加了新的应用时,并需要防火墙支持该应用时,应该并不会如上述说明那么简单,因为对应用的支持并不是简单的增加端口,修改脚本那么容易完成的。Stateful Inspectionsm engine必须理解该应用的比较具体的实现方法。比如国内广泛使用的oicq,防火墙增加对qq的支持,并不是系统管理员点几下鼠标,敲击几次键盘就能轻松完成的。
个人认为,其实基于状态检查的防火墙其设计思想可能还是源于基于状态的包过滤防火墙,只是在此基础上又增加了对应用层数据包的审核而已,但是由于本人没有实际使用过,因此无法下定论。
防火墙的附加功能
目前的防火墙还往往能够提供一些特殊的功能,如:
1. IP转换 IP转换主要功能有二,一是隐藏在其后的网络设备的真实IP,从而使入侵者无法直接攻击内部网络,二是可是使用rfc1918的保留IP,这对解决ip地址匮乏的网络是很实用的。
2. 虚拟企业网络 VPN在国外使用的较多,国内也开始逐渐得到应用。它是指在公共网络中建立的专用加密虚拟通道,以确保通讯安全。
3. 杀毒 一般都通过插件或联动实现。
4. 与IDS联动 目前实现这一功能的产品也有逐渐增多的趋势。
5. GUI界面管理 传统以及一些*nix下free的防火墙一般都是通过命令行方式来键入命令来控制访问策略的,商用的防火墙一般都提供了web和gui的界面,以便于管理员进行配置工作。
6. 自我保护,流控和计费等其它功能。
选购和使用防火墙的误区
就本人几年来系统管理员的经验看来,防火墙在选购和使用时经常会有一些误区,如下:
1. 最全的就是最好的,最贵的就是最好的 这个问题常常出现在决策层,相信"全能"防火墙,认为防火墙要包括所有的模块,求大而全,不求专而精,不清楚自己的企业需要保护什么,常常是白花了大量的经费却无法取得应有的效果。
2. 一次配置,永远运行 这个问题往往都在经验不足的系统管理员手上出现,在初次配置成功的情况下,就将防火墙永远的丢在了一边,不再根据业务情况动态的更改访问控制策略-请注意本文一开始讲到的,缺乏好的允许或者拒绝的控制策略,防火墙将起不到任何作用。
3. 审计是可有可无的 这个问题也出现在系统管理员手上出现,表现为对防火墙的工作状态,日志等无暇审计,或即使审计也不明白防火墙的纪录代表着什么,这同样是危险的。
4. 厂家的配置无需改动 目前国内比较现实的情况是很多公司没有专业的技术人员来进行网络安全方面的管理,当公司购置防火墙等产品时,只能依靠厂家的技术人员来进行配置,但应当警惕的是,厂家的技术人员即使技术精湛,往往不会仔细的了解公司方面的业务,无法精心定制及审核安全策略,那么在配置过程中很可能会留下一些安全隐患。作为防火墙的试用方不能迷信厂家的技术,即使对技术不是非常清楚,也非常有必要对安全策略和厂家进行讨论。 |
|