You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux默认ACL新建普通文件时未按预期继承权限问题

问题原因

你对POSIX ACL的继承逻辑存在两处认知偏差,这也是ACL配置中最常见的误区:

  • default ACL定义的是权限上限,而非强制赋予的权限
    目录配置的default ACL仅规定了新建子对象可以获得的最大权限,不能突破操作系统创建文件时的初始权限规则:
    • 执行mkdir创建子目录时,系统传入的初始权限参数是0777(读写执行位全部开放),和default ACL做按位与运算后,所有继承的权限位都能保留,因此和你的预期完全一致。
    • 执行touch或其他程序创建普通文件时,系统传入的初始权限参数是0666(默认不携带任何执行位,这是操作系统的基础安全设计,避免新建普通文件默认带执行权限引发恶意执行风险),因此所有继承规则里的执行位都会被直接过滤,不会出现在最终文件权限中。
  • ACL mask不会直接继承default:mask配置
    新建对象的ACL mask实际计算逻辑是:继承自default:mask的权限 与 创建对象时初始mode的group类权限 做按位与。你当前环境的umask值为0022,创建普通文件时初始mode经过umask裁剪后为0644(对应group类权限仅为r--),因此最终计算得到的文件mask为rwx & r-- = r--。
    而ACL规则中,所有命名用户(如你配置的jenkins)、命名组(如你配置的controlm)、文件属组的实际有效权限,都是自身配置权限与mask按位与的结果,因此你会看到这几个条目后标注#effective:r--,本质是mask限制了它们的实际可用权限。

你看到新建文件other位为r--,是因为配置default ACL时如果仅添加命名用户、命名组的规则,没有显式指定default:other的权限,部分实现会默认给default:other分配读权限,子目录创建时的权限运算逻辑刚好覆盖了这个问题,普通文件创建时就会显现。

修复方案

如果你的预期是让jenkins用户、controlm组对目录下新建的普通文件拥有读写权限(普通文件默认不需要执行权限),可以选择以下任意一种方案调整:

  1. 调整创建文件操作前的umask值,执行umask 0002后再创建文件,此时普通文件的初始mode裁剪后为0664,计算得到的mask为rwx & rw- = rw-,对应账号和组的有效权限会变为rw-,满足读写需求。如果需要other无任何权限,显式执行setfacl -m d:o::--- /app/certs刷新default规则即可。
  2. 如果需要不依赖umask强制继承权限,可以配置inotify监听目录的新建事件,在文件/目录创建后自动重新应用ACL规则,避免权限不符合预期。

内容的提问来源于stack exchange,提问作者Haagy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:42:25