浅谈Web服务器安全之ApacheHTTPServer安全

三连一下,你会知道的更多~

在互联网高速发展的今天,Web服务器已成为互联网不可或缺的一部分。随着Web应用越来越广泛,攻击者也将攻击目标瞄准了Web服务器,所以其安全性也越来越受到人们的重视。Apache HTTP Server作为最流行的Web服务器之一,其自身的安全性尤为重要。本文不仅简单介绍了Apache HTTP Server,还针对其可能存在的漏洞如何进行安全加固,以及日志审计,有效提高Apache HTTP Server自身的安全性。

一、Apache HTTP Server介绍

Apache是目前世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一,其快速、可靠且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

Apache HTTP服务器是一个模块化的服务器,世界上很多著名的网站如Amazon、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

Apacheweb服务器软件拥有以下特性:

1. 支持HTTP/1.1通信协议

2. 拥有简单、强有力的基于文件的配置过程

3. 支持通用网关接口

4. 支持基于IP和基于域名的虚拟主机

5. 支持多种方式的HTTP认证

6. 集成Perl处理模块

7. 集成代理服务器模块

8. 支持实时监视服务器状态和定制服务器日志

9. 支持服务器端包含指令(SSI)

10. 支持安全Socket层(SSL)

11. 提供用户会话过程的跟踪

12. 支持FastCGI

13. 通过第三方模块可以支持JavaServlets

二、Apache HTTP Server安全加固

Apache的安全加固主要从以下两点考虑:一是Apache Web服务器 本身是否安全,是否存在安全或软件漏洞;二是Apache Web 服务器是否提供了可使用的安全特性,这部分主要是检查Apache的配置是否得当,在安全性、可用性、稳定性之间取得平衡。

Apache HTTP Server加固首先建议选择最新的稳定版本,且符合各单位系统和安全部门设置的安全基线要求,在升级版本时,建议优先在测试环境中测试通过后再逐步开展各业务系统升级,以避免由于兼容性带来的问题,并充分进行非功能测试。另外在安装时使用自定义的安装路径,并配置使用自定义的WEB目录。除此之外,针对Apache的安全特性,有如下加固建议:

2.1 Apache运行账号配置

以专用的用户帐号和组运行 Apache(注意:切勿使用超级管理员用户运行)。根据需要为 Apache 创建用户、组。参考配置操作如下:

(1) 创建 apache 组:groupadd apache

(2) 创建 apache 用户并加入 apache 组:useradd apache –g apache

(3) 将下面两行加入 Apache 配置文件 httpd.conf 中

检查 httpd.conf 配置文件中是否允许使用非专用账户(如 root 用户)运行 Apache 服务。默认配置一般即符合要求。Linux 系统中默认使用 apache 或者 nobody 用户,Unix 系统默认使用 daemon 用户。

2.2 授权配置

严格控制Apache主目录的访问权限,配置非超级用户不能修改该目录中的内容。

Apache 的 主目录对应于 Apache Server配置文件 httpd.conf 的Server Root控制项默认为:

ServerRoot:指出服务器保存其配置、出错和日志文件等的根目录,注意:路径的结尾不要添加斜线。

一般更改为/etc/httpd目录,默认情况下属主为root:root,其它用户不能修改文件,默认一般符合要求严格配置配置文件和日志文件的权限,防止未授权访问。

• 使用命令“chmod 600 /etc/httpd/conf/httpd.conf”配置配置文件为属主可读写,其他用户无权限。

