Linux中ACL继承需通过默认ACL实现:仅对目录设置有效,新子目录完整继承并具备继续继承能力,普通文件仅继承权限位;使用setfacl -d设置,getfacl查看,-d -b清除默认ACL。

Linux系统中,ACL(访问控制列表)的继承行为不是自动开启的,必须通过设置默认ACL(default ACL)来实现子目录和文件的权限继承。关键点在于:默认ACL只对新创建的文件和子目录生效,不影响已有内容;且仅对目录设置有效,对普通文件设置default ACL会报错。
如何为目录设置默认ACL
使用 setfacl -d 命令为目录添加默认ACL规则。例如,让组 devteam 对 /srv/project 及其后续新建内容拥有读写执行权限:
- setfacl -d -m g:devteam:rwx /srv/project
- 该命令不会改变当前已存在的文件或子目录权限,只影响之后新建的对象
- 若需同时设置当前目录本身的ACL(非默认),可额外加一条不带 -d 的命令:setfacl -m g:devteam:rwx /srv/project
默认ACL的继承逻辑与限制
新文件/子目录继承的是父目录的“默认ACL”,但具体继承方式有区别:
- 子目录:完整继承父目录的默认ACL,并自动将其设为自身的默认ACL(即具备继续向下继承的能力)
- 普通文件:仅继承父目录默认ACL中的权限位(如rwx),但不继承default标记——因此文件自身无法再作为继承源
- umask仍起作用:实际赋予新文件的权限是默认ACL权限与umask按位取反后的交集(例如默认给rw-rw-rw-,umask=002 → 最终为rw-rw-r--)
检查与清理默认ACL
用 getfacl 查看是否设置了默认ACL:
- getfacl /srv/project —— 若输出中包含 default: 开头的行,说明已配置默认ACL
- 移除某条默认规则:setfacl -d -x g:devteam /srv/project
- 彻底清除所有默认ACL:setfacl -d -b /srv/project
- 注意:-b 同时清除常规ACL和默认ACL;如只想清默认ACL,务必加上 -d
配合umask与目录粘滞位加强管理
单纯依赖默认ACL不够安全,建议组合使用:
- 将共享目录设为 setgid(g+s):chmod g+s /srv/project,确保新创建文件/目录继承父目录所属组
- 合理配置用户umask(如002),避免新建文件默认无组写权限
- 对敏感目录启用粘滞位(+t),防止非所有者删除他人文件:chmod +t /srv/project
- 定期审计:getfacl -R /srv/project | grep "default:" 快速定位已设默认ACL的目录


















