7.1 针对 Web 服务器的攻击途径和防范措施
如果只是在 Web 应用程序里面清除了潜在安全隐患的话,并不足以保证系统的绝对安全性。除了应用程序,还要确保像 Web 服务器(包括 PHP 或 Servlet 容器等中间件)等基础软件的安全性。本章将先介绍一下针对 Web 服务器的攻击手段,然后再阐述如何对其进行防御。
7.1.1 利用基础软件漏洞进行攻击
操作系统及 Web 服务器等软件也会存在漏洞,Web 服务器有可能因为这些基础软件的漏洞导致被入侵。另外如果 Web 服务器中还存在跨站脚本攻击(XSS)漏洞的话,则有可能导致发生被动攻击从而进一步对用户造成侵害。
利用了基础软件漏洞的攻击会导致各种次生灾害发生,比如网站被篡改、信息泄露、拒绝服务,或者被用来当作跳板进而发动对其他服务器的攻击等。
7.1.2 非法登录
网络上有很多针对管理 Web 服务器用的软件(Telnet、FTP、SSH 等服务器软件,以及 phpMyAdmin 或者 Tomcat 的管理页面)密码进行暴力破解的攻击。攻击者事会先对服务器进行端口扫描来确认哪些端口或是服务是开放的,然后针对开放的端口或者服务进行基于字典的暴力破解攻击。
如果管理服务器用的密码被破解的话,会造成网站内容被篡改或信息泄露等各种重大问题。
7.1.3 对策
为了预防针对 Web 服务器的攻击,可以采取以下的对策。
- 停止运行不需要的软件
- 定期实施漏洞防范措施
- 对不需要对外公开的端口或者服务加以访问限制
- 提高认证强度
下面分别对这几项加以说明。
停止运行不需要的软件
在 Web 服务器上同时运行的那些不需要对外提供服务的软件,很可能会成为外部攻击的入口。而且这些不对外提供服务的软件也需要进漏洞防范措施等,会产生运营成本。所以停止运行这些不必要软件,既能降低成本,也能使系统更安全。
定期实施漏洞防范措施
Web 服务器软件及编程语言等基础软件也需要实行漏洞预防措施。应对 Web 服务器的漏洞可以按照下面的步骤实施。
- 前期设计时应该考虑的事情
- 确认软件支持期限
- 决定打补丁(升级)的方法
- 运营开始后需要做的事情
- 随时关注漏洞发布信息
- 漏洞出现后调查补丁状况以及防范对策、并制定对应计划
- 执行漏洞对应计划
- 选定软件时确认软件的升级状况
作为软件漏洞对策,可选取的方法有打补丁和版本升级两种。需要注意的是,很可能在网站运营期间,就出现所选用的软件停止开发或更新的情况。
有的商用软件公司会通过软件支持生命周期政策(Support Lifecycle Policy)的形式公布软件的支持期限。比如微软的服务端产品都会保证在新版本出来之后 7 年内继续提供系统补丁 1 。不同软件公司及不同的产品,其所能提供的软件支持生命周期政策长短也各有不同,需要在选择某一产品之前确认清楚。
免费软件和开源软件(FLOSS)则很多都没有公布具体的软件支持生命周期政策,这一点尤其要注意。在选择 FLOSS 作为基础软件的时候,可以通过查看该软件过去的升级记录,来预测未来软件是否能得到可靠的保障。
下图显示了各 PHP 的主要版本支持情况。从图中可以看出,PHP4.x 系列的支持期限为从 PHP5 发布开始,在 3 年半之内都会提供技术支持。
图 7-2 各 PHP 主版本的支持期限
如上图显示的那样,PHP 的版本升级还是很活跃的。而另一方面,旧版本的支持期限都比较短,如果在网站运维中所使用的 PHP 版本不被官方支持了,就会带来安全上的隐患。不光是 PHP,所有使用了 FLOSS 的都需要考虑到这一问题。
综上所述,如果基础软件选择 FLOSS 的话,需要在系统开发前期就预测到 Web 网站在运维阶段可能会发生的软件版本升级的可能性,并针对迁移到新版本所需要的费用进行运维上的预算。
- 确定打补丁方式
在选择基础软件的时候,最好同时也确定给软件进行打补丁的方法。基本上给软件打补丁可以采用下面的方法。
- 重新安装最新版本的软件
- 在源代码级别打补丁后再编译(Make)
- 使用系统提供的包管理软件(APT 或者 Yum 等)
- 使用补丁软件(Windows Update 或者 WSUS 等)
打补丁的方法也受软件安装方法的影响。比如在使用包管理系统安装的软件,打补丁也需要通过包管理软件来完成。通过其他方法安装的软件,可以进行单独打补丁后编译,或者安装新版软件的方法。
此外,像 PHP 等编程语言版本升级后,由于语言本身的规范有可能会有变更,所以就可能会导致系统运行异常。因此在版本升级前需要确定升级的影响范围,并对应用程序进行全面的功能测试。
利用包管理系统打补丁的时候,由于不会修改软件本身的规格,而只是打上 Bug 或漏洞修复补丁,所以由此导致应用程序不能正常工作的可能性比较低。与之相对应的,包管理系统提供的软件的版本一般都会比最新的版本稍微旧一些。但是根据 Linux 的发行版本不同,也有的包管理系统都会提供最新版本的软件(Fedora 等)。
可见,上述所说的给软件打补丁的方法各有利弊,软件的安装方法不同,打补丁的方式也不同。这就需要在选定某一软件的时候,要同时确认软件的安装方法以及打补丁的方法。
下面是在本书附带的漏洞系统镜像系统(请到本书的支持页面下载: http://www.ituring.com.cn/book/1249 )里进行软件升级的例子。apt-get 命令是 Ubuntu 或 Debian 等 Linux 发行版本采用的包管理程序 APT 的一个命令。带有下划线的部分是需要在命令行输入的命令。
执行示例 在漏洞系统镜像系统里进行软件升级的例子
Fedora 以及 CentOS、Red Hat Enterprise Linux 等 Linux 发行版本都采用 Yum 作为包管理系统。关于包管理系统的详细说明请参考关于 Linux 的书籍。
- 关注各种漏洞相关信息
每天都会有各种系统漏洞被发现,每天也都会公开应对的方法或者安全补丁。为了保证 Web 网站的安全性,需要关注各种相关软件的漏洞信息,并实时采取对应措施。
各种漏洞信息一般会通过 Web 站点或者邮件列表公布。在 Web 应用开始运营之前,就需要确定如何收集这些软件漏洞信息,建立能及时监视这些漏洞信息的体制。
下面列举了一些发布漏洞信息的权威网站。除了关注应用程序所采用软件的漏洞信息之外,最好也能对这些网站保持关注。2
- JVN(Japan Vulnerability Notes)
- JVN iPedia 漏洞信息数据库
不管哪个网站都提供了 RSS 订阅功能。订阅了这些 RSS 的话,将对及时获取各种信息有很大帮助。
- 确认漏洞后调查补丁状况以及防范对策、并制定对应计划
在确认漏洞信息之后,按照如下步骤制定漏洞对应计划。
1. 是否在使用存在漏洞的软件
2. 确认此漏洞导致的影响,讨论是否需要针对此漏洞采取应对措施
3. 决定应对方法
4. 制定详细的实施计划
前面两步主要讨论是否有对此漏洞采取应对措施的必要性,有时候会很难判断漏洞是否会给系统带来影响,这时候可以采取只要系统使用着出现漏洞的软件,一律打补丁、升级。
漏洞的应对方法,有以下 3 种方式。
- 安装修正程序或安全补丁(根本性解决方法)
- 升级到解决了漏洞的新版本(根本性解决方法)
- 采取回避对策(临时措施)
这里所说的回避对策,是指通过采取修改配置等方法来达到系统不受漏洞影响的目的。回避措施一般是在安全补丁还没有公布,或者补丁的可靠性没有得到验证而不能打入补丁等情况下,作为临时措施来施行。
在实施计划中,需要确定以下事项。
- 在测试环境验证(是否需要重启服务器,应用程序是否正常运行,切换回老系统方法的确认)
- 实施日程表
- Web 网站停止服务公告
- 服务器的备份步骤
- 实施项目的详细化
- 实施后验证方法的详细化
- 创建实施步骤及检查表(Check List)
上面描述的是一个比较完整的实施计划。如果现实情况允许短时间停止 Web 服务器,则可以省略在测试环境上的验证步骤,而直接在正式环境下打补丁。此外,还可能存在不能准备测试环境的情况。不管哪种情况,都需要在打补丁之前进行完整的备份,以防打补丁后发生系统故障。
- 执行漏洞对应计划
制订了漏洞应对计划后,只要按计划执行就可以了。
打补丁或者版本升级结束之后,需要记录工作记录,同时在系统环境构成表(系统架构说明文档)里修改更新过的各模块,记录相关软件的最新版本等信息。
1 http://www.microsoft.com/japan/presspass/detail.aspx?newsid=1932 (参考日期:2010 年 12 月 4 日)
2 常用的中文和英文网站有:
WooYun(国内): http://www.wooyun.org/
SecurityFocus(国外): http://www.securityfocus.com/
National Vulnerability Database(国外): http://nvd.nist.gov/ ——译者注
对不需要对外公开的端口或服务加以访问限制
SSH 服务(sshd)或 FTP 服务作为对服务器进行管理的常用软件,不能随意停止其服务运行,但是可以通过增加对这些服务的访问限制,来提高系统的安全性。
即使不是有名的网站,只要接入到网络中,SSH 或 FTP 等端口也会受到来自世界各地的攻击。对这些端口加以访问上的限制,可以有效的抵御这种无差别攻击。具体的方法有下面两种。
- 只允许来自专线或者 VPN 的连接
- 只允许来自指定 IP 的访问
其中限定 IP 的方法有下面几种。
- 在网络入库的路由或者防火墙上进行 IP 限制设置
- 利用服务器 OS 自带的功能(Windows 防火墙,或者 iptables、TCP Wrapper 等)进行 IP 限制
- 利用软件自身的访问限制功能
下面的例子是使用 TCP Wrapper 来限制只有本地网络才能访问 sshd 服务的例子。首先在 /etc/hosts.deny 文件里禁止所有的访问请求,之后在 /etc/hosts.allow 文件里设置允许来自本地网络的访问请求。在需要通过网络进行系统维护的时候,最好使用固定 IP 访问服务器,并在服务器里对访问 IP 进行限制,这是非常安全的方法。
执行示例 使用 TCP Wrapper 对 sshd 进行访问限制设置
如果出口 IP 不是固定 IP 的话,建议在最小范围内限制能访问服务器的 IP。笔者由于需要在公司外面对 Web 服务器进行远程维护,所以我在配置文件里指定了 ISP 的域名,来设置能访问服务器的远程连接请求(图中 ISP 的域名为非真实域名)。
通过查看服务器的日志(/var/log/secure)可以发现,针对 SSH 服务器的大部分攻击都是来自国外的 IP 地址,所以上面的设置能遮断大部分的攻击请求。尽管如此,也还是存在绕过 IP 地址限制的可能性的,这个问题可以请参考后面的关于强化认证功能的章节。
- 通过端口扫描确认各端口服务状态
可以通过端口扫描工具来方便的验证访问限制是否有效。下面的图 7-3 就是使用端口扫描工具 Nmap3 (Windows 版)对本书附带的 Linux 镜像进行端口扫描的结果(默认设置时的结果)。Nmap 是有名的端口扫描工具,而且是一个开源软件。
图 7-3 端口扫描
从上图可以看出,这个系统一共运行着 SSH、SMTP、HTTP、POP3 等 4 种服务 4 。这其中 SSH 是不需要对外部公开的端口,所以需要按照前面介绍过的方法进行访问上的限制。
此服务器内同时还运行着 PostgreSQL 服务,但是 Nmap 的扫描结果并没有显示出来。这说明 PostgreSQL 不会接受来自外部的连接请求。
下面图 7-4 显示的则是对笔者个人研究用的 Windows Server 进行端口扫描的结果。
图 7-4 对笔者的研究用服务器进行端口扫描的结果
笔者这台研究用服务开着很多端口接受来自外部的连接请求,如果这样的状态直接接入公网的话,是非常危险的。然而根据笔者进行安全咨询的经验,像这样开着很多端口的服务器还是时不时地能见到的。
Web 网站在运营时需要提供哪些服务,开放哪些端口,最好在前期设计的时侯就设计好,然后在系统投入运营之前,利用端口扫描等工具进行开放端口检查 5 。
4 443 端口为 HTTPS 所使用,Nmap 的画面上都显示为 HTTP。
5 端口扫描要检查的是对外部网络访问开放的端口,需要使用接入到外网环境进行扫描。
提高认证强度
前面已经说过,系统管理用的软件应该对访问来源的 IP 地址进行严格的限制,然而这是不够的,还需要加强管理用软件的用户认证强度。具体可以采取以下措施。
- 删除或者停止 Telnet 和 FTP 服务,只使用 SSH 服务
- 在 SSH 服务中使用公钥认证方式来代替密码认证
说起 Telnet 和 FTP 的问题,一般人都会想到到非加密通信,然而笔者认为最大的问题应该是没有采用高强度的认证方式。像之前说到的那样,针对 Telnet、FTP、SSH 等的密码暴力破解攻击一直存在。即使使用了 SSH,在采用用户 / 密码作为认证方式这一点上,SSH 和 Telnet 等并没有太大的差异,强烈建议使用公钥认证方式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论