隐藏 Web 服务的版本信息

1. TL;DR

1
2
3
4
5
6
7
8
9
10
11
# Nginx
sudo sed -i '/http {/a server_tokens off;' /etc/nginx/nginx.conf
sudo nginx -s reload

# Apache
sudo sed -i '$a ServerTokens Prod' /etc/apache2/apache2.conf
sudo apache2ctl -k restart

# PHP
sudo sed -i 's/expose_php = On/expose_php = Off/' $(php --ini | grep Loaded | awk '{print $4}')
systemctl restart phpx.x-fpm.service

2. Nginx

默认情况下,Nginx 在处理 http 请求的时候会返回 server 字段,并且在404等错误页面中,会直接显示该字段的值。
server 字段通常包含了服务器软件的信息,如服务器软件的名称和版本号:

alt text

暴露 Nginx 版本信息会使得攻击者能利用已知的漏洞和安全问题来针对特定的软件版本进行攻击。(有关 Nginx 的漏洞披露,戳这里:https://nginx.org/en/security_advisories.html)

因此最好通过配置来隐藏版本信息,方法很简单,只需编辑 /etc/nginx/nginx.conf 文件,在 http 块中加上 server_tokens off; 字段,保存后执行 sudo nginx -s reload 重启 Nginx 即可。效果如下:

alt text

关于 server_tokens off; 的官方解释,戳这里:https://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens

3. Apache

阿帕奇服务器也是一样的道理,配置方式如下:

1
2
echo "ServerTokens Prod" | sudo tee -a /etc/apache2/apache2.conf
sudo apache2ctl -k restart

配置前:

alt text

配置后:

alt text

关于 ServerTokens Prod 字段的官方解释,戳这里:https://httpd.apache.org/docs/2.4/mod/core.html#servertokens

注意:
如果配置不生效,尝试将配置文件改为 /etc/httpd/conf/httpd.conf
如果重启apache2服务失败,并且报AH00558警告,执行 echo ServerName localhost >> /etc/apache2/apache2.conf 再次重启即可。

4. PHP

php 的 expose_php 配置项默认会使得 php 在 X-Powered-By 头中显示 php 的版本号。

关闭方式为:执行 php --ini | grep Loaded | awk '{print $4}' 命令查看 php.ini 文件所在路径,然后编辑它,搜索 expose_php = On,将其改为 off 并保存。

接着执行 systemctl restart phpx.x-fpm.service 重启 php-fpm 即可(将x.x替换为你的实际版本)。

expose_php 配置项的官方解释,戳这里:https://www.php.net/manual/zh/ini.core.php#ini.expose-php

参考:

https://segmentfault.com/q/1010000002224561