关键三步:确认文件系统启用acl挂载选项;用setfacl -d -m为租户目录设default ACL;配合umask 002与setfacl -m m::rwx确保权限真实继承生效。

要在 Linux 下用 setfacl 实现多租户共享目录的精细化 Default ACL,关键不是“加权限”,而是“设规则+保继承+控生效”。核心动作只有三步:确认文件系统支持 ACL、为目标租户目录设置默认规则、配合 umask 和 mask 保证新文件真能按预期获得权限。
确认并启用文件系统 ACL 支持
ACL 不是内核自动开启的功能,它依赖文件系统挂载时启用 acl 选项:
- 运行
mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl,若输出含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 只作用于新建项,且必须设在目录上。以租户 tenant-a 和 tenant-b 为例:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 先创建隔离目录:
mkdir -p /srv/multi-tenant/{tenant-a,tenant-b},并确保父目录可遍历:chmod 755 /srv/multi-tenant - 给租户自身赋予完整控制权(含 default):
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等以default:开头的行
确保新文件真实继承权限(umask + mask)
即使 default ACL 设好了,新建文件也可能“看不见”租户权限——常见原因有两个:
-
umask 过严:例如用户 umask 是
022,新建文件默认权限为644(rw-r--r--),此时 ACL 中的u:tenant-a:rw-就无法体现写权限。建议租户统一使用umask 002(通过/etc/profile或~/.bashrc设置) -
mask 限制了上限:ACL 条目实际生效受
mask控制。如果getfacl显示mask::r-x,那即使你给了rwx,也只生效rx。可显式提升:setfacl -m m::rwx /srv/multi-tenant/tenant-a - 注意大写
X:在 setfacl 中用rwx和rwX效果不同。X表示“仅对目录或已有执行位的文件添加 x”,更安全,推荐用于目录 default ACL
验证与调试要点
配置完别急着交付,务必模拟租户行为测试:
- 切换到租户用户:
sudo -u tenant-a touch /srv/multi-tenant/tenant-a/testfile - 检查该文件 ACL:
getfacl /srv/multi-tenant/tenant-a/testfile,应看到user:tenant-a:rwx(或至少rw-)条目 - 尝试越权访问:
sudo -u tenant-a ls /srv/multi-tenant/tenant-b,必须返回Permission denied - 若失败,按顺序排查:文件系统是否真启用了 acl → 目录是否有 default 条目 → 当前用户 umask 是否合理 → mask 是否足够宽










