linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,acl是一个好东西,有了它可以很完美且优雅的控制目录权限。acl的基础知识,这里不再详述,有兴趣可以参看此文(通过实践学习linux ACL基本用法/Linux ACL 体验) 一个很可能遇到的实际问题: linux下的web站点,该站点开启ftp上传下载;web与ftp以不同的用户运行,分别是web, ftp. 该目录 ./html 结构大致如下 (shell当前目录为/var/www/html, 下同)
$ls 为了web的安全其见,其中 upload目录为web后台上传文件的目录,权限为777;其它文件(目录)权限755(这里使用555也是可以的) 这样web是安全了,但问题也来了 ftp用户就没有写入权限了,将无法通过ftp修改web程序。 如果能实现以下这样的功能就好了: web用户还是以上权限,不多赋权;但ftp用户可以对这里的所有目录、子目录(及其中文件)都有完全的权限 这种情况下,就要派acl上场了。 对于web用户的权限,保持不变。而针对ftp用户设置几条acl规则: setfacl -R -m u:ftp:rwx .
大意是,对当前目录 . 递归设置acl规则 u:ftp:rwx , 翻译成人类语言就是说:给当前目录及其子目录、文件设置acl规则,让用户ftp拥有完全权限。 太简单了,这样就完成搞定了! 差不多了,不过这里还有一个问题,对于以后新建的目录里,ftp用户可能并没有rwx权限,这是为什么呢?因为对于新建目录,它并没有相应的acl规则,而是沿用022的默认umask, 结果就是新文件的755权限。 这里就要用默认acl来实现,简单说来,就是让新建的目录,都自动继承一个默认的acl规则,让ftp用户拥有rwx权限。 setfacl -R -d --set u:ftp:rwx . 还是一条设置acl的命令(setacl); -R 是递归执行,这很简单。重点在 -d --set u:ftp:rwx 上。 -d,指后面是一条default acl规则,规则是 --set u:ftp:rwx, 对当前目录 . 设置规则 用人类的语言讲,就是让所有新建目录都对ftp用户设置rwx的默认权限。 就这样,设置完了。相当简单吧? 回过头来,再看看上面对upload目录设置777的权限,似乎也不并不怎么完美,是不是也可能通过acl规则让web用户拥有rwx的权限?当然可以,其实更好,因为这里的文件是web用户自己创建的,里面的文件所有者应该是web用户,777权限似乎高了点;而且如果这是从其它服务器上迁移过来的站点的话,这些文件的所有者可能还会比较乱。 另外,默认acl,只对以后的新建目录有效,而对已有文件,它并不改变其acl,所以,要同时使用上面所述的两个命令,对已有文件(setfacl -R -m u:ftp:rwx .)和以后的新建目录(setfacl -R -d --set u:ftp:rwx .)设置acl. 上面的acl是针对一个用户web设定的,还可以对一个用户组来设置 g:group_name:rwx , 这样对多用户协作状态下会比较有用。 (责任编辑:IT) |