关键是要用setfacl设置default acl:先确认文件系统已启用acl挂载选项,再为租户目录执行setfacl -d -m设默认规则,最后配合umask 002和setfacl -m m::rwx确保mask不限制权限生效。

要让多租户目录下新建的文件和子目录自动获得指定权限,关键不是反复 chmod,而是用 setfacl 设置 Default ACL,并确保底层支持和权限上限不被限制。
确认文件系统已启用 ACL 支持
ACL 功能必须由文件系统挂载时显式开启。如果没启用,setfacl 看似执行成功,但 getfacl 会报错或不显示 default 条目。
- 检查当前挂载是否含 acl:运行 mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl,有输出即已启用
- 临时启用(重启失效):sudo mount -o remount,acl /srv/multi-tenant
- 永久生效:编辑 /etc/fstab,在对应分区行的挂载选项中加入 acl(如 defaults,acl),再执行 sudo mount -o remount /srv/multi-tenant
- 验证:运行 getfacl /srv/multi-tenant 不报错,且能正常显示基础条目
为每个租户目录设置 Default ACL 规则
Default ACL 只作用于目录,且只影响后续新建项(已有文件不受影响)。它定义了“将来在这里创建的东西该有什么权限”。
- 先建好隔离目录:mkdir -p /srv/multi-tenant/{tenant-a,tenant-b},并设父目录可遍历:chmod 755 /srv/multi-tenant
- 给 tenant-a 自动继承权:setfacl -d -m u:tenant-a:rwx /srv/multi-tenant/tenant-a
- 同理设置 tenant-b:setfacl -d -m u:tenant-b:rwx /srv/multi-tenant/tenant-b
- 阻止跨租户访问(显式拒绝):setfacl -m u:tenant-b:--- /srv/multi-tenant/tenant-a 和 setfacl -m u:tenant-a:--- /srv/multi-tenant/tenant-b
- 验证:getfacl /srv/multi-tenant/tenant-a 输出中应有以 default:user:tenant-a:rwx 开头的行
确保新文件真实继承权限(umask + mask)
即使 default ACL 设好了,新建文件也可能没有写权限——常见原因是 umask 过严或 mask 限高。
- 统一租户 umask:建议设为 002(在 /etc/profile 或用户 ~/.bashrc 中添加 umask 002),这样新建文件默认是 664、目录是 775,利于 ACL 写权限落地
- 检查 mask 是否足够:getfacl 输出中的 mask::r-x 表示所有 named user/group 条目最多只能生效到 rx;需显式提升:setfacl -m m::rwx /srv/multi-tenant/tenant-a
- 注意大小写:X(大写)表示“仅对目录或已有执行位的文件加 x”,比 x 更安全,适合 default 场景
管理员保留完全控制权
root 或管理用户需要持续可访问,不能被 ACL 拦住。通常无需额外操作,因为 root 绕过所有 ACL 限制;若需其他管理用户(如 admin),可直接加 ACL:
- setfacl -m u:admin:rwx /srv/multi-tenant/tenant-a
- 如需该权限也自动继承到新文件,再补一条 default:setfacl -d -m u:admin:rwx /srv/multi-tenant/tenant-a











