如何配置 Apache 隐藏版本号防止信息泄露安全加固

文章导读
在 Apache 主配置文件 httpd.conf 或 apache2.conf 中设置 ServerTokens Prod 和 ServerSignature Off,并配合 mod_headers 模块移除 Server 响应头,能有效隐藏版本号。适用所有对外服务的 Apache 环境,但需注意隐藏信息不能修复漏洞,仅降低被扫描识别的风险。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Apache 主配置文件 httpd.conf 或 apache2.conf 中设置 ServerTokens Prod 和 ServerSignature Off,并配合 mod_headers 模块移除 Server 响应头,能有效隐藏版本号。适用所有对外服务的 Apache 环境,但需注意隐藏信息不能修复漏洞,仅降低被扫描识别的风险。

先说结论:隐藏 Apache 版本号是安全加固的基础步骤,需全局配置并结合响应头修改才能生效。

  • 先判断:确认 Apache 版本及配置文件路径,区分 Debian/Ubuntu 与 RHEL/CentOS 系统差异。
  • 优先做:全局设置 ServerTokens Prod 和 ServerSignature Off,启用 mod_headers 移除 Server 头。
  • 再验证:使用 curl 命令检查 HTTP 响应头,确认无版本信息且错误页面不泄露标识。

命令速用版

以下命令适用于大多数 Linux 发行版,请根据实际路径调整配置文件位置。

\# 编辑主配置文件
sudo vi /etc/httpd/conf/httpd.conf  \# RHEL/CentOS
sudo vi /etc/apache2/apache2.conf   \# Debian/Ubuntu

\# 添加或修改以下配置项
ServerTokens Prod
ServerSignature Off

\# 启用 headers 模块并移除 Server 头
sudo a2enmod headers                \# Debian/Ubuntu
\# 在配置文件中添加:
<IfModule mod_headers.c>
    Header unset Server
</IfModule>

\# 检查配置语法并重启
sudo apachectl configtest
sudo systemctl restart httpd        \# RHEL/CentOS
sudo systemctl restart apache2      \# Debian/Ubuntu

为什么会这样

默认配置会暴露服务器软件名称、版本号和操作系统信息,攻击者可利用这些信息匹配已知漏洞。

Apache 默认会在 HTTP 响应头(Server Banner)和错误页面底部返回详细标识,例如 Server: Apache/2.4.52 (Ubuntu)。自动化扫描工具如 nmap 或 whatweb 能据此确认服务类型和版本,从而缩小攻击面。隐藏这些信息增加了攻击者探测的难度,属于安全防御中的“减少信息泄露”策略。

分步处理

按顺序执行以下操作,确保配置全局生效且无语法错误。

步骤 1:修改主配置文件
编辑 httpd.conf 或 apache2.conf,找到或添加以下指令。注意 ServerTokens 和 ServerSignature 只能在全局作用域生效,不能在<VirtualHost>块中覆盖。

ServerTokens Prod
ServerSignature Off

步骤 2:彻底移除 Server 响应头
仅设置 Prod 仍会返回 Server: Apache。需启用 mod_headers 模块并清除该头。

如何配置 Apache 隐藏版本号防止信息泄露安全加固
\# 确认模块加载
LoadModule headers_module modules/mod_headers.so

\# 添加清除指令
<IfModule mod_headers.c>
    Header unset Server
</IfModule>

步骤 3:关闭 PHP 版本泄露
检查 php.ini 文件,设置 expose_php = Off,防止返回 X-Powered-By: PHP/x.x 头。

步骤 4:重启服务
修改后必须重启 Apache 服务使配置生效,重启前建议运行 configtest 检查语法。

怎么验证是否生效

配置完成后,使用 curl 命令检查三类请求的响应头,确保无版本信息泄露。

检查正常页面:

curl -I http://your-domain.com

确认响应头中不包含 Server: 行,或仅显示 Server: Apache 而无版本号。

检查错误页面:

如何配置 Apache 隐藏版本号防止信息泄露安全加固
curl -I http://your-domain.com/nonexistent

确认 404 页面 HTML 源码底部没有服务器签名文字。

检查 HTTPS 请求:

curl -I https://your-domain.com

SSL 虚拟主机需单独确认配置已同步应用,防止 HTTPS 请求仍暴露信息。

常见坑

以下场景容易导致配置无效或信息再次泄露,操作时需谨慎。

  • 虚拟主机配置无效:ServerTokens 指令不支持在<VirtualHost>块内设置,必须在主配置文件全局设置。
  • 反向代理覆盖:若前端有 Nginx、CDN 或 WAF,它们可能重新注入 Server 头,需在代理层同步清除。
  • 旧版本兼容性:Apache 版本低于 2.4.29 时,Header unset 可能不生效,可改用 Header set Server ""。
  • 自定义错误页:若配置了 ErrorDocument 指向自定义 HTML 文件,需检查该文件内是否手动写入了版本信息。

常见问题

可以在虚拟主机配置里单独隐藏版本号吗?

不可以,ServerTokens 和 ServerSignature 指令只能在全局主配置文件中设置,虚拟主机块内设置无效。

隐藏版本号能防止服务器被攻击吗?

不能,这仅减少信息泄露,增加攻击者探测难度,不能修复实际漏洞,仍需及时更新补丁。

PHP 产生的版本信息怎么隐藏?

需在 php.ini 中设置 expose_php = Off,否则 Apache 配置无法拦截 PHP 添加的 X-Powered-By 头。

参考来源

  • 实战指南:Apache 基础配置安全加固
  • 怎么在 Apache 中隐藏 ServerTokens 版本号减少服务器被扫描风险实战
  • 怎么在 Apache 虚拟主机中配置 ServerTokens 隐藏版本号以减少站点暴露面
  • Apache 服务器安全加固:15 个最佳实践与实战配置指南
  • 应急加固 (apache 中间件)