Apache 安全加固实战:服务器配置防护指南

Apache 安全加固是 Web 服务器上线前必须完成的基础工作:Apache 默认配置会暴露版本号、允许目录浏览并加载大量不必要的模块,攻击者可借此收集指纹信息或直接利用目录遍历漏洞读取敏感文件。本文提供一套可直接执行的 Apache 加固配置方案,覆盖信息隐藏、权限收敛与请求过滤三个层面。

适用场景

  • 自建或云主机上运行 Apache 2.4.x 的生产服务器(CentOS / Ubuntu / Debian)
  • 安全扫描发现 Server 响应头泄露版本、目录索引开启等中危告警
  • 等保测评或渗透测试前需要快速收敛 Web 服务器攻击面
  • 以 Apache 作为前端代理或静态资源服务的业务系统

前置条件

  • 服务器 root 或 sudo 权限,可修改 Apache 配置并执行 reload/restart
  • 确认 Apache 版本:apache2 -v(Debian/Ubuntu)或 httpd -v(CentOS/RHEL)
  • 业务当前可正常访问,方便加固后回归验证

原理说明

Apache 的主要安全风险来自四类默认行为:

  • 信息泄露:默认响应头携带版本号与操作系统信息(如 Server: Apache/2.4.41 (Ubuntu)),攻击者据指纹匹配已知 CVE 定向利用。
  • 目录浏览Options Indexes 默认开启时,无 index 文件的目录会列出全部文件,源码、备份包可能直接暴露。
  • 模块与请求面过大:默认加载 mod_infomod_statusmod_autoindex 等模块,若暴露到公网可泄露服务器状态与配置。
  • 危险的 HTTP 方法与符号链接PUT/DELETE 方法可被利用写文件;FollowSymLinks 可能造成路径穿越。

加固的核心思路是「最小暴露、显式拒绝」:隐藏指纹、关闭目录索引、卸载无用模块、白名单化允许的 HTTP 方法,再叠加 mod_security 规则层防护。

操作步骤

1. 隐藏版本号与服务器指纹

# 编辑主配置文件
# Debian/Ubuntu: /etc/apache2/apache2.conf
# CentOS/RHEL:   /etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature Off
# ServerTokens Prod 只输出 "Apache",不显示版本与操作系统
# ServerSignature Off 关闭错误页脚部的版本信息行

2. 关闭目录浏览并收敛默认权限

# 全局禁用 Indexes 与 FollowSymLinks,按需在具体目录重新开启
<Directory />
    Options -Indexes -FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>
# 为网站根目录单独放行
<Directory /var/www/html>
    Options -Indexes
    Require all granted
</Directory>

关键参数:Options -Indexes 关闭目录索引;AllowOverride None 禁用 .htaccess 覆盖(减少被上传恶意 .htaccess 的风险);根目录 Require all denied 兜底拒绝。

3. 卸载/禁用危险模块

# Debian/Ubuntu
a2dismod autoindex status info userdir
systemctl reload apache2
# CentOS/RHEL:注释 /etc/httpd/conf.modules.d/ 下对应 LoadModule 行
# 或直接删除模块文件
rm -f /etc/httpd/modules/mod_info.so /etc/httpd/modules/mod_status.so
systemctl reload httpd

4. 限制 HTTP 方法与请求头大小

<Location />
    # 只允许常规安全方法,拒绝 PUT/DELETE/TRACE
    <LimitExcept GET POST HEAD OPTIONS>
        Require all denied
    </LimitExcept>
    # 禁用 TRACE(防 XST 跨站追踪)
    TraceEnable Off
</Location>
# 限制请求行与请求头大小,防缓冲区类攻击
LimitRequestLine 4096
LimitRequestFieldSize 4096
LimitRequestFields 100

5. 部署 mod_security 规则层防护

# Debian/Ubuntu 安装
apt-get install -y libapache2-mod-security2
a2enmod security2
systemctl restart apache2
# 启用 OWASP CRS 核心规则集
apt-get install -y modsecurity-crs
cp /etc/modsecurity/crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf
echo 'Include /etc/modsecurity/crs/crs-setup.conf' >> /etc/apache2/mods-enabled/security2.conf
echo 'Include /etc/modsecurity/crs/rules/*.conf' >> /etc/apache2/mods-enabled/security2.conf
systemctl restart apache2

生产环境建议先以 DetectionOnly(仅记录不拦截) 模式运行 24-48 小时,观察误报后再切换 SecRuleEngine On

6. TLS 最小配置(如启用 HTTPS)

# 仅启用 TLS 1.2/1.3,禁用弱协议与弱加密套件
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
# 关闭不安全的 SSL 会话复用与压缩
SSLCompression off
SSLSessionTickets off

配置验证

# 1. 语法检查并平滑重载
apachectl -t && systemctl reload apache2
# 2. 验证版本号已隐藏
curl -sI http://your-server/ | grep -i server
# 期望输出: Server: Apache(无版本号)
# 3. 验证目录浏览已关闭
curl -s http://your-server/uploads/ | grep -i "index of"
# 期望无 "Index of" 输出,返回 403 或默认页
# 4. 验证危险方法被拒绝
curl -s -o /dev/null -w "%{http_code}
" -X PUT http://your-server/test.txt  # 403
curl -s -o /dev/null -w "%{http_code}
" -X TRACE http://your-server/       # 405/403
# 5. 验证 mod_security 生效(注入测试,仅在测试环境)
curl -s -o /dev/null -w "%{http_code}
" "http://your-server/?id=1%27%20OR%20%271%27%3D%271"  # 403

常见问题(FAQ)

Q1:关闭 Indexes 后某些业务目录无法访问了?

目录浏览本身不应作为业务依赖。若个别目录确实需要列目录(如公共下载站),可在该目录单独开启:<Directory /var/www/html/download> Options +Indexes </Directory>,但务必确认目录内无敏感文件,并配合 Require 限定访问来源。

Q2:mod_security 误拦截正常请求怎么办?

先确认处于 DetectionOnly 模式并检查 /var/log/apache2/modsec_audit.log,定位被拦截的规则 ID;对确认为误报的规则,在 modsecurity.conf 中用 SecRuleRemoveById 排除,或对指定 URI 使用 SecRuleUpdateActionById 降级为记录。

Q3:如何发现已存在的 Apache 恶意配置或后门?

检查 apachectl -M 加载的模块列表是否有异常模块;用 grep -r "LoadModule" /etc/httpd/conf* /etc/apache2/ 审查模块来源;同时检查 httpd.conf 末尾是否被追加了可疑 <Location>RewriteRule 指令(常见后门写法)。

总结

Apache 安全加固遵循「隐藏指纹、收敛目录、精简模块、白名单方法、规则兜底」五步法:隐藏版本号切断指纹利用、-Indexes 关闭目录浏览、禁用 autoindex/status/info 模块缩小攻击面、LimitExcept 白名单化 HTTP 方法,再用 mod_security + OWASP CRS 提供规则层纵深防御。完成以上配置并验证通过后,Apache 的主要攻击面即已收敛。建议将本清单固化为服务器初始化脚本,新机器上线时自动执行。