page contents

PHP安全:Nginx的使用安全

Nginx是一个高性能的Web服务器,对静态页面的支持相当出色,轻量且免费,因此被大量应用于高并发站点。

image


Nginx是一个高性能的Web服务器,对静态页面的支持相当出色,轻量且免费,因此被大量应用于高并发站点。


1、运行安全

严禁使用root账户运行Nginx(首字母大写代表软件,首字母小写代表指令),应该使用nginx用户或者nobody运行Nginx。在Nginx配置中使用user来指定Nginx worker进程运行用户以及用户组。

user nobody nobody;


2、项目配置文件

配置文件禁止放在Web目录中,因为一旦攻击者对Web目录拥有读写权限后即可更改nginx.conf。

client_boby_temp_path /etc/shadow;

# optional but more fun :)

location /wat {

alias /etc;

}

当重启Nginx时,Nginx会执行。

# strace -e trace=chmod,chown -f nginx

chown("/etc/shadow",33,4294967295)=0

+++exited with 0 +++

任何文件或文件夹一旦被攻击者写入到上述配置文件中,它的所有者都会被更改,攻击者将拥有相应的权限。


3、日志配置

在线上服务器中一定要将Nginx访问日志启用,日志不允许存放在Web目录下,并且设置日志操作权限为root。Nginx中使用access_log来开启并指定Nginx的访问日志记录路径,使用error_log来记录错误日志。

access_log logs/access.log combined;

error_log logs/error.logerror;

使用log_format配置命令来配置Nginx日志格式。log_format有一个默认的无须设置的combined日志格式,相当于apache的combined日志格式。

log_format combined '$remote_addr - $remote_user [$time_local] ''"$request$status $body_bytes_sent '' "$http_referer" "$http_user_agent" ';

Nginx日志格式允许包含的变量注释如表1所列。

image
表1  Nginx日志变量含义


4、目录和文件安全

凡允许“上传或写入”目录的权限,执行权限必须设置成禁止访问。在Nginx中使用deny all指令来实现。

禁止对目录访问并返回403 Forbidden,可以使用下面的配置。

location /dirdeny 

{

deny all;

return 403;

}

location ~ ^/upload/.*.(php|php 5)$

{

deny all;

return 403;

}


5、隐藏版本号

为了防止Nginx的版本号指纹暴露,线上服务器要对Nginx的信息进行隐藏,通常可以通过修改配置文件来实现。进入Nginx配置文件的目录,如/etc/nginx.conf,在http标签里加上server_tokens off。

http

{

……

server_tokens off; # 隐藏Nginx的版本号

……

}

同样也可以对服务器信息进行混淆。可以采用编译源码的方法来改变返回的服务器的版本信息,下载好Nginx的源代码,直接在源码中修改src/http/ngx_http_header_filter_module.c文件中ngx_http_server_string的值。

staticchar ngx_http_server_string[]="Server:nginx" CRLF;

staticchar ngx_http_server_full_string[]="Server: " NGINX_VER CRLF;

还要修改src/core/nginx.h文件中NGINX_VERSION和NGINX_VER的值。

# define NGINX_VERSION "1.7.0"

# define NGINX_VER "nginx/" NGINX_VERSION

编辑php-fpm配置文件中的配置,如fastcgi.conf或fcgi.conf,修改其中的版本号信息。

fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

可以通过以上方式将服务器信息修改为其他字符串标识,以达到隐藏版本号、迷惑部分攻击者的效果。


6、防止目录遍历

Nginx默认是不允许列出整个目录的,默认情况下不需要配置,配置不规范可造成目录遍历漏洞。如果有开启情况应该将其禁用,修改为off或者直接将其删除即可。

location / {

autoindex on;

autoindex_localtime on;

}


7、Nginx文件类型错误解析漏洞

该漏洞导致只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。其实此漏洞并不是Nginx的漏洞,而是PHP PATH_INFO的漏洞。例如,用户上传了一张照片,访问地址为http://www.ptpress.com.cn/Upl...,而test.jpg文件内的内容实际上是PHP代码时,通过http://www.ptpress.com.cn/Upl...。下面的修复方法务必先经过测试,以确保修改配置不会对应用带来影响。

(1)修改php.ini,设置cgi.fix_pathinfo=0,然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用。

(2)在Nginx的配置文件中添加如下内容,该配置会影响类似http://www.ptpress.com.cn/sof...(v2.0为目录)的访问。

if($fastcgi_script_name~..*/.*php)

{

return 403;

}

(3)在CGI模块中对PHP的文件是否存在进行校验,可以避免该漏洞的发生。

location ~ .php$ {

if($request_filename~*(.*).php) {

set $php_url$1;

}

if(!-e $php_url.php) {

return 403;

}

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name;

include fastcgi_params;

}

(4)对于存储图片的location{…},应只允许纯静态访问,不允许PHP脚本执行。

location ~ *^/upload/.*.(php|php 5)$

{

deny all;

}


8、IP访问限制

Nginx与Apache一样,也可以通过IP对访问者进行限制。

deny 10.10.1.0/24; # 禁止该IP段进行访问

allow 127.0.0.1; # 允许该IP进行访问

deny all; # 禁止所有IP进行访问

同时,可以使用GEO白名单方式来进行IP访问限制,具体配置如下。配置ip.config文件。

default 0;       //默认情况key=default,value=1

127.0.0.1 1;

10.0.0.0/8 1;//key=10.0.0.0, value=0 192.168.1.0/24 1;

配置nginx.conf文件。

geo $remote_addr #ip_whitelist {

include ip.conf;

}

location /console {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_For;

# 白名单配置

if($ip_whitelist=1) {

proxy_pass http://10.10.1.5:8080;

break;

}

return 403;

}


image

  • 发表于 2021-01-15 15:55
  • 阅读 ( 798 )
  • 分类:操作系统

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章