IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 167|回复: 0

nginx环境中配置网站目录权限设置

[复制链接]

50

主题

0

好友

248

积分

IT初级专家

Rank: 3Rank: 3

升级  16%

发表于 2016-3-24 17:01:46 |显示全部楼层
nginx环境中配置网站目录权限设置

配置权限的原则是,在保证网站正常运行下,尽量给最低权限。
nginx目录权限配置:
1、nginx进程用户是默认用户wwwboy;(暂时还不知道nginx进程用户会对服务器什么地方的权限有影响,配置nginx好像都没碰到权限设置问题)
2、PHP-fpm进程用户配置为wwwboy;
3、网站目录所有者设置为ftpuser,由于需要在FTP中对网站文件进行下载(读取)、上传(写入),ftpuser肯定对网站目录有读写权限。

关键点:php-fpm 子进程所使用的用户,不能是网站文件所有者。
网站文件所有者和php-fpm进程用户设为不同的好处是在PHP程序中无法对网站文件进行修改,这样即使网站被挂马了,也能降低很多损失,例如,对方无法在你的正常代码里混入后门。
以前总习惯性地把缓存目录权限设置为777,这回既然注意到安全问题,就想顺便弄清楚一下缓存目录怎么设置才正确合理并安全。
其实,了解清楚linux文件权限分配方式,这个疑惑也就明朗了:
假设网站缓存目录名为cache,其所有者为ftpuser。缓存文件是由php-fpm进程执行写入,相当于用户wwwboy要在用户ftpuser的目录cache里写文件,不被允许的!因此,要分配给wwwboy对cache目录的写权限,chmod o+w -R cache即可,如果ftpuser与wwwboy同一个用户组,就chmod g+w -R cache。缓存目录不需要执行权限,所以以往设置777权限的做法相当粗糙,不过在使用虚拟主机的时候,自己无法把握服务器上各种设置,777也是最便捷做法了。
缓存目录需要o+wx,添加x的原因是读取目录的时候需要执行权限,否则文件是写不成功的。除非要生成的文件和写文件的脚本在同一个目录内,不需要读取目录的权限,也就不需要执行权限。原理:(此处感谢 @lanisle)

On a directory, the execute permission (also called the "search bit") allows
you to Access files in the directory and enter it, with the cd command, for
example. However, note that although the execute bit lets you enter the
directory, you're not allowed to list its contents, unless you also have the
read permissions to that directory.

目录访问权限设置

1.目录列表(directory listing)

nginx让目录中的文件以列表的形式展现只需要一条指令这样就不会返回403

autoindex on;

autoindex可以放在location中,只对当前location的目录起作用。你也可以将它放在server指令块则对整个站点都起作用。或者放到http指令块,则对所有站点都生效。

下面是一个简单的例子:

代码如下
复制代码

server {
        listen   80;
        server_name  domain.com www.domain.com;
        access_log  /var/...........................;
        root   /var/www/html;
        location / {
                index  index.php index.html index.htm;
        }
        location /api {
               autoindex on;
        }
}

2.nginx禁止访问某个目录

apache的Deny from all类似,nginx有deny all指令来实现。

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

代码如下
复制代码

location /dirdeny {
      deny all;
      return 403;
}

autoindex_exact_size off;//人性化方式显示文件大小否则以byte显示
autoindex_localtime on;//按服务器时间显示,否则以gmt时间显示,gmt时间指格林尼治时间
autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间

上传目录无执行权限

代码如下
复制代码


location ~ ^/upload/.*.(php|php5)$
{
deny all;
}

设置目录浏览

1、打开/usr/local/nginx/conf/nginx.conf,找到WebServer配置处,加入以下内容:

代码如下
复制代码

location /soft/ {
root /var/www/;  此处为soft的上一级目录
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}

登录权限认证

1、创建类htpasswd文件

代码如下
复制代码

[root@localhost Soft]#wget -c http://jafee.net/Soft/InstallPack/htpasswd.sh

[root@localhost Soft]#bash htpasswd.sh

提示输入用户名、密码、及认证文件名,脚本会自动生成认证文件,这里默认路径是保存在了/usr/local/nginx/conf 下,如果你的nginx目录不是这里,可以修改htpasswd.sh替换你的nginx目录。

我这里是:/usr/local/nginx/conf/test.conf  #记下此路径

2、为Nginx添加auth认证配置

代码如下
复制代码

location ^~ /soft/
{
auth_basic “MyPath Authorized”;
auth_basic_user_file  /usr/local/nginx/conf/test.conf;    #这里写前面脚本返回的文件路径;
}

#”MyPath Authorized”为提示信息,可以自行修改。

3、修改好配置后,重启nginx,访问http://localhost/soft/ 就会提示输入用户名和密码,认证成功后,即可列出目录。

4、需要注意的是,加上认证之后该目录下的php文件将不会被解析,会让你下载,如果要使其能够解析php可以将上面的配置改为:

代码如下
复制代码

location ^~ /soft/ {
location ~ .*.(php|php5)?$ {
fastcgi_pass Unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
auth_basic “Authorized users only”;
auth_basic_user_file /usr/local/nginx/conf/test.conf ;
}

有时候当Nginx读取本地目录时会收到403错误,权限问题。

先来了解一下Nginx的用户管理,Nginx在以linux service脚本启动时,通过start-stop-domain启动,会以root权限运行daemon进程。

然后daemon进程读取/etc/nginx/nginx.conf文件中的user配置选项,默认这里的user=nginx

也就是用nginx用户启动worker process。403错误就是因为nginx用户没有权限访问我当前开发用的用户目录,/home/dean/work/resources。

解决方法是将user=nginx替换成root,然后重新启动nginx,可以了。

IT论坛方法也试过,比如给/home/dean/work/resources目录设置777权限,比如将nginx用户加入root组,都不行。


所以当开发的时候,就用user=root配置吧。至于产品环境下,resouces目录完全可以放到nginx用户目录下,所以问题不大。

以上便是对nginx+php网站目录权限安全设置的表述和理解,希望对大家有所帮助。


nginx环境中配置网站目录权限设置

您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部