1. Linux
  2. 随笔一记

隐藏http header中的web服务器信息

为了服务器的安全,防止黑客通过http中的响应头获取服务器的类型和版本从而进行针对性攻击。我们需要将这些信息隐藏起来。

例如:

HTTP/1.1 304 Not Modified
Server: nginx/1.20.2
Date: Fri, 11 Feb 2022 08:03:30 GMT
Last-Modified: Wed, 15 Dec 2021 06:48:49 GMT
Connection: keep-alive
ETag: "61b98fd1-e1eb7"

通过这个响应头我们可以轻松获得该服务器的类型为nginx且版本为1.20.2

下面给出当前主流的Web服务器的隐藏方式。

1、Apache

从apache2 开始相关的配置选项移动到了这个配置文件中

/etc/apache2/conf-available/security.conf

我们需要修改其中的 ServerTokens 和 ServerSignature,具体内容如下

ServerTokens Prod
ServerSignature Off

完成后重启apache2 再次查看响应头

HTTP/1.1 200 OK
Date: Fri, 11 Feb 2022 08:16:22 GMT
Server: Apache
Last-Modified: Mon, 07 Feb 2022 04:48:24 GMT
ETag: "1f9-5d7664f865e7c-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 304
Keep-Alive: timeout=5, max=97
Connection: Keep-Alive
Content-Type: text/html

仅仅是去除了版本,和操作系统,404页面的服务器相关信息也抹去了。但是apache还在,这显然不能让人满意。如果想要继续去除或是修改,我们需要修改apache源码。但是修改源码的方式是不被提倡的。

2、Nginx

nginx可以通过修改配置文件的方式来删除响应头中的server字段。

但是相关的配置模块到现在都没有加入到默认安装里面,顺便说一下现在的最新版本是: nginx-1.21.6。所以只能手动配置一下,把相关模块配置到编译选项中然后进行编译安装即可。

首先下载最新的 nginx 源码和 headers-more-nginx-module 源码。如图,我已经下载并解压

然后使用命令进入nginx-1.21.6中

bh6aol@R720:~/app$ cd nginx-1.21.6

添加模块(注意这里填写你的模块存放位置

 bh6aol@R720:~/app/nginx-1.21.6$ ./configure --prefix=/opt/nginx \
     --add-module=/home/bh6aol/app/headers-more-nginx-module-0.33

如果上面执行成功后则可以执行make命令了(这里我的机器CPU是四核四线程的,所以添加了一个-j参数来加速编译)

bh6aol@R720:~/app/nginx-1.21.6$ make -j4

编译完成后可以执行安装命令

bh6aol@R720:~/app/nginx-1.21.6$ sudo make install

通过打印的信息,发现它将nginx装到了/opt/nginx/sbin/nginx。可以通过下面的命令验证模块是否安装成功

bh6aol@R720:/opt/nginx/sbin$ ./nginx -V
nginx version: nginx/1.21.6
built by gcc 8.3.0 (Debian 8.3.0-6)
configure arguments: --prefix=/opt/nginx --add-module=/home/bh6aol/app/headers-more-nginx-module-0.33

确实可以了,然后我们修改nginx的配置文件

bh6aol@R720:/opt/nginx/conf$ sudo nano nginx.conf

在http中添加如下内容

more_clear_headers "X-Powered-By";
more_clear_headers "Server";
more_clear_headers "ETag";
more_clear_headers "Connection";
more_clear_headers "Date";
more_clear_headers "Accept-Ranges";
more_clear_headers "Last-Modified";

最后启动nginx

bh6aol@R720:/opt/nginx/sbin$ sudo ./nginx

可以看到响应头中已经没有server等信息的踪迹了。同样的nginx也可以通过修改源码的方式来达到这个效果,但是还是那句话,不建议通过修改源码的方式来操作。

该模块也可以将server修改为任意的字符串,比如我们可以这样配置:

more_clear_headers "Server";

替换为

more_set_headers "Server: Apache/2.0.52 (Red Hat)";

然后别忘记reload

bh6aol@R720:/opt/nginx/sbin$ sudo ./nginx -s reload

再次查看浏览器的响应头信息如下:

哈哈这样nginx就变成了apache了。这种隐藏或修改响应头Server的方式确实可以在一点程度上迷惑对方。当然,检查你所使用的软件的漏洞报告并及时修复才是王道!

参考

  • https://www.nginx.com/resources/wiki/modules/headers_more/