无数的网站架设教程中,每遇到可写的目录和文件,清一色是用chmod 777,我认为这是一种偷懒的做法,在很多时候会带来不必要的麻烦,并且在一些情境中,还有安全的隐患。
情境一:网站系统某个tmp文件夹用了777权限,普通管理员每天都要用abc用户登录查看机器运行状态和日志。某天abc用户的密码被盗,tmp文件就面临重大危险了。
可能有人说管理员不是root用户吗?不是还有sudo吗?
我只能说一句:千万别跟风好不好?否则你会死的很惨的!不遇到系统级的问题,滥用root权限的人基本上没有什么安全意识,不给sudo加密码的更是弱智。
情境二:比较常见的Discuz升级,现在Discuz可以在线升级了。但是升级需要有可写的权限,这时候怎么办呢?
把整个网站目录置成777当然可以,但是等你升级完成后,你还需要再把权限改回来,并且还需要把“必须”有写权限的目录,比如log、attachments等文件和文件夹置为777——问题是:你能记住到底哪些目录需要可写权限吗?都是官方的模块还可以问百度,遇到私有的模块你就抓狂吧。
用终端升级其实最好,但是提醒一下,一定要注意备份好,cp命令跟windows下的粘贴命令有时不太一样,遇到重名的文件夹可不一定会保留里面原有的文件!
那么有其他好的方式吗?
Unix/Linux文件还有个属主(owner)的概念记得吗?我们可以从它身上来做文章。
每个文件都有一个属主,每个进程也有一个属主,apache和nignx一般系统中都是apache或www,mysql的一般就是mysql,这些都是文件权限的范畴,可以参考其他资料,在本文中就不再深入探讨。
对于网站系统,比如用apache,使用的是apache的用户和组。
对于整个网站目录,把它指定一个除了apache之外的用户和用户组,比如abc:admin,冒号后面代表组,对应的命令是:
# chown -R abc:admin /website_root/
对于必须有写权限的文件和文件夹,把用户指定为apache:apache,对应的命令是:
# chown -R apache:apache /website_root/must_write
而文件权限,如果可能的话,尽可能设置为644,甚至是644,这样基本上保证只读不可写,但是对于php-fpm之类的,会提示没有权限,因为php需要可执行权限,这种情况下,可以设置为755。
这样设置后,先看安全性:网站系统即使有了漏洞,也只能修改那几个可写目录里面的文件,其他文件不是apache的文件,没有写权限。
如果abc用户被盗,同样对于整个web系统也没有写权限,只能查看文件,不能修改。
如果你想更有安全感,把可写文件目录设置为600也是可以的,这样比如php系统,既使黑客拿下系统,把另外的php shell上传到这些目录,由于不具备可执行权限,也不能执行。
再看Discuz升级,升级时只需要改变一下整个目录的权限为777既可,这个命令还是比较快速的,升级完再全部改为644或755,又回到了升级前的样子,非常方便。