生产环境中实现备份目录“只写不读”的正确做法是:设目录权限为300(-wx------),配置default ACL禁止新文件继承读权限,强制备份进程使用umask 0077,并辅以审计与加固措施。

要让备份目录在生产环境中实现“只写不读”,即允许进程(如备份脚本、rsync、rclone)向其中写入新文件,但禁止任何人(包括属主、属组和其他用户)直接读取已有文件内容或列出目录内容,仅靠传统 POSIX 权限(rwx)无法满足——因为写权限(w)在目录上必须配合执行权限(x)才能进入和创建文件,而一旦有 x 权限,配合 r 就可 ls;若去掉 r 但保留 wx,则普通用户虽不能 ls,却仍可能通过已知文件名 cat 或 cp 读取——这不符合“不读”要求。
ACL(Access Control List)本身也不直接提供“只写不读”的语义。Linux 目录的写入行为(如 touch、cp、rsync --write)依赖于:目录有 w+x,且父目录路径可遍历(即各层都有 x)。但“禁止读”需从两个层面控制:
1. 禁止列出目录内容(防止 ls/cat 未知文件) → 去掉目录的 r 权限(对所有用户);
2. 禁止读取已有文件内容 → 确保目录内所有文件默认无读权限(如创建时 umask 设为 0077),并用 ACL 或默认 ACL(default ACL)约束新文件继承策略。
真正可行且生产推荐的做法是:结合目录权限 + default ACL + umask + 文件创建隔离机制,而非单纯依赖 ACL 实现“只写不读”。以下是具体实施步骤:
1. 设置备份目录基础权限:wx 但无 r
目标:任何人(含 root 以外的运维)都不能 ls /backup 或 cat /backup/xxx,但备份程序可写入。
- 执行:
chmod 300 /backup(即 -wx------:属主有 wx,无 r;属组和其他无任何权限) - 确保属主是运行备份任务的专用系统用户(如
backupd),且该用户 不用于登录 - 注意:300 意味着只有 backupd 用户能 cd 进入、创建/重命名/删除文件,但无法 ls —— 这正是所需行为
2. 配置 default ACL,确保新文件默认不可读
即使目录无 r,若新写入的文件自身权限为 644,其他人仍可通过猜路径 cat /backup/2024-06-01.tar.gz 读取。必须让新文件默认无读权限。
- 启用 default ACL:
setfacl -d -m u::---,g::---,o::--- /backup - 同时设置属主最小权限(必须含 w 才能被覆盖):
setfacl -d -m u:backupd:rw- /backup - 验证:
getfacl /backup应显示default: user::---等,并包含default: user:backupd:rw- - 这样,backupd 创建的文件默认权限 = umask 与 default ACL 交集,通常为 600(若 umask=0077)
3. 强制备份进程使用安全 umask
ACL default 只影响由内核 VFS 层创建的文件(如 open(O_CREAT)),但某些工具(如 tar -C)可能先创建再 chmod。最可靠方式是统一 umask。
- 在备份脚本开头显式设置:
umask 0077 - 若用 systemd service,添加
UMask=0077到 [Service] 段 - 若用 cron,确保 crontab 中 SHELL 启动时加载了 umask(推荐在脚本内设,不依赖环境)
4. 补充加固:禁用全局可读,审计访问尝试
防御纵深:即使权限设严,也要防止误配置或提权后读取。
- 定期检查:
find /backup -perm /444 -ls(找出任意位有 r 的文件并告警) - 启用 auditd 监控敏感读操作:
-a always,exit -F path=/backup -F perm=r - 考虑 bind-mount 或 overlayfs 隔离:将 /backup 挂载为 noexec,nosuid,nodev,进一步限制利用面
ACL 是辅助手段,不是“只写不读”的银弹。核心在于:目录去 r、进程降权、文件默认无读、持续验证。生产中建议搭配专用用户、systemd 服务单元、自动清理策略(如 find + mtime 删除旧备份)一起落地。










