nginx基本安全优化
说明:软件的漏洞和版本有关,这一点很像汽车的缺陷,同一批次的产品要有问题就都有问题,别的批次可能就都是好的。因此,我们应尽量隐藏或消除Web服务对访问用户显示各类敏感信息(例如Web软件名称及版本号等信息)。
代码如下(示例):
[/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
在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。
隐藏了Nginx版本号后,更进一步,可以通过一些手段把Web服务软件的名称也隐藏起来,或者更改为其他Web服务软件名以迷惑黑客。
修改的第一个文件为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
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。
·提升网站安全,要从最简单、最短板、最低点的地方入手解决问题,如果门打开着,即使给窗户安装再结实的护栏也没有意义。
·向有经验的人及优秀的网站公司学习。
·学会看官方文档,根据第一手资料去分析。
·命令输出结果中含有需要过滤或要保留的内容时,命令自身可能有参数可直接实现。