• 使用命令”chmod 644 /var/log/httpd/*.log”配置日志文件为属主可读写,其他用户只读权限。

2.3  httpd.conf配置文件详细说明

• MaxKeepAliveRequests:允许持久连接的请求数。配置为0,允许无限数量。建议把这个数字保持在最高,以达到最大的性能。

• KeepAliveTimeout:等待下一个请求的秒数相同的客户端在同一连接上。

• # 服务器池大小调节(MPM特定)

• # prefork MPM (多处理模块)

• StartServers:启动服务器进程的数量

• MinSpareServers:空闲的服务进程的最小数

• MaxSpareServers:空闲的最大服务进程数

• ServerLimit:对MaxClients生命周期最大值

• MaxClients:客户端进程的最大数

• MaxRequestsPerChild:服务器进程服务的请求的最大数量

2.4 PidFile详细说明

PidFile指定的文件将记录httpd守护进程的进程号,由于httpd能自动复制其自身,因此系统中有多个httpd进程,但只有一个进程为最初启动的进程,它为其他进程的父进程,对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。

2.5 监听地址绑定

如果服务器有多个 IP 地址时,建议只监听提供服务的 IP 地址。

2.5.1 使用命令查看是否绑定IP地址

2.5.2 修改httpd.conf 配置

默认配置是Listen 80监听0.0.0.0所有IP地址,如果服务器只有一个IP地址可不做该项配置,如果有多个IP可以按照实际需要配置。

2.6 禁止访问外部文件

禁止 Apache 访问 Web 目录之外的任何文件。通过编辑 httpd.conf 配置文件:

配置可访问目录:

其中 /web 为网站根目录。

2.7 禁止目录列出

目录列出会导致明显信息泄露或下载,建议禁止 Apache 列表显示文件。

2.7.1 编辑 httpd.conf 配置文件:

将Options Indexes FollowSymLinks 中的Indexes去掉,就可以禁止Apache显示该目录结构。Indexes的作用就是当该目录下没有index.html文件时,就显示目录结构。

2.7.2 重新启动 Apache 服务。

2.8 错误页面重定向

Apache 错误页面重定向功能防止敏感信息泄露。

2.8.1 修改 httpd.conf 配置文件:

Customxxx.html 为自定义的错误页面。

2.8.2 重新启动 Apache 服务。

2.9 防范拒绝服务

根据业务需要,合理配置 session 时间,防止拒绝服务攻击。

2.9.1 修改 httpd.conf 配置文件:

2.9.2 重新启动 Apache 服务。

2.10 隐藏Apache 版本信息

为了避免版本信息泄露,需要在httpd.conf配置ServerTokens为Prod,这会在响应头中显示“Server:Apache”而不包含任何的版本信息。

下面是ServerTokens的一些可能的赋值:

• ServerTokens Prod 显示“Server: Apache”

• ServerTokens Major 显示 “Server: Apache/2″

• ServerTokens Minor 显示“Server: Apache/2.2″

• ServerTokens Min 显示“Server: Apache/2.2.17″

• ServerTokens OS 显示 “Server: Apache/2.2.17 (Unix)”

• ServerTokens Full 显示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″ (如果你这指定任何的值,这个是默认的返回信息)

2.11 关闭TRACE功能

TRACE_Method是HTTP(超文本传输)协议定义的一种协议调试方法,该方法会使服务器原样返回任意客户端请求的任何内容。

TRACE和TRACK是用来调试web服务器连接的HTTP方式。支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。

建议关闭 TRACE,防止 TRACE 方法被访问者恶意利用。通过修改httpd.conf配置,具体如下:

2.12 禁用 CGI

如服务器上不需要运行 CGI 程序,建议禁用 CGI。通过修改配置httpd.conf,将cgi-bin 目录的配置和模块都注释掉。

2.13 删除缺省安装的无用文件

建议删除缺省安装的无用文件,包括:

2.13.1 删除缺省 HTML 文件

2.13.2 删除 Apache 帮助手册

2.13.3 删除源代码文件

2.13.4 删除缺省的CGI脚本

2.13.5删除CGI ,可根据实际情况删除,一般是 /var/www/html /var/www/cgi-bin 默认就是空的

注意:根据安装步骤不同和版本不同,某些目录或文件可能不存在或位置不同。

2.14 禁用非法 HTTP 方法

禁用PUT、DELETE等危险的HTTP 方法。通过编辑 httpd.conf 文件,仅允许 get、post 方法。

2.15 日志配置

建议配置日志功能,对运行错误、用户访问等事件进行记录,记录内容包括时间,用户使用的 IP 地址等内容。通过编辑 httpd.conf 配置文件,配置日志记录文件、记录内容、记录格式。

• 日志的级别LogLevel,默认是warn,notice级别比较详细,实际中由于日志会占用大量硬盘空间。LogLevel 用于调整记录在错误日志中的信息的详细程度,建议配置为notice。

• 错误日志ErrorLog 指令配置错误日志文件名和位置。错误日志是最重要的日志文件,Apache httpd将在这个文件中存放诊断信息和处理请求中出现的错误。

• 若要将错误日志送到 Syslog,则配置:ErrorLog syslog。

• CustomLog 指令指定了保存日志文件的具体位置以及日志的格式。访问日志中会记录服务器所处理的所有请求。

• LogFormat 配置日志格式,建议配置为 combined 格式。

2.16 使用安全模块来保障Apache的安全

“mod_security”和“mod_evasive”是Apache在安全方面非常流行的两个模块。mod_security作为防火墙而运行,它允许我们适时地监视通信,还可以有助于我们保护网站或Web服务器免受暴力破解攻击。借助默认的包安装程序,可以轻松地把mod_security安装在服务器上。

另一个模块mod_evasive的工作效率很高,它只采用一个请求就可以很好地工作,可防止DDoS攻击造成巨大危害。mod_evasive可以应对http暴力破解攻击和DoS(或DDoS)攻击。该模块可以在三种情况下检测攻击:一是在每秒钟内有太多请求到达同一个页面时,二是在任何子进程试图发出超过50个并发请求时,三是在任何地址已经被临时列入黑名单时它仍试图尝试新的请求,建议可根据实际生产需求进行合理设置。

2.17 DDoS攻击的防御和强化

可通过下列参数对DDoS攻击行防护和控制:

• TimeOut指令用于配置在特定事件失效之前,服务器等待事件完成的时间长度。其默认值是300秒。对于容易遭受DDoS攻击的网站,把这个值降低很有好处。这个值的大小取决于网站上的请求种类。注意,对于某些CGI脚本,这个配置可能会产生问题。

• MaxClients:此指令允许用户配置服务器可同时服务的连接限制。每一个新连接都要根据这个限制进行排队。它适用于Prefork和Worker。其默认值为256。

• KeepAliveTimeout:在关闭连接之前,服务器随后的等待时间长度。默认值是5秒。

• LimitRequestFields:这个配置可以帮助限制可接受的HTTP请求的头部字段数量。其默认值为100。有时,由于http的请求头部过多而导致发生DDoS攻击,用户不妨降低这个值。

• LimitRequestFieldSize:帮助我们配置HTTP请求头部的大小。

2.18 启用ssl证书保障Apache的安全

建议启用SSL证书用加密的方式保障信息传输的安全,默认情况下,Web服务器用明文发送账户、口令等敏感信息,可启用SSL证书对相关敏感流程进行加密传输,提升数据传输安全性:

• openssl genrsa -des3 -out example.com.key 1024

• openssl req -new -key example.com.key -out exmaple.csr

• openssl x509 -req -days 365 -in example.com.com.csr -signkey example.com.com.key -out example.com.com.crt

在创建并签署证书之后,需要在Apache配置中增加这个证书。用vim编辑器打开主配置文件,并增加如下的内容,重启服务生效:

三、典型漏洞及修复方案3.1 文件名解析漏洞成因

Apache对于文件名的解析是从后往前解析的,直到遇见一个它认识的文件类型为止。因此,如果web目录下存在以类似webshell.php.test这样格式命名的文件,Apache在解析时因为不认识.test这个文件类型,所以会一直往前解析,当解析到.php时,它认识了,因此会将它解析为PHP文件。

Apache的这种解析特性经常被用来绕过Web应用的文件上传检测。当Web应用的文件上传功能在检测上传文件的合法性时,如果仅通过检测上传文件的扩展名来判断文件是否合法,即可利用Apache的这种文件名解析特征绕过Web应用的检测。

下面来看一个实例:目标网站后台存在一个上传图片的功能,只允许上传JPG和GIF图片格式的文件。但程序在验证上传文件合法性处存在漏洞,只是简单地通过上传文件扩展名来确定文件是否合法,这时我们就可以利用Apache的文件名解析特征来绕过这种检测。将文件名修改为类似phpshell.php.jpg的格式进行上传,发现绕过了检测,文件被成功上传到目标网站。

3.2 漏洞修复

可以通过在httpd.conf配置文件中添加以下内容来阻止Apache来解析这种文件。

修改后需要重启Apache服务生效,这样即使攻击者上传了类似phpshell.php.jpg这样格式的文件,Apache也不会将它解析为PHP文件了。

四、Apache 服务器日志审计

Apache 服务的日志文件,默认情况下主要有两种:

• /var/log/httpd/access_log 记录用户访问网站的记录信息

• /var/log/httpd/error_log 记录用户错误请求的信息,包括 Web 服务启动或运行过程中的问题,比如网页找不到、文件权限配置不正确等。

初步整理Apache日志审计分析思路如下:

4.1 Apache 服务日志的分析

Apache 的访问日志默认存放在 Apache 安装目录的 logs 目录下,名称为 access.log,具体位置可以在 httpd.conf 或 Apache 安装目录下的 conf/vhosts/ 目录中的站点配置文件**.conf 中进行指定。

各字段说明:

• 客户端IP 123.118.235.44

• 由客户端 identd 进程判断的 RFC1413 身份(identity)

• 记录用户HTTP的身份验证 

• 服务器完成请求处理时的时间 [21/Jan/2015:20:23:53 +0800]格式:[日/月/年:时:分:秒 时区]

• 请求方式,请求资源,协议 GET /info.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1

• 协议状态码 200

• 服务器向客户端发送的字节数 2524

4.2 常用日志分析命令

4.2.1 获得访问前 10 位的 IP 地址:

cat access_log | awk {print $1} |sort|uniq -c |sort -nr |head -10

4.2.2 访问次数最多的文件或页面,取前 10:

cat access_log |awk {print $11}|sort |uniq -c| sort -nr | head -10

4.2.3 统计此日志文件中所有的流量:

cat access_log |awk {sum+=$10} END {print sum/1024/1024/1024 "G"}’

4.2.4 列出输出大于 byte (约200kb) 的 exe 文件以及对应文件发生次数:

cat access_log |awk ($10 >&& $7~/\.exe/){print $7}|sort -n|uniq -c|sort -nr|head -100

4.2.5 如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面:

cat access_log |awk ($7~/\.php/){print $NF " " $1 " " $4 " " $7}|sort -nr|head -20

4.2.6 列出最最耗时的页面(超过 60 秒的)的以及对应页面发生次数:

cat access_log |awk ($NF > 60 && $7~/\.php/){print $7}|sort -n|uniq -c|sort -nr|head -2

4.2.7 列出传输时间超过 30 秒的文件:

cat access_log |awk ($NF > 30){print $7}|sort -n|uniq -c|sort -nr|head -20

4.2.8 统计 404 的连接

awk ($9 ~/404/) access_log | awk {print $9,$7} | sort |uniq -c |head -10

4.2.9 统计 HTTP Status

cat access_log |awk {print $9}|sort|uniq -c|sort -rn

4.2.10 爬虫分析查看是哪些爬虫来访问过

cat access_log |awk {print $12} | grep -iE bot|crawler|slurp|spider |sort |uniq –c

4.3 如何从日志中确认恶意行为

• ‘ 单引号需要注意,因为这通常是SQL注入攻击的特征

• ../ 和 .. 表示目录跳转

• 注意对以下两个文件的请求,如果其服务器对应的响应代码是200,可能意味着系统已经失陷了

/etc/passwd

/etc/shadow

• 以下各种路径如果在web日志中出现,也值得严重关切:

/bin/ksh

/bin/bash

/bin/id

/bin/cat

• 在windows平台需要在web日志中注意如下内容:

msadc/.?

scripts/..\\../winnt/system32/cmd.exe?/c+dir

cmd.exe

net.exe

netstat.exe

• 如果攻击成功,通常会使用一些常用的命令,这里面可能包括如下的特征:

| 管道

< 输出重定向

; 分号

· ASCII控制字符。

五、总结

随着互联网技术的不断发展,在企业信息化、数字化转型的过程中,越来越多的应用构建在开源Web服务器之上对互联网开放,Web服务器也面临着越来越多的安全威胁,Web服务器自身的安全性直接影响到Web应用的安全性。因此,持续加强Web服务器自身的安全防护能力及安全日志大数据分析能力,是构建企业纵深安全防御体系的重要一环。