nginx + php-fpm fastcgi防止跨站、跨目录的安全设置

我们知道apache php mod的方式可以很方便的配置 open_basedir 限制各个站点的目录访问权限。

nginx + php-fpm fastcgi的方式需要这样做。

首先php的版本必须大于等于php5.3.3。

总限制 通过php-fpm.conf限制

在php-fpm.conf配置文件当中可以增加如下参数

env[TMP] = /tmp/
env[TMPDIR] = /tmp/
env[TEMP] = /tmp/
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f webmaster@qq.com
php_admin_value[open_basedir] = /home/wwwroot/:/tmp/:/var/tmp:/proc/
php_admin_value[session.save_path] = /tmp/
php_admin_value[upload_tmp_dir] = /tmp/
slowlog = /usr/local/php/var/log/$pool.log
request_slowlog_timeout = 3s

可以配置env,php_admin_value。

那么配置

php_admin_value[open_basedir] = /home/wwwroot/:/tmp/:/var/tmp:/proc/

就可以把整个php脚本的访问目录控制住了。

如果方法1 方法2 方法3未配置的情况下,那么open_basedir的值就为本设置的值,如果方法1 方法2 方法3设置了,那么就是新设置的值。

另外的我这里打开了php慢执行。

slowlog 写保存路径,request_slowlog_timeout写时间。

更多的请看php官网手册 http://www.php.net/manual/en/install.fpm.configuration.php

 

方法1 在nginx 配置 fastcgi_param参数

在nginx的 php配置中 或者 在  包含的 include fastcgi.conf 文件中加入:

fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

$document_root php文档根目录,就是 nginx 配置项 root 配置的网站目录。

/tmp/目录需要有权限,默认放seesion的位置,以及unixsock。

/proc/ 可以让php查看系统负载信息。

本方法加的各个vhost 虚拟主机,都可以完美使用。都限制到自己的网站目录下。

非常推荐使用, 总限制 + 方法1 这样的组合配置方式!!!!!

方法2 在php.ini 中配置

在php.ini的末尾加入:

[HOST=www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/
[PATH=/home/wwwroot/www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/

本方法的弊端,如果有泛域名解析,比如 *.iale.com 。这个就不好控制。

 

方法3  网站根目录下增加 .user.ini  文件。

在php.ini中找到user_ini.filename 、 user_ini.cache_ttl 去掉前面的分号。

; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
user_ini.filename = ".user.ini"

; To disable this feature set this option to empty value
;user_ini.filename =

; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
user_ini.cache_ttl = 300

 

在网站根目录下创建.user.ini 加入:

open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/

这种方式不需要重启nginx或php-fpm服务。

特别注意,需要取消掉.user.ini文件的写权限,这个文件只让最高权限的管理员设置为只读。

方法1设置后,.user.ini的设置就不起作用了。
关于.user.ini文件的详细说明:
http://php.net/manual/zh/configuration.file.per-user.php

打赏

8 评论

  1. 还有个问题是,我看配置文件里fastcgi_param SCRIPT_FILENAME /srv/www/xxx/public_html$fastcgi_script_name; 这句话是没有双引号的,不知道需要添加的这句话,是否要加双引号?我是把引号去掉了。还有这样修改的配置之后,如何查看配置一生效呢?比如能否看到有独立的网站进程?

    1. 1 没测试过不加. 双引号你自己试下. 生效没生效可以看 phpinfo basedir2 这种不是独立进程池,只是单纯的basedir,为了安全以及防止用同一个进程池某些网站php阻塞所有人都阻塞了. 应该一个站一个进程池php-fpm中可以设置不同的进程池

  2. 想请教下方法一。假如我/var/www 下有N个网站,/var/www/site1.com/ /var/www/site2.com/比如这两个吧。那我的那个php-fpm.conf和fastcgi_param 里面的 /home/wwwroot/ 到底要怎么写?是只需要写一个 /var/www就可以,但是需要针对site1.com和site2.com 都要分别写?对这个部分比较迷糊。

      1. 那我只需要在每个站点的conf文件里添加这句话就OK了,不需要其他设置了吧?

  3. 原来有open_basedir这么个设置项可以设置公共路径。估计在cms这样后台生成前端可访问的静态页面的地方就很好用了。

    1. 推荐使用方法1呢。 这样每个 nginx的 server , 也就是每一个虚拟主机,都可以完美的限制到自己的当前的网站目录下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注