限制特定用户只能访问指定目录的关键是“只开一扇门、且这扇门只通向一个地方”,核心策略分两类:一是acl精准控制单个用户文件系统权限(如setfacl -m u:alice:--- /data/project),二是sftp chroot协议级隔离(需internal-sftp、chrootdirectory、/sbin/nologin及严格目录权限755并属主root)。

限制特定用户只能访问指定目录,关键不是“堵住所有门”,而是“只开一扇门、且这扇门只通向一个地方”。核心策略分两类:一类是普通文件系统级的读写控制(适合本地登录或共享目录场景),另一类是协议级隔离(如 SFTP chroot,专为远程文件传输设计)。两者逻辑不同,不能混用。
用 ACL 精准控制单个用户的目录权限
当用户已存在、需在现有目录结构中限制其访问范围时,setfacl 是最直接有效的工具。它不改动属主/属组,也不影响其他用户,只对目标用户生效。
- 先确认文件系统支持 ACL:
mount | grep "$(df . | awk 'NR==2 {print $1}')" | grep acl,输出含acl才可用 - 禁止用户
alice访问/data/project:sudo setfacl -m u:alice:--- /data/project - 若要递归禁止(含子目录和文件):
sudo setfacl -Rm u:alice:--- /data/project - 验证是否生效:
getfacl /data/project,应看到user:alice:---条目 - 注意:ACL 优先于传统权限;
---表示彻底剥夺 r/w/x,包括进入目录和列出内容
用 Chroot 实现 SFTP 用户的完全路径隔离
如果目标是让某用户仅能通过 SFTP 上传下载、且绝不能看到系统其他部分,必须配置 OpenSSH 的 chroot 环境。这不是改权限就能解决的,而是构造一个“虚拟根目录”。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
目录结构必须合规:chroot 路径(如
/sftp/bob)及其所有上级目录(/sftp、/)属主必须是root:root,权限不能有 group/other 写位(即755或750,不可是775) -
用户真实可写区要放在 chroot 内部:比如
/sftp/bob/upload,再sudo chown bob:bob /sftp/bob/upload并设755 -
sshd_config 配置要点:取消旧 sftp-server 行;启用
Subsystem sftp internal-sftp;在文件末尾添加Match User bob块,并包含ChrootDirectory /sftp/%u、ForceCommand internal-sftp、X11Forwarding no、AllowTcpForwarding no - 用户 shell 必须设为
/sbin/nologin,但仅靠这个不够——ForceCommand才是真正拦截 SSH 登录的关键
用专用属组 + 标准权限做基础隔离
这是最轻量、最易维护的第一道防线,适合团队内多人共享一个项目目录但需互相隔离的场景。
- 创建专用组:
sudo groupadd project-team - 把允许访问的用户加入该组:
sudo usermod -aG project-team alice、sudo usermod -aG project-team bob - 设置目录属组与权限:
sudo chown root:project-team /srv/project,再sudo chmod 770 /srv/project - 这样,只有
root和project-team成员能进,其他用户(包括未加组的新用户)默认无任何权限 - 若后续要禁某个组内成员,再叠加 ACL 即可,互不干扰
避免常见踩坑点
很多失败不是因为命令写错,而是忽略了底层约束。
-
别在系统目录(如
/etc、/var/log)上乱设 ACL 或 chroot,可能破坏服务启动 -
不要用
setfacl -b清空所有 ACL,除非你清楚当前有哪些规则;误删可能让协作中断 -
修改
sshd_config后务必先运行sudo sshd -t校验语法,再sudo systemctl restart sshd -
测试时一定要用目标用户身份切换验证:
sudo su - bob -s /bin/bash或用 FileZilla 连 SFTP,不能只看命令返回成功 - SELinux 启用时(如 RHEL/CentOS),SFTP chroot 可能报
500 OOPS,需执行sudo setsebool -P ftpd_disable_trans 1










