第 15 章 Web Server 配置安全
Web 服务器是 Web 应用的载体,如果这个载体出现安全问题,那么运行在其中的 Web 应用程序的安全也无法得到保障。因此 Web 服务器的安全不容忽视。
Web 服务器安全,考虑的是应用部署时的运行环境安全。这个运行环境包括 Web Server 、脚本语言解释器、中间件等软件,这些软件所提供的一些配置参数,也可以起到安全保护的作用。
15.1 Apache 安全
尽管近年来 Nginx 、 LightHttpd 等 Web Server 的市场份额增长得很快,但 Apache 仍然是这个领域中独一无二得巨头,互联网上大多数得 Web 应用依然跑在 Apache Httpd 上。
Web Server 的安全我们关注两点:
- Web Server 本身是否安全;
- Web Server 是否提供了可使用的安全功能。
纵观 Apache 的漏洞史,它曾经出现过许多次高危漏洞。但这些高危漏洞,大部分是由 Apache 的 Module 造成的,Apache 核心的高危漏洞几乎没有。Apache 有很多官方与非官方的 Module ,默认启动的 Module 出现过的高危漏洞非常少,大多数的高危漏洞集中在默认没有安全或 enable 的 Module 上。
因此,检查 Apache 安全的第一件事情,就是检查 Apache 的 Module 安装情况,根据“最小权限原则”,应该尽可能地减少不必要的 Module ,对于要使用的 Module ,则检查其对应版本是否存在已知的安全漏洞。
定制好了 Apache 的安装包后,接下来需要做的,就是指定 Apache 进程以单独的用户身份运行,这通常需要为 Apache 单独建立一个 user/group 。
需要注意的是,Apache 以 root 身份或者 admin 身份运行是一个非常糟糕的决定。 这里是 admin 身份是指服务器管理员在管理机器时使用的身份。这个身份的权限也是比较高的,因为管理员有操作管理脚本、访问配置文件、读/写日志等需求。
使用高权限身份运行 Apache 的结果可能时灾难性的,它会带来两个可怕的后果:
- 当黑客入侵 Web 成功时,将直接获得一个高权限(比如 root 或 admin )的 shell 。
- 应用程序本身将具备较高权限,当出现 bug 时,可能会带来较高风险,比如删除本地重要文件、杀死进程等不可预知的结果。
比较好的做法是使用专门的用户身份运行 Apache ,这个用户身份不应该具备 shell ,它唯一的作用就是用来运行 Web 应用。
Apache 还提供了一些配置参数,可以用来优化服务器的性能,提高对抗 DDOS 攻击的能力。
- TimeOut
- KeepAlive
- LimitRequestBody
- LimitRequestFields
- LimitRequestFieldSize
- LimitRequestLine
- LimitXMLRequestBody
- AcceptFilter
- MaxRequestWorkers
15.2 Nginx 安全
近年来 Nginx 发展很快,它的高性能和高并发的处理能力使得用户在 Web Server 的选择上有了更多的空间。
就软件安全本身来看,Nginx 与 Apache 最大的区别在于,检查 Apache 安全时更多的要关注 Module 的安全,而 Nginx 则需要注意软件本身的安全,及时升级如那件版本。
15.3 jBoss 远程命令执行
jBoss 是 J2EE 环境中一个流行的 Web 容器,但是 jBoss 在默认安全时提供的一些功能却不太安全,如果配置不得当,则可能直接造成远程命令执行。
由于 jBoss 在默认安装时会有一个管理后台,叫做 JMX-Console ,默认安装时访问 JMX-Console 是没有任何认证的。
在 JMX-Console 中,有多种可以远程执行命令的方法。最简单的方式,是 通过 DeploymentScanner 远程加载一个 war 包。
因此出于安全防御的目的,在加固时,需要删除 JMX-Console 后台,事实上,jBoss 的使用完全可以不依赖于它。要移除 JMX-Console,只需要删除 jmx-console.war 和 web-console。war即可,它们分别位于 $JBOSS_HOME/server/all/deploy
和 $JBOSS_HOME/server/default/deploy
目录下。
如果出于 约我需要不得不使用 JMX-Console ,则应该使用一个强壮的密码,并且运行 JMX-Console 的端口不应该面向整个 Internet 开放。
15.4 Tomcat 远程命令执行
Apache Tomcat 与 jBoss 一样,默认也会运行在 8080 端口。它提供的 Tomcat Manager 的作用与 JMX-Console 类似,管理员也可以在 Tomcat Manager 中部署 war 包。
虽然 Tomcat 后台有密码认证,但笔者仍然强烈建议删除这一后台,因为攻击者可以通过暴力破解等方式获取后台的访问权限,从安全的角度看,这增加了系统的攻击面,得不偿失。
15.5 HTTP Parameter Pollution
在 2009 年的 OWASP 大会上,Luca 、Carettoni 等人演示了这种被称为 HPP 的攻击。简单来说,就是通过 GET 或 POST 向服务器发起请求时,提交两个相同的参数,那么服务器会如何选择呢?
比如提交:
/?a=test&a=test1
在某些服务端环境中,会只取第一个参数;而在另外一些环境中,比如 .net 环境中,则会变成:
a=test,test1
这种特性在绕过一些服务器端的逻辑判断时,会非常有用。
这种 HPP 攻击,与 Web 服务器环境、服务器端使用的脚本语言有关。HPP 本身可以看做服务器端软件的一种功能,参数选择的顺序是由服务器端软件所决定的。
HPP 这一问题再次提醒我们,设计安全方案必须要熟悉 Web 技术方方面面的细节,才不至于有所疏漏。从防范上来看,由于 HPP 是服务器软件的一种功能,所以只需在具体的环境中注意服务器环境的参数取值顺序即可。