mask是acl权限生效的最终闸门,它通过与各acl条目按位与运算限制实际权限,常见因chmod或未同步更新导致权限被截断,需用--mask参数重算或显式设置。

Mask 不是可选配置,而是 ACL 权限生效的“最终闸门”。它不决定谁有权限,而是限制所有非属主、非属组条目(包括用户 ACL、组 ACL、默认 ACL)的实际有效上限。很多权限看似设置了却没效果,根源就在 mask 被意外压低或未同步更新。
为什么 Mask 会“锁住”你的 ACL 权限
ACL 中每条 user:xxx 或 group:xxx 规则声明的是“希望给的权限”,但真正起作用的是该规则与 mask 的“按位与”结果。例如:
- 你执行 setfacl -m u:alice:rwx /shared,getfacl 显示 user:alice:rwx
- 但同时 getfacl 显示 mask::r-- → 那么 alice 实际只有 r--(读权限)
- 因为 rwx & r-- = r--
常见导致 mask 变窄的操作:
• 执行 chmod 缩小基础权限(如 chmod 640)
• 使用旧版工具或 NFS 挂载后未显式刷新
• 批量 setfacl -R 时未带 --mask,mask 未重算
安全修正 Mask 的三步法
不要直接猜或硬写 mask 值。先诊断,再最小化干预,最后验证。
-
查现状:运行 getfacl /path,重点看两行:
→ mask::...(当前生效上限)
→ 所有 user:xxx: 和 group:xxx: 后是否带 effective:... 字样(有则说明已被 mask 截断) -
算需求:列出所有已设的非基础 ACL 条目中,各自声明的最高权限位(r/w/x),取并集。比如已有:
user:jenkins:r-x
group:devteam:rwx
default:group:qa:rw-
→ 最大需要 rwx,所以 mask 至少应为 rwx -
安全更新:
✓ 推荐:加 --mask 参数让系统自动重算
setfacl --mask -m u:jenkins:r-x /shared
✓ 精确控制:显式设置 mask 值
setfacl -m m:rwx /shared
✗ 避免:只改 chmod(它会连带压低 mask)或跳过 --mask 直接设用户权限
目录级 Mask 修正要同步处理默认 ACL
对目录设默认 ACL(-d)时,其 mask 与当前目录的 mask 是独立的。如果只修了目录本身的 mask,新建文件仍可能受限。
- 查看默认规则中的 mask:
getfacl /shared | grep -A 5 "default:",找 default:mask::... - 同步更新默认 mask:
setfacl -d --mask -m m:rwx /shared
或分步:
setfacl -d -m m:rwx /shared - 注意:-d --mask 必须一起用,单独 -d -m m:xxx 不生效
验证与兜底建议
修正后务必验证,而非仅看 setfacl 是否无报错。
- 用目标用户身份实测操作(如 su - jenkins -c "touch /shared/test")
- 对比修正前后 getfacl 输出,确认所有 effective:... 行已消失或变为预期值
- 如环境敏感,先在测试目录执行完整流程:
cp -a /shared /shared_test && setfacl --mask -m m:rwx /shared_test - 备份原始 ACL(防误操作):
getfacl -R /shared > acl_before_mask_fix.txt











