LNAMP环境下如何正确的设置网站文件权限

LNAMP环境下控制运行权限有三种方式。

第一种,只取消掉指定目录(如上传目录)的运行权限:http://www.yundaiwei.com/post/399.html
这种方式,只能说,有比没有要好些。

第二种,只允许指定文件和目录有运行权限:http://www.yundaiwei.com/post/472.html
适合少量需要运行PHP程序的网站,比如生成静态的CMS程序。

第三种,利用x权限位进行限制,设置稍复杂些。
在LNAMP环境中,一般使用下面的代码把PHP请求传递给Apache:

location / {
try_files $uri @apache;
}

location @apache {
internal;
proxy_pass http://127.0.0.1:8080;
include proxy.conf;
}

location ~ .*\.(php|php5)?$ {
proxy_pass http://127.0.0.1:8080;
include proxy.conf;
}
但是这样的配置是不需要PHP文件拥有x位的权限的,只需要Apache拥有r读取权限,就能运行。
如果想通过x位来限制运行权限,配置需要修改为这样:

location ~ .*\.(php|php5)?$ {
if (!-x $request_filename){
return 403;
}
proxy_pass http://127.0.0.1:8080;
include proxy.conf;
}
但是这样还有一些问题,比如访问http://www.yundaiwei.com/的时候,URL里并没有出现.php后缀,上面的配置匹配不到这样的请求,需要把前面的代码再修改下。

location @apache {
if (!-f $request_filename/index.html){
set $flag "1";
}
if (!-f $request_filename/index.htm){
set $flag "${flag}2";
}
if (-f $request_filename/index.php){
set $flag "${flag}3";
}
if (!-x $request_filename/index.php){
set $flag "${flag}4";
}
if ($flag = "1234"){
return 404;
}
internal;
proxy_pass http://127.0.0.1:8080;
include proxy.conf;
}
上面的5个if语句都是为了判断index.php是否有执行权限。而且这样配置的提前是默认首页文件的顺序是:index.html index.htm index.php,如果不是的话还要修改。

并且有一点需要注意的是,Nginx里-x判断的是文件的属主是否有x权限,和group、other的x位都没有关系。

这样修改完成后,就可以用x位来控制PHP的运行权限了,当然r和w权限也可以设置。
下面所讲的都是针对第三种设置方式。

普通文件的rwx权限很容易理解,但是目录的rwx权限,绝大多数文章里并没有讲清楚,经过我自己的反复测试,得到的总结写在了这篇BLOG里:http://www.yundaiwei.com/post/725.html。

假设Apache的运行身份都为www,那么我建议的权限设置方案为:

所有文件属主为root,属组为www。

chown -R root.www .
所有文件默认权限为040,也就是Apache有读取权限。

find . -type f -exec chmod 040 {} \;
所有目录默认权限为050,也就是Apache有进入和列目录权限。

find . -type d -exec chmod 050 {} \;
给需要写权限的目录加上写权限

find . -exec chmod 070 {} \;
(进到需要加权限的目录里执行。有些网站程序会在新创建目录时把权限码设置成与上一级相同,而属主属组为www.www,这样会导致www用户的无任何权限,在这样的情况下,需要给用户权限位也加上写权限,完整命令为find . -exec chmod 770 {} \;)

# 给单个PHP文件加执行权限

chmod u+x path/to/file.php
# 给整个目录下PHP文件加执行权限

find . -type f -name "*.php" -exec chmod u+x {} \;
(进到需要加权限的目录里执行)

比如云代维网站在经过上面的设置后,根目录下的权限是这样:

如果是稍大型一点的网站,设置严格的运行权限并不是一件很容易的事情,需要花费大量的时间去找出需要写权限的目录和需要执行权限的程序。

关于网站文件权限的几个常见误区。
第一,经常在论坛看到这样的场景,楼主问:网站设置什么样的权限安全?
二楼:755
三楼:644
四楼:xxx
在没有明确属主和属组的情况下,并且不区分文件和目录,这样去谈权限码,有点无稽之谈。
第二,非严格的权限设置并不会直接导致网站被黑,只是在网站有漏洞并且被利用的情况下,能使用入侵者进一步扩大控制。
第三,rwx权限对于文件的意义和文件的意义是不同的,如果想严格设置权限,是不能用chmod -R的。