Web 服务器是组织的众多公开部分之一,因此容易成为攻击目标。作为一种公共资源,某些组织的 Web 服务器非常脆弱。但可以扭转这种局面:学习如何保护公开的 Web 服务器。
Web 服务器是组织的众多公开部分之一,并且最容易成为攻击目标。Web 服务器体现了一种有趣的矛盾逻辑 — 如果不公开储存,如何与别人共享组织的信息?解决这个矛盾是个费力不讨好的苦差事;但它非常重要。
在进一步讨论之前,我们先看看 “被公开” 的 Web 服务器所面临的一些威胁。
Web 服务器面临的威胁
现在,Web 服务器面临许多威胁,大部分威胁与您在系统中配置的应用程序、操作系统和环境有关。在这里,我仅归纳了最常见的服务器威胁。
拒绝服务
拒绝服务(DoS)是一种 “老牌” 服务器攻击。这种攻击很简单,通常由技术水平较低的被称为脚本小子(script kiddies)的年轻人发动此类攻击。总体而言,DoS 攻击通过一个系统攻击另一个系统,其目的是消耗后者的所有资源(比如带宽和处理器时间),从而无法进行合法请求。通常,我们认为这是一种无聊的攻击,但您一定不要因此放松警惕,因为它造成的许多问题会让您半夜睡不着觉。
分布式拒绝服务
分布式拒绝服务(DDoS)攻击是 DoS 攻击的增强版,因为它更加恶劣、更加恼人。DDoS 攻击的目标和 DoS 一样,但它的规模更大,也更加复杂。在 DDoS 攻击中,攻击者不是通过一个系统攻击另一个系统,而是使用多个系统攻击另一个系统,有时这种发出攻击的系统甚至多达几十万个。如果说 DoS 攻击仅会让人感觉讨厌的话,那么 DDoS 攻击则是致命的,因为它能迅速使服务器离线。不过,实施 DDoS 攻击需要很高明的技术。
比较常见的 DDoS 攻击包括:
FTP 跳转攻击。文件传输协议(FTP)跳转攻击指攻击者向有漏洞的 FTP 服务器上传一个结构特殊的文件,然后该服务器将这个文件转发到其他位置(通常是组织内的另一个服务器)。被转发的文件通常包含某些代码,其目的是在最终服务器上完成攻击者希望做的事情。
端口扫描攻击。端口扫描攻击通过对主机进行系统的结构化扫描来实现。例如,某人可能扫描您的 Web 服务器,其目的是找到暴露的服务或其他可以利用的漏洞。只要具有可从 Internet 上免费获得的众多端口扫描器之一,任何人都可以轻松实现这种攻击。这也是最常见的攻击之一,因为它很容易实现,脚本小子通常利用它窃取服务器的主机名或 IP 地址(不过,他们通常不知道如何解析获得的结果)。注意,高级的攻击者将利用端口扫描挖掘信息。
ping 洪水(flooding)攻击。ping 洪水攻击是一种简单的 DDoS 攻击。在这种攻击中,一个计算机向另一个系统发送一个包(ping),以找到关于服务或系统的信息。对于低级的攻击,ping 流可用于偷偷地查找信息,但是如果要截取向目标发送的包,则要求系统离线或停机。这种攻击虽然是 “老牌攻击”,但它仍然很有活力,因为很多现代的操作系统都容易受到这种攻击。
Smurf 攻击。这种攻击类似于 ping 洪水攻击,但它能巧妙地修改进程。在 Smurf 攻击中,首先向中间网络发送一个 ping 命令,然后在自身得到增强之后转发到攻击目标。以前的 “点滴” 流量现在变成了巨大的流量。幸运的是,这种攻击现在很少见。
SYN 洪水(flooding)攻击。这种攻击要求了解 TCP/IP 协议 — 即整个通信流程是如何工作的。通过一个类比就能够很好地解释这种攻击。这种攻击类似于向某人发送一封需要回复的信件,但是信封使用虚假的回信地址。收信人回复了信件并等待您的回复,但永远不能收到回信,因为它在某个地方被阻止了。只要针对系统的 SYN 请求足够多,攻击者就能够使用系统上的所有连接,从而阻止任何东西通过。
P 分片(fragmentation)攻击。在这种攻击中,攻击者凭借高级的 TCP/IP 协议知识将包分成更小的片段(即分片),从而绕过许多入侵检测系统。在比较严重的情况下,这种攻击会造成挂起、锁定、重启和蓝屏等。不过,这种攻击不是一般人能实施的。
Simple Network Management Protocol (SNMP) 攻击。SNMP 攻击的主要目标是 SNMP 服务(用于管理网络及其上的设备)。因为 SNMP 用于管理网络设备,所以通过攻击该服务,攻击者能够详细了解网络的结构,从而为以后的攻击做准备。
Web 页面更改攻击
在 Internet 上经常可以看到 Web 页面被更改。顾名思义,Web 页面更改源于攻击者利用 Web 服务器的不良配置修改 Web 页面,其原因有很多,比如为了捉弄别人或推行某种政治主张。
回页首
SQL 注入
结构化查询语言(SQL)注入 是专门针对数据库的攻击。在这种攻击中,攻击者利用数据库或 Web 页面的设计缺陷从数据库提取信息,甚至操纵数据库的信息。虽然我不能详细解释这种攻击是如何实施的,但如果您了解 SQL 的话,就可以找到相关的答案。如果您在 Web 服务器上驻留数据库的话,一定要了解这种攻击。
回页首
不良代码
任何开发人员或信息技术人员都知道,不良的编程习惯会带来问题。不良代码源于众多因素,包括培训质量差、新手或应用程序的质量没有保证。从好的方面讲,不良代码会给人添麻烦,并且某些特性不能按预期工作;从坏的方面讲,包含不良代码的应用程序就成了最大的安全隐患。
回页首
打包代码
这个问题在某种程度上也与不良代码有关,但是有一点不同:这个问题源于为了方便地获得预编译或预编写的组件,在构建应用程序时将使用到它们,从而缩短开发周期。不利的一面是,您用于构建应用程序的组件可能不像内部代码那样经过严格的测试,因此可能会给应用程序带来隐患。另外,有些开发人员并不懂得分析代码,也不知道如何将 “打包” 代码放到应用程序中。至少我见过这样一种情况,一位开发人员通过 “打包” 代码为应用程序提供身份验证机制,同时又偷偷地通过电子邮件将凭证发送给第三方。
回页首
实施保护
我已经向您介绍存在的常见威胁,现在我们看看如何进行自我保护。
首先,我将阐述保护 Web 服务器的 6 点计划:
分开内部和外部 Web 服务器。这似乎是不言自明的,但仍然需要反复提醒。很多组织拥有对内和对外的 Web 应用程序和网站。在理想的情况下,这两组服务器和内容应该是分开的,内部和外部网站都有各自的服务器,并且它们之间的通信要尽可能少。通过以这种方式分开系统,就可以避免(至少降低了风险)攻击者进入服务器,然后访问数据或内部系统。
分开开发和生产服务器。我曾经碰见过好几家公司违背这个规则,它们允许开发团队使用生产服务器开发代码,或调试现有代码。这通常是极端懒惰的结果 — 一旦攻击者盯上您正在开发的代码,就会带来严重的后果。此外,开发人员在测试和调试代码时,可能会损害安全性。为自己做件好事:实现一个开发环境!
定期审计。任何优良的 Web 服务器或 Web 应用程序都能够生成关于系统活动的日志。有了这些记录之后,您需要经常查看它以发现问题,比如应用程序失败或可疑的活动。记住,审计日志好比从犯罪现场收集的证据:在需要它的时候才知道它是如此重要!
及时更新系统。我真的需要这么做吗?当然!我们经常忽视更新系统,但这是错误的。通常,您要关注一下是否发行补丁、服务包和更新等有助于系统安全的东西。您可以自动收到这些更新,或手动下载它们,这取决于您的主机系统以及其他因素。此外,您要记住,有些问题必须通过更新才能修复,比如缓冲溢出和网络客户端等问题。
漏洞扫描。在前一篇文章中(见 参考资料),我讨论了如何使用漏洞扫描作为工具,以查找宿主和应用程序基础设施中存在的问题。漏洞扫描是发现与软件相关的问题的强大工具,比如配置和补丁问题。漏洞扫描工具的另一个优点就是它们会经常更新,因此您可以使用它们发现新问题,通常还能发现您未意识到的问题,从而允许您在系统被侵入之前修复它们。Nessus 是免费的漏洞扫描工具(见 参考资料),不管您使用的是 Linux®、UNIX® 或其他平台,它都是一个好帮手。
开发人员培训。这实施起来可能要困难一些,但一旦完成,将会带来巨大的收益。对开发人员进行安全代码实践方面的培训能够消除或减少不良代码引起的问题。
回页首
其他细节
除了这 6 点计划之外,还有很多其他方法可以增强组织的系统安全。接下来,我们看看一些引起问题的原因,以及如何解决问题。
错误配置
随着硬件和软件日益变得复杂,以及 IT 团队的人员越来越少,检测能力可能会下降。幸运的是,使用漏洞扫描器、自动扫描器,以及借助简单的培训和勤奋能够减少错误配置问题。
标题(Banner)信息
如果您了解标题信息,并知道从哪里找到它,那么您将能获得许多信息。标题信息能够反映可能有助于攻击者的版本信息。
例如,当您向 Web 服务器发出获取一个静态内容的请求(比如很基础的 .html 或 .htm 文件)时,返回的响应将附带有内容位置头部。在一些服务器的默认配置中,这个内容头部将引用一个 IP 地址,或者可能提供也可能不提供完全限定域名(FQDN)。在最坏的场景中,这个头部能够反映内部 IP 地址信息以及其他数据。下面看看清单 1 中的头部。
清单 1. 示例内容位置头部
HTTP/1.1 200 OK
Server:
Content-Location: http://w.x.y.z/index.htm
Date: Thu, 1 Jan 2009 14:03:52 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Wed, 31 Dec 2008 18:56:06 GMT
ETag: “067d136a639be1:15b6”
Content-Length: 4325
这个头部提供许多关于您的服务器的信息,但不用担心:Web 服务器能够根据特定组织的要求修改或简化这些信息。(查看您的 Web 服务器文档了解更多信息)。
权限
权限在某些场合下仍然是一个问题。它们的分配和计划通常不正确或不恰当,从而让个人得以访问不应该访问的服务器位置或应用程序。要经常进行检查,确保您的服务器管理员仅拥有合适的权限:这也被称为最小特权。
错误消息
我们经常收到可怕的 404 消息,它表明无法找到我们所查找的信息,或者这个信息已经被攻击者利用。如果您仔细看,就会发现它提供了更多的信息。对攻击者而言,Web 服务器或应用程序产生的错误消息能够反映它们的配置信息、所使用的库和数据库连接字符串等等。幸运的是,您可以改变它。您应该在开发和测试应用程序时充分利用所有错误消息,通过它们查找问题。但一旦将应用程序或服务器部署到生产环境之后,您应该禁用错误消息,或配置为仅显示常见信息。(查看您的 Web 服务器文档了解更多信息)。
服务
在构建用于驻留 Web 服务器或应用程序的系统时,您应该仔细规划好需要哪些特性和功能,然后根据这个目标构建服务器。一般而言,当您了解服务器的用途之后,您就以此为依据启用所需的服务和特性,并且删除所有不需要的东西。记住,启用和保留所有服务和应用程序将让攻击者有机可乘。
协议
与对待服务一样,您应该禁用或删除任何用不到的协议(比如 NetBIOS)。
用户帐户
在安装操作系统时,操作系统和应用程序常常设置了默认的用户帐户。为了安全起见,您应该关注帐户。您应该查看现有的用户帐户,禁用或删除不需要的帐户。对于需要使用的帐户,应该加强或更改帐户密码。
示例和测试文件
某些 Web 服务器或应用程序还附带有示例和测试文件,以展示产品的用途。在安全的环境中,应该从所有生产 Web 服务器和应用程序中删除这些文件,因为攻击者能够利用它进行非法访问。
端口
查看应用程序和 Web 服务器需要使用的端口,并启用和监控它们。事实上,您应该关闭不使用的端口,并在防火墙中阻止它。
回页首
其他保护措施
为了让宿主环境更加安全,您可能需要用到以下措施:
入侵检测系统(基于主机和网络)。这些系统可以是硬件或软件设备,它们能够监控跨越网络对服务器的访问、来自服务器的访问以及服务器自身的活动。
杀毒软件。您应该在 Web 服务器上安装杀毒软件。
防火墙。有许多可用的防火墙:选择最符合您的需求的防火墙,并将其部署到 Web 服务器。
学会判断。我添加了这个 “措施”。在过去十年中,Internet 进入我们的日常生活(私人和商业世界),那时的思想是从 Internet 获取您所需的东西。由于我们希望通过 Internet 吸引眼球从而超越竞争对手,因此过多的信息被发布到 Internet 上。记住,并不是任何东西都必须出现在 Internet 上。此外还要记住,内容一旦发布到 Internet 上,要收回就非常困难了。您可能不相信,那么请访问 www.archive.org,看看最近 10 年来您以及您的竞争对手的 Web 站点到底发布了多少内容。
回页首
结束语
保护 Web 服务器和驻留在其上的应用程序是一项艰巨的任务,但这项任务并非不可完成。通过一些研究和适当的努力(可能需要偶尔喝杯浓咖啡熬熬夜),您就能够获得更加安全的宿主环境,并避免以后可能发生的麻烦事。