这两天接到个需求,就是去除http响应中的Server头信息,说是容易被黑客利用进行有针对的攻击,这个理由很充分,还是要安排上。

 

我们的http是nginx做的反向代理,于是需求就变成了  Nginx去除 HTTP Server头

查找了一番,大部分都是隐藏nginx版本

server_tokens off;

配置类似于:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
 
http {
    keepalive_timeout   65;
    types_hash_max_size 2048;
    server_tokens off;
    server {
        ... ...
 
    }
}

但是返回给客户端的信息,还是存在Nginx服务器类型信息(虽然没有透露版本了):

 

 

这个不能解决根本问题,因为黑客可以对nginx进行猜测,如果被猜中版本,还是很容易被攻击,想看看有没有彻底去掉server头的办法,结果还真找到了

后来经过详细了解,这个步骤要重新编译nginx,在编译时加入所需的模块来实现去除server头功能,和升级步骤大差不差,那就干脆顺便升级下nginx吧

这么一综合,需求就变成了nginx升级并去除http响应中的Server头信息

升级中也踩了不少坑,特地记录下,以备日后查看

首先介绍下模块:

组件:headers-more-nginx-module

GitHub: https://github.com/openresty/headers-more-nginx-module

 

下面是操作步骤:

1.下载headers-more-nginx-module包和nginx最新稳定版压缩包,并解压

https://github.com/openresty/headers-more-nginx-module/archive/refs/tags/v0.34.tar.gz

http://nginx.org/download/nginx-1.24.0.tar.gz

# 举例目录/app/tools
cd /app/tools/
#下载插件
wget https://github.com/openresty/headers-more-nginx-module/archive/v0.34.tar.gz
#解压
tar -zxvf v0.34.tar.gz

 

 2. 加载模块并编译

(1)查看原nginx安装参数命令

# 查看安装参数命令(取出:configure arguments:)
/app/nginx/sbin/nginx -V

 configure arguments后面的即为原nginx包编译参数

(2)编译

# 在最新版nginx目录编译
cd /app/nginx-1.24.0/
# 将上面取出的configure arguments 前面加上./configure,后面追加 --add-module=/app/tools/headers-more-nginx-module-0.33 
.
/configure 编译参数 --add-module=/app/tools/headers-more-nginx-module-0.33

 ./configure那步就报了很多错,大部分都是缺少依赖包之类的,只需要按报错提示逐一安装即可

例如:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

#安装依赖包
yum -y install openssl openssl-devel

 

 ./configure没有报错之后,执行make进行编译

切记千万不要输入 make install

切记千万不要输入 make install

切记千万不要输入 make install

 

# 编译,切记没有make install 
make

编译完成,最新版本nginx的目录下会多出来一个objs目录,里面是新的 Nginx二进制文件,make install 的作用就是将二进制文件拷贝到指定的目录。

 

 (3)替换升级的nginx包

 


#关闭老nginx
/app/nginx112/sbin/nginx -s stop
# 备份
cp /app/nginx112/sbin/nginx /app/nginx112/sbin/nginx.bak 
# 覆盖(覆盖提示输入y)
cp -f /app/nginx-1.24.0/objs/nginx /app/nginx112/sbin/nginx
#启动
./app/nginx112/sbin/nginx
#或者执行检查
/app/nginx112/sbin/nginx -t

这里我报了三个错

报错1:

[root@vm111 sbin]# ./nginx
nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so" version 1020001 instead of 1020002 in /usr/share/nginx/modules/mod-http-image-filter.conf:1

原因:这个报错是/usr/lib64/nginx/modules/ 内的组件包不兼容

解决办法:拷贝新nginx objs目录中的新组件即可

