必须将ChrootDirectory及其所有父目录设为root:root且权限755,用户可写目录需建于chroot内并属主为用户本人,sshd_config中启用internal-sftp、ForceCommand强制接管、用户shell设为/sbin/nologin。

Linux 限制普通用户通过 SFTP 只能访问特定目录,核心是构建一个安全、合规的 chroot 环境,并强制其使用 internal-sftp 子系统。单纯改 shell 或设家目录是不够的,OpenSSH 会对路径逐级校验,任一环节不满足都会报 “bad ownership or modes” 并拒绝连接。
Chroot 目录权限与属主必须严格合规
OpenSSH 启动 chroot 时,会从系统根目录(/)开始,一路检查 ChrootDirectory 及其所有上级目录(如 /sftp、/sftp/user)的属主和权限:
- 每一级目录(包括 /sftp/user 和它的父目录 /sftp)都必须是 root:root 所有
- 每一级目录权限必须是 755(即 drwxr-xr-x),不能含 group 或 other 的写位(如 775、750、777 都会失败)
- 执行命令示例:
sudo chown -R root:root /sftp /sftp/usersudo chmod 755 /sftp /sftp/user
用户实际可写目录必须放在 chroot 内部
Chroot 根目录(如 /sftp/user)本身不可由用户写入——这是 OpenSSH 的硬性要求。但用户需要上传文件,就得在它下面建子目录并授权:
- 创建子目录:如
sudo mkdir /sftp/user/upload - 该子目录属主设为用户本人:
sudo chown user:user /sftp/user/upload - 权限建议设为 755 或 775(若需组协作),不要用 700(other 无读权限会导致 sftp 进程无法进入)
sshd_config 必须正确启用 internal-sftp 并强制接管
配置必须放在 /etc/ssh/sshd_config 文件末尾,且顺序不能错:
- 确保已启用内建子系统:
Subsystem sftp internal-sftp(注释掉旧的sftp-server行) - Match 块必须包含这四行(缺一不可):
Match User userChrootDirectory /sftp/%uForceCommand internal-sftpAllowTcpForwarding noX11Forwarding no -
ForceCommand internal-sftp是关键——它拦截所有 SSH 连接(包括 ssh user@host),强制只走 SFTP 协议,防止绕过
用户 shell 必须设为 /sbin/nologin
仅靠禁用 shell 不足以阻止逃逸,但它是必要一环:
- 新建用户时指定:
useradd -s /sbin/nologin -M user(-M 表示不创建家目录) - 已有用户修改:
usermod -s /sbin/nologin user - 避免使用
/bin/false,某些 OpenSSH 版本(尤其 8.2 之前)会因此拒绝 SFTP 登录 - 用户密码仍需设置:
passwd user
配置完成后,运行 sudo sshd -t 校验语法,再 sudo systemctl restart sshd 生效。登录失败时查 journalctl -u sshd -n 50,多数问题都出在目录权限或属主上。


















