原创

nginx隐藏版本号信息

我们平常使用nginx作为代理服务器的时候,在返回请求内容的时候,一般都会带着nginx的版本号,比如请求不存在的路径返回的404错误页面:

这里我们可以直接看到服务器使用的代理软件与版本号,会造成信息泄露。为了提高服务器的安全性,减少攻击面,一般情况下我们会要求隐藏这些信息。

下面记录一下隐藏版本号的操作过程,供参考。

1.修改配置隐藏nginx版本号信息

在配置文件http块中加入下面参数配置:

server_tokens off;

重载nginx配置文件:

nginx -s reload

访问一下测试页面:

可以看到版本号已经没有了,但是还会返回使用的server是nginx,下面我们需要把这个信息也隐藏掉。

2.修改源码隐藏响应头server信息

隐藏服务信息就需要修改源码了,我们先去下载一个源码包,nginx源码下载地址:https://nginx.org/en/download.html

这里我们选择nginx-1.26.3.tar.gz版本下载使用,下载完成后解压到服务器:

修改src/http/ngx_http_header_filter_module.c源码文件:

vi src/http/ngx_http_header_filter_module.c

找到需要修改的内容所在行:

static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;

可以将其返回修改为空或者其他自定义的值,这里我们修改为unknow:

static u_char ngx_http_server_string[] = "Server: unkonw" CRLF;
static u_char ngx_http_server_full_string[] = "Server: unkonw" NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: unkonw" NGINX_VER_BUILD CRLF;

保存后开始编译nginx:

cd /nginx-1.26.3/
./configure --prefix=/usr/sbin/nginx 
make

如果编译报错依赖问题,根据提示安装一下编译需要依赖的包:

yum install libxml2-devel libxslt-devel gd-devel perl-devel perl-ExtUtils-Embed perl-devel gperftools-devel

编译完成后部署重新启动(编译部署步骤可以参考:生产环境nginx版本升级),再访问测试页面:

我们发现虽然响应头的server内容已经变成我们设置的unkonw了,但是404页面还是会返回nginx内容,接下来我们将这里也修改一下。

3.修改404错误页面模板

nginx源码中错误页面模板在src/http/ngx_http_special_response.c文件中,编辑该文件:

vi src/http/ngx_http_special_response.c

找到u_char ngx_http_error_tail:

static u_char ngx_http_error_tail[] =
"<hr/><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

将其中的nginx字样修改:

static u_char ngx_http_error_tail[] =
"<hr/><center>unknow</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

重新编译部署后,再打开测试页面:

可以看到响应消息中已经全部变成了unknow。


扩展说明

1.编译之后记得通过nginx -t -c /etc/nginx/nginx.conf命令测试一下配置文件是否兼容,本次从1.20.1升级到1.26.3后,http2相关配置就发生了变化。

正文到此结束
本文目录