一文搞懂 Linux ACL:突破传统 UGO 权限的局限 📅 2026/7/2 11:09:40 Linux 中的ACLAccess Control List访问控制列表是对传统 Unix 权限rwx的扩展它可以让一个文件或目录同时针对多个用户或多个组设置不同的权限。如果没有 ACL一个文件只能设置文件所有者Owner所属组Group其他用户Others而 ACL 可以额外指定指定某个用户(User)的权限指定某个组(Group)的权限默认权限(Default ACL)一、为什么需要 ACL假设有如下场景文件 report.txt Ownerroot Groupdev 权限 -rw-r-----传统权限表示root rw- dev r-- others ---现在有三个用户alice bob tom要求alice 可以读写 bob 只能读 tom 没权限传统 Linux 权限chmod chown chgrp根本做不到。只能Owner Group Others三级权限。ACL 就能做到root rw- dev r-- alice rw- bob r-- tom ---二、ACL 工作原理Linux 权限实际上变成了文件 Owner Group Others │ │ -------------- | ACL | |--------------| | user:alice | | user:bob | | group:test | --------------即传统权限 ACL 扩展权限ACL 信息不会覆盖 chmod 权限而是附加在 inode 的扩展属性Extended Attributesxattr中。因此ls -l看到-rw-r-----最后那个表示此文件拥有 ACL。例如-rwxrwx---说明ACL 存在三、ACL 分类Linux ACL 分为Access ACL访问 ACL用于文件 目录例如user:alice:rwx group:test:r-x另一种Default ACL默认 ACL只能用于目录作用目录中新创建的文件自动继承 ACL。例如dir/ default:user:alice:rwx以后touch dir/a.txt自动拥有user:alice:rwx四、查看 ACL命令getfacl 文件名例如getfacl test.txt输出# file: test.txt # owner: root # group: root user::rw- user:alice:rwx group::r-- group:dev:r-- mask::rwx other::---逐项解释user::表示Owner 权限例如user::rw-就是root - rw-user:alice:rwx表示alice - rwxACL 新增权限。group::表示文件所属组权限例如group::r--就是dev组 - r--group:test:rwx表示test组成员拥有rwxmask::ACL 最重要的一项。例如mask::rw-它表示ACL 最大权限。ACL 中所有 group 以及所有 user除 owner都会受到 mask 限制。例如user:alice:rwx mask::rw-最终alice 实际权限 rw-不是rwx因为x 被 mask 去掉other::就是Others 权限五、设置 ACL命令setfacl格式setfacl -m 类型:对象:权限 文件例如-m表示modify给用户增加 ACL例如setfacl -m u:alice:rwx file.txt查看getfacl file.txt输出user:alice:rwx给组增加 ACLsetfacl -m g:test:r-x file.txt得到group:test:r-x修改 ACL再次执行setfacl -m u:alice:r--即可覆盖alice rwx ↓ r--六、删除 ACL删除某用户setfacl -x u:alice file.txt删除某组setfacl -x g:test file.txt删除全部 ACLsetfacl -b file.txt意思remove all ACL恢复普通权限。七、默认 ACLDefault ACL假设/project所有新文件alice都应该有rwx设置setfacl -m d:u:alice:rwx /project查看getfacl /project得到default:user:alice:rwx以后touch /project/a.txt自动继承user:alice:rwx删除默认 ACLsetfacl -x d:u:alice dir八、递归设置 ACL目录project/所有文件alice:rwxsetfacl -R -m u:alice:rwx project递归-R默认 ACLsetfacl -R -m d:u:alice:rwx project以后所有新文件继续继承。九、MaskACL 掩码详解ACL 中最容易混淆的是mask。例如user:alice:rwx mask::r-- other::---虽然alicerwx实际上Effective r--查看getfacl可能显示user:alice:rwx #effective:r--为什么因为实际权限 ACL权限 AND mask权限即rwx 111 AND r-- 100 100 r--修改 masksetfacl -m m:rwx file或setfacl -m mask:rwx file十、ACL 与 chmod 的关系很多人误认为chmod 不会影响 ACL实际上会影响 mask 和基础权限。例如chmod g-w file可能导致mask同步变化。因此ACL 配置后最好再检查getfacl确认最终有效权限。十一、ACL 与 umask 的关系创建文件时最终权限 程序默认权限 AND ~umask如果目录设置了Default ACL先根据 Default ACL 生成 ACL。再结合umask调整基础权限。最终形成新文件的访问权限。因此Default ACL 与umask会共同影响新建文件的权限。十二、ACL 文件备份与恢复导出 ACLgetfacl -R /project acl.backup恢复 ACLsetfacl --restoreacl.backup这对于迁移目录、灾难恢复或批量复制权限非常有用。十三、ACL 实战示例示例 1多个用户访问同一文件touch report.txt chmod 640 report.txt setfacl -m u:alice:rw report.txt setfacl -m u:bob:r report.txt getfacl report.txt效果用户权限Ownerrw-Groupr--alicerw-bobr--Others---示例 2项目目录共享开发目录/project要求所有开发人员属于dev组可读写。测试人员tester只读。新建文件自动继承权限。配置mkdir /project chgrp dev /project chmod 2770 /project # SGID确保新文件继承 dev 组 setfacl -m g:tester:r-x /project setfacl -m d:g:tester:r-x /project setfacl -m d:g:dev:rwx /project这样新建文件会自动继承相应 ACL减少后续维护工作。十四、ACL 常用命令速查功能命令查看 ACLgetfacl file增加用户 ACLsetfacl -m u:user:rwx file增加组 ACLsetfacl -m g:group:rwx file修改 Masksetfacl -m m:rwx file删除用户 ACLsetfacl -x u:user file删除组 ACLsetfacl -x g:group file删除所有 ACLsetfacl -b file设置默认 ACLsetfacl -m d:u:user:rwx dir删除默认 ACLsetfacl -x d:u:user dir递归设置 ACLsetfacl -R -m u:user:rwx dir导出 ACLgetfacl -R dir acl.backup恢复 ACLsetfacl --restoreacl.backup十五、最佳实践优先使用传统权限模型Owner、Group、Others仅在无法满足需求时引入 ACL以降低管理复杂度。项目共享目录建议结合 SGID 与 Default ACL既能保证新文件继承正确的组也能自动继承 ACL。配置 ACL 后始终使用getfacl验证结果特别关注mask和#effective字段避免实际权限与预期不符。迁移或备份重要目录时同步备份 ACL否则恢复后可能出现权限异常。注意文件系统支持现代的ext4、XFS、Btrfs等通常支持 POSIX ACL但在挂载参数或某些网络文件系统环境下仍需确认 ACL 是否启用。可以使用mount、tune2fs或创建测试 ACL 进行验证。