#备份原组件包
cp -r /usr/lib64/nginx/modules/ /usr/lib64/nginx/modules_12.0.1
#复制新组件包至目录
cp /app/nginx/nginx-1.24.0/objs/*.so
/usr/lib64/nginx/modules/ -y

再次启动nginx,报错2:

[root@vm111 sbin]# ./nginx
nginx: [alert] version 1.24.0 of nginx.pm is required, but 1.20.1 was found

原因:/usr/local/lib64/perl5/auto/nginx/目录下nginx.so和nginx.bs文件没有替换

解决办法:替换成编译目录里objs/src/http/modules/perl/blib/arch/auto/nginx/下的同名文件

nginx.so, nginx.bs具体目录可由以下命令查找:

find  /  -type  f  -name nginx.so

find  /  -type  f  -name nginx.bs

[root@vm111 ~]# find  /  -type  f  -name nginx.so
/usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so
/app/nginx/nginx-1.24.0/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so


#备份原文件
mv /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so.12.0.1
#替换新文件
cp /app/nginx/nginx-1.24.0/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so

另一个文件同理

再次启动nginx,报错3:

[root@vm111 sbin]# ./nginx
nginx object version 1.24.0 does not match bootstrap parameter 1.20.1 at /usr/share/perl5/XSLoader.pm line 92.
Compilation failed in require.
BEGIN failed--compilation aborted.
nginx: [alert] perl_parse() failed: 2

 

原因:nginx.pm包不匹配

解决方法:替换成编译目录里objs/ 下的同名文件

[root@vm111 ~]# find  /  -type  f  -name nginx.pm
/usr/lib64/perl5/vendor_perl/nginx.pm
/app/nginx/nginx-1.24.0/src/http/modules/perl/nginx.pm
/app/nginx/nginx-1.24.0/objs/src/http/modules/perl/nginx.pm
/app/nginx/nginx-1.24.0/objs/src/http/modules/perl/blib/lib/nginx.pm
#备份原文件
mv /usr/lib64/perl5/vendor_perl/nginx.pm /usr/lib64/perl5/vendor_perl/nginx.pm.bak
#替换新文件
cp /app/nginx/nginx-1.24.0/objs/src/http/modules/perl/nginx.pm /usr/lib64/perl5/vendor_perl/nginx.pm

再次启动nginx,无报错

 

nginx启动报错的其他问题可以参考

参考文档:https://blog.csdn.net/weixin_45603969/article/details/129128528

#nginx -t可能会遇到的问题
(1)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-image-filter.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_image_filter_module.so /usr/lib64/nginx/modules/ngx_http_image_filter_module.so.old
cp ngx_http_image_filter_module.so /usr/lib64/nginx/modules/2)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_perl_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-perl.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_perl_module.so /usr/lib64/nginx/modules/ngx_http_perl_module.so.old
cp ngx_http_perl_module.so /usr/lib64/nginx/modules/3)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-xslt-filter.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so.old
cp ngx_http_xslt_filter_module.so /usr/lib64/nginx/modules/4)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_mail_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-mail.conf:1
解决办法:
mv /usr/lib64/nginx/modules/ngx_mail_module.so /usr/lib64/nginx/modules/ngx_mail_module.so.old
cp ngx_mail_module.so /usr/lib64/nginx/modules/5)nginx: [emerg] dlopen() "/usr/lib64/nginx/modules/ngx_stream_module.so" failed (/usr/lib64/nginx/modules/ngx_stream_module.so: undefined symbol: pcre_exec) in /usr/share/nginx/modules/mod-stream.conf:1
解决办法:
mv /usr/lib64/nginx/modules/ngx_stream_module.so /usr/lib64/nginx/modules/ngx_stream_module.so.old
cp ngx_stream_module.so /usr/lib64/nginx/modules/6)nginx: [alert] version 1.22.1 of nginx.pm is required, but 1.16.1 was found
解决办法:
mv /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so.old
cp /www/nginx-1.22.1/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/7)nginx object version 1.22.1 does not match bootstrap parameter 1.16.1 at /usr/share/perl5/XSLoader.pm line 111.
Compilation failed in require.
BEGIN failed--compilation aborted.
nginx: [alert] perl_parse() failed: 2
nginx: configuration file /etc/nginx/nginx.conf test failed
解决办法:
mv /usr/lib64/perl5/vendor_perl/nginx.pm /usr/lib64/perl5/vendor_perl/nginx.pm.old
cp /www/nginx-1.22.1/objs/src/http/modules/perl/nginx.pm /usr/lib64/perl5/vendor_perl/

 

 

 

3.make upgrade 命令升级

 在新nginx编译目录下执行下面的命令来升级nginx

make upgrade

PS: 不用make upgrade 命令升级可以采用服务信号升级 ,服务信号升级方案不做阐述。原理基本与upgrade方案一致,可以查看执行make upgrade 命令的标准输出中,也是通过执行以下服务信号命令进行的相关升级操作。

其实可以查看新nginx目录下的Makefile,就一目了然了

 

default:        build

clean:
        rm -rf Makefile objs

.PHONY: default clean

build:
        $(MAKE) -f objs/Makefile

install:
        $(MAKE) -f objs/Makefile install

modules:
        $(MAKE) -f objs/Makefile modules

upgrade:
        /usr/sbin/nginx -t

        kill -USR2 `cat /run/nginx.pid`
        sleep 1
        test -f /run/nginx.pid.oldbin

        kill -QUIT `cat /run/nginx.pid.oldbin`

.PHONY: build install modules upgrade

upgrade步骤就是服务信号升级

 

4.修改nginx配置文件使插件生效

vim /app/nginx112/conf/nginx.conf
# 添加配置(在http模块)
more_clear_headers 'Server';

上面配置只是将http响应头中的Server:nginx/1.24.0清除,详细使用方案可阅读 参考文档,
支持添加·修改·清除响应头的操作,

#重启nginx
/app/nginx112/sbin/nginx -s stop /app/nginx112/sbin/nginx

直接使用reload可能会无效

 

 

5.检查升级结果

经过检查nginx版本已经是最新版,http响应头中已无server信息

 

 

 

参考文档:

https://blog.csdn.net/zzhongcy/article/details/115538272

https://blog.csdn.net/lw0328/article/details/127672692

http://dev.army16.com/nginx/nginx-upgrade

https://blog.csdn.net/boyheroes/article/details/107909497

https://blog.csdn.net/weixin_45603969/article/details/129128528

https://blog.csdn.net/weixin_45729432/article/details/129493752

https://blog.csdn.net/weixin_44412085/article/details/127819247

https://blog.csdn.net/weixin_50647100/article/details/126399832

https://blog.csdn.net/weixin_48503606/article/details/127750684

 

另外还有一个方式可以在代码里屏蔽http请求头信息的方法,可以参考

https://www.656463.com/wenda/cxybtzscfwqMicrosoftIIS85bt_185

posted on 2023-06-16 18:35  06  阅读(8868)  评论(0编辑  收藏  举报