9.8 防御

面对危机四伏的状况,那么还有确保系统安全的可能吗?当然,是有的,下面的小节要介绍一下几种设计和实现系统的方法来提高它们的安全性。一个最重要的概念就是全面防御(defense in depth)。基本地讲,这个概念是指你必须有多层的安全性,以便于当其中的一层被破坏,仍然还有其他层要去防御。想象一下这样的一个房子,有一个高的带钉子的关闭着的铁栅栏,在院子里有运动检测器,前门上有两把做工精良的锁,屋子里还有一个计算机控制的盗窃报警系统。每一个技术自己本身都是有价值的,为了闯入这个房子盗贼需要打败所有的防御。一个安全的计算机系统就应该像这个房子一样,有着多层的安全性。我们将要介绍其中的某些层次。防御不是真的分等级的,而是我们要从一般的外部的东西开始,然后逐渐深入到细节。

9.8.1 防火墙

能够把任何地方的一台计算机连接到其他一台任何地方的计算机上是一件好坏参半的事情。网络上有很多有价值的资料,但是同时连接到Internet上也使我们的计算机面临着两种危险:来自外部和来自内部。来自外部的危险包括黑客、病毒、间谍软件以及其他的恶意软件。来自内部的危险包括了机密信息泄露,比如信用卡号、密码、纳税申请单和各种各样的公司信息。

因此,我们需要某种机制来保证“好”的留下来并且阻止“坏”的进入。一种方法是使用防火墙(firewall),它是一种中世纪古老的安全措施的现代版本:在你的城堡周围挖一条护城河。这样的设计强制每一个进入或者离开城堡的人都要经过惟一的一座吊桥,I/O警察可以在吊桥上检查每一个经过的人。对于网络,这种方法也是可行的:一个公司可能有很多的任意连接的局域网,但是所有进入或离开公司的网络流都要强制地通过一个电子吊桥——防火墙。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

防火墙有两种基本的类型:硬件防火墙和软件防火墙。有局域网需要保护的公司通常选择硬件防火墙;而家庭的个人用户通常会选择软件防火墙。首先,让我们看一看硬件防火墙。一般的硬件防护墙如图9-31所示。在该图中,来自网络提供者的连接(电缆或光纤)会被插到防火墙上,防火墙也连接到局域网上。不经过防火墙的允许任何包都不能进入或者离开局域网。实际的情况下,防护墙通常会和路由器、网络地址转换盒、指令检查系统和其他设备联合起来工作,但是在这里我们只关注于防火墙自身的功能。

阅读 ‧ 电子书库
图 9-31 一个由防火墙保护的局域网示意图(含三台主机)

防火墙根据一些规则来配置,这些规则描述什么是允许的,什么是不允许的。防护墙的管理者可以修改这些规则,通常修改是通过一个Web界面进行的(大多数防火墙都内置一个小型Web服务器来实现它)。最简单的一种防护墙是无状态防护墙(stateless firewall),只会检查通过的包的头部,然后根据包头部的信息和防火墙的规则作出传送还是丢弃这个包的决定。包头部的信息包括源和目的的IP地址、源和目的的端口、服务的类型和协议。包头部的其他属性也是可以得到的,但是很少会被防火墙的规则涉及。

在图9-31中,我们有3个服务器,每一个都有一个惟一的IP地址,形如207.68.160.x,其中x依次是190、191、192。这三个地址就是那些要发送给这些服务器的包的目的地址。进来的包同时也包含一个16位的端口号(port number),来描述机器上哪一个进程来获得这个包(一个进程能监听一个来自外部网络流量的端口)。一些端口是和一些标准服务联系在一起的。特别地,端口80被Web使用,端口25被E-mail使用,端口21被FTP(文件传输协议)服务使用,但是大多数其他的端口是被用户定义的服务使用的。在这样的条件下,防火墙可能按照如下规则配置:

阅读 ‧ 电子书库

这些规则只有当包被发送到端口80的时候,才会允许进入地址是207.68.160.190的机器;这个机器的其他端口都是被禁止的并且发送给这些端口的包都会被防火墙自动丢弃。同样,只有发送给端口25和21的包才可以进入其他两个机器。所有其他的网络流都是禁止的。这个规则集使得攻击者除了提供的三个公共的服务以外,很难访问到局域网。

虽然有了防火墙,局域网还是可能会受到攻击。例如,如果Web服务器是Apache并且攻击者找到了一个可以利用的Apache的bug,那么他可以发送一个很长的URL到207.68.160.190的端口80,然后制造一个缓冲区溢出,进而控制由防火墙保护的一台机器,通过这个机器可以发动对局域网内其他机器的攻击。

另一种潜在的攻击是写一个多人游戏,发布这个游戏并且让它得到广泛的接受。这个游戏的软件需要某个端口来和其他的玩家联系,所以游戏设计者会选择一个端口,比如9876,并且告诉玩家来改变防火墙的设置,来允许在这个端口网络流的进出。打开端口的人现在也容易受到这个端口上的攻击。即使这个游戏是合法的,那么它也可能包含一些可以利用的bug。打开越多的端口,被成功攻击的机会就越大。防火墙上的每一个端口都增加了攻击通过的可能。

除了无状态防火墙以外,还有一种跟踪连接以及连接状况的防火墙。这些防火墙能够更好地防止某些类型的攻击,特别是那些和建立连接有关的攻击。另外,一些其他类型的防火墙实现了入侵检测系统(Intrusion Detection System,IDS),利用IDS防火墙不仅可以检测包的头部还可以用检测包的内容来查找可疑的内容。

软件防火墙,有时也叫做个人防火墙,和硬件防火墙具有同样的功能,只不过是通过软件方式实现的。它们是附加在操作系统内核的网络代码上的过滤器,是和硬件防火墙工作机制一样的过滤数据包。