在 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 模块并清除该头。
\# 确认模块加载
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 而无版本号。
检查错误页面:
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 中间件)