别再 chmod 777 了,用 ACL 给它开一扇窗

15 阅读2分钟

背景 需要一个专用备份用户 backup_reader,能读到 /home/user/backups/ 目录下的文件。

目录是 /home/user/backups/,但 /home/user 的权限是 drwxr-x---(只有 user 和 user 组能进)。backup_reader 进不去,读不到里面的文件。

原因 Linux 权限系统只有三类人:owner、group、other。想给"一个特定的其他用户"开放权限,标准权限模型做不到,只能用这两种粗暴方案:

方案命令问题
方案一:放开 other 权限chmod o+x /home/user所有人都能穿过,太开放
方案二:加入 user 组usermod -aG user backup_reader加入 user 组,能看整个家目录

都不够精确。我们需要的是:只给 backup_reader 一个人开放这一条路径。

解决:ACL ACL(Access Control List)是 Linux 的"更细粒度权限贴纸"。

# 1. 装工具
sudo apt install -y acl

# 2. 给 backup_reader 开一扇窗
sudo setfacl -m u:backup_reader:x /home/user

# 3. 看效果
getfacl /home/user

验证效果

# file: home/user
# owner: user
# group: user
user::rwx
user:backup_reader:--x       ← 关键
group::r-x
other::---

解读:

user::rwx — user 本人,读写执行

user:backup_reader:--x — 只给 x(穿过),不给 r(列目录)

other::--- — 其他用户,无权限

验证:

# backup_reader 能直接读已知文件
sudo -u backup_reader cat /home/user/backups/foo.tar.gz | head -c 10
# → OK

# backup_reader 不能列目录
sudo -u backup_reader ls /home/user/
# → Permission denied  ← 这才是我们想要的

三个坑 坑 1:setfacl 默认没装

Ubuntu 最小化安装没带 acl 包,直接跑 setfacl 会报:

sudo: 'setfacl': command not found

先 apt install acl,一条命令的事,但不知道就会卡住。

坑 2:ACL 不覆盖 chmod

如果之后执行 chmod 700 /home/user,可能会覆盖掉 ACL。改完权限用 getfacl 复查。

坑 3:x 和 r 要分清

所以 backup_reader 只需要 x 就能 cat /home/user/backups/foo.tar.gz,不需要 r 去列 /home/user/。 很多人以为要读文件必须先"能列目录",其实不是:

权限含义
r列目录,能看到里面所有文件名
x穿过目录,能按已知名字访问里面的文件
只要 x,就能做到"知道名字就能取,不知道就逛不了"。这正是备份场景想要的——脚本按固定文件名取,不需要列目录。