一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或消除Web服务对访问用户显示各类敏感信息(例如Web软件名称及版本号等信息),从而加强Web服务的安全性。

默认情况下客户端对Nginx版本查看

  对于Linux客户端,我们可以通过命令行查看Nginx版本号,如下:

curl -I 192.168.2.220

	HTTP/1.1 200 OK
	Server: nginx/1.9.12
	Date: Thu, 19 May 2016 03:09:52 GMT
	Content-Type: text/html
	Connection: keep-alive
	X-Powered-By: PHP/5.3.28

  在Windows客户端上,通过浏览器访问Web服务时,若不存在页面,Nginx默认报错信息如下:

以上虽然客户端不同,但是都获得了Nginx软件名称,而且查到了Nginx的版本号,这使得Web服务的安全存在一定的风险,应该隐藏掉或者用一个其他的名字替代。

编辑nginx.conf,隐藏Nginx版本号

  在Nginx的主配置文件nginx.conf中的http标签段内加入server_tokens off;参数。

http
{
	server_tokens off;
}

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

syntax: server_tokens on | off; 此行为参数语法,on为开启,off为关闭
context: http,server,location; 此行表示server_tokens参数可以放置的位置
参数作用:激活或禁用Nginx的版本信息显示在报错信息和Server的响应首部位置

此时再使用Curl命令访问效果如下

curl -I 192.168.2.220
	HTTP/1.1 200 OK
	Server: nginx
	Date: Thu, 19 May 2016 03:24:24 GMT
	Content-Type: text/html
	Connection: keep-alive
	X-Powered-By: PHP/5.3.28

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

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

依次修改3个nginx源码文件

  1. /Path/nginx-1.9.12/src/core/nginx.h
    修改前

    sed -n '13,22p' nginx.h
    #define NGINX_VERSION      "1.9.12" # 修改为我们自定义的版本
    #define NGINX_VER          "nginx/" NGINX_VERSION # 将nginx修改为我们想显示的软件名
    
    #ifdef NGX_BUILD
    #define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"
    #define NGINX_VER_BUILD    NGINX_VER
    #endif
    
    #define NGINX_VAR          "NGINX" # 将nginx修改为我们想显示的软件名
    

    修改后

    sed -n '13,22p' nginx.h
    #define NGINX_VERSION      "3.1.2" # 已修改为我们自定义的版本
    #define NGINX_VER          "Apache/" NGINX_VERSION # 已修改为我们自定义的软件名
    
    #ifdef NGX_BUILD
    #define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"
    #else
    #define NGINX_VER_BUILD    NGINX_VER
    #endif
    
    #define NGINX_VAR          "APACHE" # 已修改为我们自定义的软件名
    
  2. /Path/nginx-1.9.12/src/http/ngx_http_header_filter_module.c

    grep -n 'Server: nginx' ngx_http_header_filter_module.c 
    49:static char ngx_http_server_string[] = "Server: nginx" CRLF; # 修改末尾的nginx
    

    具体命令如下:

    sed -i 's/"Server: nginx"/"Server: Apache"/g' ngx_http_header_filter_module.c
    grep -n 'Server: ' ngx_http_header_filter_module.c
    
  3. /Path/nginx-1.9.12/src/http/ngx_http_special_response.c
    对外报错时名,它会控制是否展示敏感信息,我们看看:

    sed -n '21,30p' ngx_http_special_response.c
    static u_char ngx_http_error_full_tail[] =
    "<hr><center>" NGINX_VER "</center>" CRLF
    "</body>" CRLF
    "</html>" CRLF
    ;
    static u_char ngx_http_error_tail[] =
    "<hr><center>nginx</center>" CRLF
    "</body>" CRLF
    

    具体命令如下:

    sed -i 's/<hr><center>" NGINX_VER "<\/center>/<hr><center>" NGINX_VER "(http:\/\/www.webfsd.com) <\/center>/g' ngx_http_special_response.c
    sed -i 's/<hr><center>nginx<\/center>/<hr><center>Apache<\/center>/g'  ngx_http_special_response.c
    sed -n '21,30p' ngx_http_special_response.c
    

重新编译Nginx并配置启动

查看效果

curl -I 192.168.2.220
	HTTP/1.1 200 OK
	Server: Apache/3.1.2
	Date: Thu, 19 May 2016 05:28:38 GMT
	Content-Type: text/html
	Content-Length: 612
	Last-Modified: Thu, 19 May 2016 05:26:26 GMT
	Connection: keep-alive
	ETag: "573d4e82-264"
	Accept-Ranges: bytes


最后编辑: 于 3年前

标签

评论列表(0)

    暂无评论