隐藏 Nginx 标识和版本号:从源码下手

提升线上环境安全性,常见做法之一是隐藏 Nginx 版本号,减少攻击者信息收集。用 server_tokens off 能藏掉版本,但响应头里仍会暴露”这是 Nginx”。要彻底一点,得改源码重新编译。

下载源码

[root@Web01 ~]# cd /opt/soft/
[root@Web01 soft]# wget http://nginx.org/download/nginx-1.16.1.tar.gz

解压到当前目录:

[root@Web01 soft]# tar -zxvf nginx-1.16.1.tar.gz

修改源文件

先改源码再编译安装。三个文件都在 src 下面,第一个是版本定义头文件,把版本号相关的宏改掉:

[root@Web01 soft]# cd nginx-1.16.1/
[root@Web01 nginx-1.16.1]# cd src/core/
[root@Web01 core]# vim nginx.h
image-613

第二个是响应头生成模块,改掉 Server 头里拼进去的标识字符串:

[root@Web01 core]# cd ..
[root@Web01 src]# cd http/
[root@Web01 http]# vim ngx_http_header_filter_module.c
image-614

第三个是错误页,默认 50x 之类的错误页脚注里也带着 Nginx 标识:

[root@Web01 http]# vim ngx_http_special_response.c
image-615

改完可以把整个解压目录拷贝一份留档,以后新环境直接用它编译,不用再改一遍。

编译安装

[root@Web01 ~]# yum -y install gcc gcc-c++ make
[root@Web01 ~]# cd /opt/soft/nginx-1.16.1/
[root@Web01 nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/nginx.pid --lock-path=/usr/local/nginx/nginx.lock --user=appadmin --group=appadmin --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
image-616
[root@Web01 nginx-1.16.1]# make && make install

启动与验证

[root@Web01 ~]# cd /usr/local/nginx/sbin/
[root@Web01 sbin]# ./nginx
[root@Web01 sbin]# ps -C nginx --header
   PID TTY          TIME CMD
 10349 ?        00:00:00 nginx
 10350 ?        00:00:00 nginx

[root@Web01 sbin]# ss -tnlp|grep 80

防火墙关闭或放通 80 端口:

[root@Web01 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@Web01 ~]# firewall-cmd --reload
success

用 curl 看响应头:

[root@Web01 ~]# curl -I 127.0.0.1
image-617

再通过 web 界面访问,点开 NETWORK(网络)面板检查请求信息:

图片[6]-隐藏 Nginx 标识和版本号:从源码下手-星海夜航

Server 头里既没有版本号也不再出现 Nginx 字样,就算改到位了。用 CDN 的话,源站改完记得回源测试,别只看 CDN 节点返回的头。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容