nginx基本安全优化

nginx基本安全优化

一、调整参数隐藏Nginx软件版本号信息

说明:软件的漏洞和版本有关,这一点很像汽车的缺陷,同一批次的产品要有问题就都有问题,别的批次可能就都是好的。因此,我们应尽量隐藏或消除Web服务对访问用户显示各类敏感信息(例如Web软件名称及版本号等信息)。

二、使用步骤

1.了解所使用软件的版本号

代码如下(示例):

[/data/aideploy]curl -I 10.67.10.198:32001
HTTP/1.1 403 Forbidden
Server: nginx/1.6.3   #<==这里很清晰地暴露了Web版本号(1.6.3)及软件名称(Nginx)
Date: Thu, 27 Oct 2022 00:56:14 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive

2.配置文件加参数来隐藏Nginx版本号

在Nginx配置文件nginx.conf中的http标签段内加入“server_tokens off;”参数,具体如下:
代码如下(示例):

http
{ .. 
server_tokens  off;    
..}

此参数放置在http标签内,作用是控制http response header内的Web服务版本信息的显示,以及错误信息中Web服务版本信息的显示。
server_tokens参数的官方说明如下:

http
syntax:  server_tokens on | off; #?<==此行为参数语法,on为开启状态,off为关闭状态
default:        server_tokens on;       #?<==此行的意思是不配置该参数,软件默认
情况的结果context:        http, server, location  #?<==此行为server_tokens参数可以放置的位置参数作用:激活或禁止Nginx的版本信息显示在报错信息和Server的响应首部位置中
Enables or disables emitting of nginx version in error messages and in the "Server" responseheader field.                #?<==此行是参数的作用原文,一定要细

官方资料地址:http://nginx.org/en/docs/http/ngx_http_core_module.html。

2.更改源码隐藏Nginx软件名及版本号

隐藏了Nginx版本号后,更进一步,可以通过一些手段把Web服务软件的名称也隐藏起来,或者更改为其他Web服务软件名以迷惑黑客。

依次修改3个Nginx源码文件。

修改的第一个文件为nginx-1.6.3/src/core/nginx.h,代码如下:

http
[root@oldboy core]# sed -n '13,17p' nginx.h 
#define NGINX_VERSION      "1.6.3"      #<==修改为想要显示的版本号,如2.2.23
#define NGINX_VER          "nginx/" NGINX_VERSION                                            
                                  #<==将Nginx修改为想要修改的软件名称,如OWS
#define NGINX_VAR          "NGINX"      
#<==将Nginx修改为想要修改的软件名称,                                            
如OWS(Oldboy Web Server)
#define NGX_OLDPID_EXT     ".oldbin

在这里插入图片描述
修改的第二个文件是nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行,需要修改的字符串如下:

root@oldboy http]# grep -n 'Server: nginx'  ngx_http_header_filter_module.c
49:static char ngx_http_server_string[] = "Server: nginx " CRLF; #<==修改本行结尾的Nginx

在这里插入图片描述
修改的第三个文件是nginx-1.6.3/src/http/ngx_http_special_response.c,对外页面报错时,它会控制是否展示敏感信息。这里输出修改前的信息ngx_http_special_response.c中的第21~30行,代码如下:
在这里插入图片描述
在这里插入图片描述

修改后编译软件,使其生效

[root@oldboy http]# curl -I bbs.etiantian.org/oldboy/
HTTP/1.1 404 Not FoundServer: OWS/2.2.23                      #<==也更改了
Date: Thu, 12 Feb 2015 07:00:52 
GMTContent-Type: text/html
Content-Length: 198
Connection: keep-alive

更改Nginx服务的默认用户

cat nginx.conf|grep '#user'
#user  nobody;

为了防止黑客猜到这个Web服务的用户,我们需要将其更改成特殊的用户名,例如nginx或特殊点的inca,但是这个用户必须是系统里事先存在的,下面以nginx用户为例进行说明。

(1)为Nginx服务建立新用户。为Nginx服务建立新用户的操作过程如下:
useradd nginx -s /sbin/nologin -M
#<==不需要有系统登录权限,应当禁止其登录能力,相当于Apache里的用户
id nginx #<==检查用户
(2)配置Nginx服务,让其使用刚建立的nginx用户。
更改Nginx服务默认使用的用户,方法有两种:
第一种为直接更改配置文件参数,将默认的“#user nobody;”改为如下内容:

user  nginx nginx;

第二种方法为在编译Nginx软件时直接指定编译的用户和组,命令如下:

./configure  --user=nginx --group=nginx --prefix=/application/nginx1.6.3 --with-http_stub_status_module  --with-http_ssl_modul
提示:前文在编译Nginx服务时,就是这样带着参数的,因此无论配置文件中是否添加参数,默认都是nginx用户。

(3)检查更改用户的效果。
重新加载配置后,检查Nginx服务进程的对应用户。
通过查看上述更改后的Nginx进程,可以看到worker processes对应的用户都变成了nginx。

总结

·提升网站安全,要从最简单、最短板、最低点的地方入手解决问题,如果门打开着,即使给窗户安装再结实的护栏也没有意义。
·向有经验的人及优秀的网站公司学习。
·学会看官方文档,根据第一手资料去分析。
·命令输出结果中含有需要过滤或要保留的内容时,命令自身可能有参数可直接实现。