nginx性能优化
nginx安全优化
1.1 调整参数隐藏Nginx软件版本号信息
[root@localhost html]# curl -I 192.168.100.114
HTTP/1.1 200 OK
Server: nginx/1.10.2 #这里清晰的暴露了Web版本号(1.10.2)及软件名称(nginx)
Date: Mon, 21 Jan 2019 10:30:10 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Mon, 21 Jan 2019 10:20:25 GMT
Connection: keep-alive
ETag: "5c459ce9-4"
Accept-Ranges: bytes
在Windows客户端上,通过浏览器访问Web服务时,若找不到页面,默认报错的信息如下图所示:
以上虽然是不同的客户端,但是都获得了Nginx软件名称,而且查到了Nginx的版本号,这就使得Nginx Web服务的安全存在一定的风险,因此,应隐藏掉这些敏感信息或用一个其他的名字将其替代。例如,下面是百度搜索引擎网站Web软件的更名做法:
[root@localhost html]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Mon, 21 Jan 2019 10:32:06 GMT
Etag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18 #将Web服务软件更名为了bfe,并且版本号改为1.0.8.18(闭源软件名称和版本就无所谓了)
[root@localhost html]# curl -I baidu.com
HTTP/1.1 200 OK
Date: Mon, 21 Jan 2019 10:32:52 GMT
Server: Apache #将Web服务软件更名为了Apache,并且版本号也去掉了
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Tue, 22 Jan 2019 10:32:52 GMT
Connection: Keep-Alive
Content-Type: text/html
门户网站尚且如此,我们也学着隐藏或改掉应用服务软件名和版本号把!事实上,还可以通过配置文件加参数来隐藏Nginx版本号。编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下:
#在Nginx配置文件nginx.conf中的http标签段内加入“server_tokens off;”
[root@localhost nginx]# vim conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_tokens off;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
}
[root@localhost nginx]# /usr/local/nginx/sbin/nginx -s reload
此参数放置在http标签内,作用是控制http response header内的Web服务版本信息的显示,以及错误信息中Web服务版本信息的显示。
server_tokens参数的官方说明如下:
syntax: server_tokens on|off; #此行为参数语法,on为开启状态,off为关闭状态
default: server_tokens on; #此行意思是不配置该参数,软件默认情况的结果
context: http,server,location #此行为server_tokens参数可以放置的位置参数作用:激活或禁止Nginx的版本信息显示在报错信息和Server的响应首部位置中。
官方资料地址:http://nginx.org/en/docs/http/ngx_http_core_module.html
配置完毕后保存,重新加载配置文件,再次通过curl查看,结果如下:
[root@localhost nginx]# curl -I 192.168.100.114
HTTP/1.1 200 OK
Server: nginx #版本号已经消失
Date: Mon, 21 Jan 2019 10:35:26 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Mon, 21 Jan 2019 10:20:25 GMT
Connection: keep-alive
ETag: "5c459ce9-4"
Accept-Ranges: bytes
此时,浏览器的报错提示中没有了版本号,如下图所示,修改成功。
1.2 更改源码隐藏Nginx软件名及版本号
隐藏了Nginx版本号后,更进一步,可以通过一些手段把Web服务软件的名称也隐藏起来,或者更改为其他Web服务软件名以迷惑黑客。但软件名字的隐藏修改,一般情况下不会有配置参数和入口,Nginx也不例外,这可能是由于商业及品牌展示等原因,软件提供商不希望使用者把软件名字隐藏起来。因此,此处需要更改Nginx源代码,具体的解决方法如下:
1.2.1 第一步:依次修改3个Nginx源码文件。
修改的第一个文件为nginx-1.6.3/src/core/nginx.h,如下:
[root@LNMP ~]# cd /usr/src/nginx-1.6.2/src/core/
[root@LNMP core]# ls -l nginx.h
-rw-r--r--. 1 1001 1001 351 Sep 16 2014 nginx.h
[root@LNMP core]# sed -n '13,17p' nginx.h
#define NGINX_VERSION "1.6.2" #修改为想要显示的版本号
#define NGINX_VER "nginx/" NGINX_VERSION
#将nginx修改为想要修改的软件名称。
#define NGINX_VAR "NGINX" #将nginx修改为想要修改的软件名称
#define NGX_OLDPID_EXT ".oldbin"
修改后的结果如下:
[root@LNMP core]# sed -n '13,17p' nginx.h
#define NGINX_VERSION "0.0.0.0"
#define NGINX_VER "yunjisuan/" NGINX_VERSION
#define NGINX_VAR "YUNJISUAN"
#define NGX_OLDPID_EXT ".oldbin"
修改的第二个文件是nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行,需要修改的字符串内容如下:
[root@LNMP http]# ls -l /usr/src/nginx-1.6.2/src/http/ngx_http_header_filter_module.c
-rw-r--r--. 1 1001 1001 19321 Sep 16 2014 /usr/src/nginx-1.6.2/src/http/ngx_http_header_filter_module.c
[root@LNMP http]# grep -n 'Server: nginx' ngx_http_header_filter_module.c
49:static char ngx_http_server_string[] = "Server: nginx" CRLF; #修改本行结尾的nginx
通过sed替换修改,后如下:
[root@LNMP http]# grep -n 'Server: nginx' ngx_http_header_filter_module.c
49:static char ngx_http_server_string[] = "Server: nginx" CRLF;
[root@LNMP http]# sed -i 's#Server: nginx#Server: yunjisuan#g' ngx_http_header_filter_module.c
[root@LNMP http]# grep -n 'Server: yunjisuan' ngx_http_header_filter_module.c
49:static char ngx_http_server_string[] = "Server: yunjisuan" CRLF;
修改的第三个文件是nginx-1.6.3/src/http/nginx_http_special_response.c,对面页面报错时,它会控制是否展开敏感信息。这里输出修改前的信息ngx_http_special_response.c中的第21~30行,如下:
[root@LNMP http]# sed -n '21,30p' ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"
" NGINX_VER " " CRLF #此行需要修改
"
" CRLF "