在 Linux 服务器中,权限冲突问是一个非常常见的问题。
例如:
Cron 定时任务:root 用户执行
PHP(Nginx + PHP-FPM):www-data 或 www 用户执行
Apache:apache 用户执行
Tomcat:tomcat 用户执行
两个不同用户需要共同读写同一目录。
很多人第一反应就是:
chmod -R 777 data/虽然能解决问题,但非常不安全。
Linux 提供了更好的方案——ACL(Access Control List)。
一、为什么传统权限解决不了?
Linux 普通权限只有三类:
Owner(所有者) Group(所属组) Others(其他人)例如
-rw-r--r--表示
Owner rw- Group r-- Other r--假设:
root (定时任务) www (PHP)目录
/data/report/权限
drwxr-x--- root root那么:
root 可以
读 写 删除 创建而 www:
没有权限如果改成
775那么要求:
www 必须属于 root 组现实中通常不是。
如果改成
777任何用户都能写。
安全性很差。
二、ACL 是什么?
ACL(Access Control List)
就是:
给某一个指定用户,单独赋予权限。
例如:
目录属于 root 但是允许 www 写无需:
修改 owner 修改 group 修改 777ACL 就像:
普通权限: Owner Group Other ACL: Owner Group Other + www + mysql + backup + ...因此更加灵活。
三、查看系统是否支持 ACL
Ubuntu:
which setfacl which getfacl如果没有:
Ubuntu
sudo apt install aclCentOS
yum install acl查看文件系统
mount例如:
/dev/sda1 on / type ext4现在:
Linux 大多数:
ext4 xfs btrfs默认都支持 ACL。
四、ACL 常用命令
查看 ACL
getfacl 文件例如
getfacl report输出
# file: report # owner: root # group: root user::rwx user:www:rwx group::r-x mask::rwx other::---说明:
www 拥有 rwx设置 ACL
给 www 权限
setfacl -m u:www:rwx report解释:
-m modify u user www 用户名 rwx 权限再查看
getfacl report会看到:
user:www:rwx说明成功。
五、解决 root 与 www 冲突
假设:
/var/www/project/storageroot 定时写:
cron shellPHP:
www需要共同写。
设置:
sudo setfacl -R -m u:www:rwx /var/www/project/storage以后:
root www 都可以写无需:
777六、递归设置
整个目录
setfacl -R -m u:www:rwx data查看
getfacl data如果目录很多:
全部都会拥有 ACL七、新建文件为什么又没权限?
很多人做到这里发现:
已有文件可以。
但是:
root 新建文件 www 又打不开。为什么?
因为:
ACL 默认不会继承。
例如
data/里面:
旧文件 有 ACL后来 root:
touch test.txt结果:
test.txt 没有 ACL这也是很多人踩坑的地方。
八、默认 ACL(Default ACL)
Linux 可以设置:
以后新建文件 自动继承 ACL命令:
setfacl -R -d -m u:www:rwx data这里:
-d default查看:
getfacl data会看到:
default:user:www:rwx以后:
mkdir touch cp都会自动继承。
例如:
root
touch data/a.txt查看:
getfacl data/a.txt里面:
user:www:rwx已经自动存在。
九、同时给多个用户
例如:
root www backup都需要。
setfacl -m u:www:rwx data再:
setfacl -m u:backup:r-x data查看:
user:www:rwx user:backup:r-x互不影响。
十、给整个用户组
例如:
group:wwwsetfacl -m g:www:rwx data查看:
group:www:rwx十一、删除 ACL
删除某用户
setfacl -x u:www data删除组
setfacl -x g:www data删除全部 ACL
setfacl -b data十二、mask 是什么?
查看 ACL:
user::rwx user:www:rwx group::rwx mask::r-x other::---很多人疑惑:
www 是 rwx 为什么不能写?因为:
mask 限制了 ACL 最大权限。真正权限:
user:www:rwx AND mask:r-x = r-x所以:
没有写权限。修改:
setfacl -m m:rwx data或者:
setfacl -m mask:rwx data十三、实际生产环境案例
假设目录:
/var/www/project/storage需求:
root(cron)可以读写
www(PHP)可以读写
其他用户不能访问
新建文件自动继承权限
推荐方案:
# 给 www 设置 ACL sudo setfacl -R -m u:www:rwx /var/www/project/storage # 设置默认 ACL,确保新文件继承 sudo setfacl -R -d -m u:www:rwx /var/www/project/storage # 如有需要,调整 ACL mask sudo setfacl -R -m m:rwx /var/www/project/storage sudo setfacl -R -d -m m:rwx /var/www/project/storage然后验证:
getfacl /var/www/project/storage应看到类似输出:
user::rwx user:www:rwx group::r-x mask::rwx other::--- default:user::rwx default:user:www:rwx default:group::r-x default:mask::rwx default:other::---这样,root 的 Cron 任务和 **Web 服务(www 用户)**即可安全地共享该目录,而无需将权限放宽到777。
十四、ACL 与 chmod/chown 对比
| 方案 | 灵活性 | 安全性 | 是否推荐 |
|---|---|---|---|
chmod 777 | 很低 | ❌ 极低 | 不推荐 |
chown www:www | 一般 | 中等 | 仅适用于 Web 独占目录 |
chgrp+775 | 较高 | 较高 | 同组协作时推荐 |
ACL (setfacl) | 最高 | 高 | ⭐ 多用户协作场景首选 |