在linux中用acl实现文档分层级只读权限,需结合默认acl与目录结构设计:为/spec/等子目录设置default acl使新文件自动继承只读权限,对已有文件单独应用acl,并限制父目录写权限防误删,最后验证读写行为及acl继承性。

在Linux项目中,用ACL(Access Control List)实现文档的分层级只读权限,核心是让不同角色(如开发、测试、产品)按目录层级自动继承只读访问,同时避免误写或越权修改。关键不是简单设chmod 444,而是结合默认ACL(default ACL)与目录结构设计,让新文件/子目录自动带上预期权限。
明确目录层级与角色对应关系
先梳理项目文档树,例如:
- /proj/docs/:根目录,所有文档入口
- /proj/docs/spec/:需求与设计文档(产品可写,其余只读)
- /proj/docs/api/:接口文档(开发可写,测试/产品只读)
- /proj/docs/test/:测试用例与报告(测试可写,开发/产品只读)
每个子目录的“写入者”固定,其余人员统一为只读——这决定了ACL中哪些用户/组需显式授权r--,哪些保留默认拒绝。
用default ACL实现自动继承只读权限
对只读角色所在的组(如prod、qa、dev-ro),在父目录设置默认ACL,确保新建内容自动获得只读权限:
- 给
/proj/docs/spec/设置:允许prod组读写,dev和qa组只读 - 执行:
setfacl -d -m g:dev:r-x,g:qa:r-x /proj/docs/spec/ - 再补基础ACL(非默认)使当前已有文件生效:
setfacl -m g:dev:r-x,g:qa:r-x /proj/docs/spec/
注意:-d参数只影响未来新建项;已有文件必须单独加ACL,否则不生效。
限制写入权限,防止覆盖或删除
只读 ≠ 不能删。ACL中r--允许读,但若用户对父目录有wx权限,仍可能删除该文件。因此需:
- 确保只读用户所属组对上级目录仅有
r-x(无w),例如/proj/docs/spec/的组权限设为r-x,且dev/qa组不在该目录属组中 - 或使用sticky bit + 组所有权控制:
chmod g+s /proj/docs/spec/,并把目录属组设为prod,这样即使其他组有wx,也无法删除非自己创建的文件 - 禁用写权限比依赖ACL更可靠:对只读组,目录本身不开放
w,ACL仅作补充
验证与持续维护要点
部署后必须验证三类行为:
- 只读用户能否
cat和ls?能否cp出本地?(应可以) - 只读用户尝试
touch test.txt或rm xxx.md?(应报Permission denied) - 新建子目录(如
mkdir /proj/docs/spec/v2)后,其内部新建文件是否自动继承只读ACL?(用getfacl检查)
定期运行getfacl -R /proj/docs/ | grep -A 2 "default:"抽查默认ACL是否被意外清除;脚本化同步ACL到新环境时,优先用setfacl --restore而非重复-m,避免叠加冗余规则。










