基于linux系统的web服务器架构听说过很多年了,也用了好几年,不过都是用现成的运行环境,比如虚拟主机、共用VPS。亲手配置、把玩,我还是第一回,初学过程的曲折在意料之中,反复折磨了两三天,终于搞清楚一些linux基础概念和nginx+php配置。今天主要记录nginx+php环境下,原先理解的很混乱的网站目录权限设置。
由于对linux文件权限的概念不清楚,迁移网站到VPS上时,担心设置错了影响网站安全,刚好之前一个网站被挂了马,配置服务器时就特别在意这事了。
配置权限的原则是,在保证网站正常运行下,尽量给最低权限。
我的配置:
1、nginx进程用户是默认用户wwwboy;(暂时还不知道nginx进程用户会对服务器什么地方的权限有影响,配置nginx好像都没碰到权限设置问题)
2、php-fpm进程用户配置为wwwboy;
3、网站目录所有者设置为ftpuser,由于需要在FTP中对网站文件进行下载(读取)、上传(写入),ftpuser肯定对网站目录有读写权限。
关键点:php-fpm 子进程所使用的用户,不能是网站文件所有者。这里推荐一篇关于权限设置的文章《正确设置网站文件所有者 提高网站安全性 防止被挂木马》,我就是读完这篇文章才理解nginx、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也是最便捷做法了。
[2013-3-25更新]:缓存目录需要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.
以上便是对nginx+php网站目录权限安全设置的表述和理解,看起来像菜鸟基础班的笔记。此外,以往我对开源的伟大魅力不以为然,学习使用linux几天,开始有所体会。