“只读不删”实为术语误用,因删除依赖父目录写权限而非文件自身权限;需设文件可读、父目录禁写,并配default acl与sticky bit保障策略持续生效。

“只读不删”在 ACL 语境中实际是不成立的术语误用——因为“读”和“删”依赖完全不同的权限层级:读文件靠文件自身的 r 权限;删文件则取决于父目录的写权限(即能否修改目录结构)。真正可实现的是:允许读取文件内容,但禁止删除该文件。这需分离控制:文件本体开放读,父目录收回删权。
核心原理:删操作不由文件权限决定
Linux 中删除一个文件(如 rm report.txt)本质是修改其所在目录的 dentry(目录项),因此检查的是 /shared/ 目录是否对用户授予了 w(或 ACL 中的 delete_child),而非 report.txt 自身有没有 w 或 r。这意味着:
- 即使文件权限是
644、ACL 明确给用户r,只要父目录没给该用户w,他就删不掉它; - 反过来,若父目录给了
w,哪怕文件本身是000,用户仍可删——因为删不依赖文件内容可读。
实施步骤:文件可读 + 目录禁删
以敏感目录 /data/conf/ 为例,希望用户 auditor 能查看所有配置文件,但不能删除任何一项:
- 确保
auditor对每个目标文件有读权限:setfacl -m u:auditor:r /data/conf/app.yml /data/conf/db.env - 显式移除
auditor对父目录的写/删除能力:setfacl -m u:auditor:r-x /data/conf(注意不是-wx,r-x允许进入和列出,-x单独保留可进入但不可列目录——按需选择) - (推荐)启用 sticky bit 防跨属主删除:
chmod +t /data/conf,这样即使其他用户有目录w,也不能删非自己创建的文件
防止新文件失控:配 default ACL
若该目录会持续新增敏感文件(如日志归档、自动导出),需确保新文件默认继承只读策略:
- 设置默认 ACL,使新文件自动对
auditor可读:setfacl -d -m u:auditor:r /data/conf - 同时限制 others 不可访问:
setfacl -d -m o::--- /data/conf - 验证:
getfacl /data/conf应显示default: user:auditor:r--等条目
验证与避坑要点
执行后务必验证两层权限:
- 查目录:
getfacl /data/conf | grep auditor→ 应为user:auditor:r-x或r--,绝不能含w - 查文件:
getfacl /data/conf/app.yml | grep auditor→ 应为user:auditor:r-- - 常见失效原因:
• 目录 ACL 误设为u:auditor:rwx;
• 用户是目录属主(属主天然拥有删权);
• 文件系统未挂载acl选项(mount | grep acl确认)











