SFTP用户受限访问需满足三重约束:目录逐级属主为root且权限≤755;用户shell设为/sbin/nologin;仅启用internal-sftp子系统并禁用高危功能;用户可写目录须在chroot根下单独创建并授权。

限制 SFTP 用户只能访问特定目录,本质是启用 OpenSSH 的 ChrootDirectory 机制,把用户“关进”一个文件系统沙箱。这不是加个路径就能生效的配置,而是一套必须闭环的权限、用户、子系统三重约束体系。
目录所有权与权限必须逐级达标
OpenSSH 在启动 chroot 时,会从根目录(/)开始,一级级检查 ChrootDirectory 路径及其所有父目录(比如 /data、/data/sftp):
- 每一级目录的属主必须是
root:root,不能是普通用户或组 - 每一级目录的权限不能超过
755(即其他用户不可写),常见错误如775、750、带 sticky bit 或 setgid 都会触发fatal: bad ownership or modes - 执行命令示例:
chown -R root:root /data /data/sftp和chmod -R 755 /data /data/sftp
用户账号必须禁用交互式登录
仅靠 ForceCommand internal-sftp 无法阻止用户通过普通 SSH 登录。如果用户 shell 是 /bin/bash,ta 仍可 ssh user@host 进入完整 shell,完全绕过 SFTP 限制:
- 新建用户时指定无登录 shell:
useradd -s /sbin/nologin sftpuser(CentOS/RHEL)或useradd -s /usr/sbin/nologin sftpuser(Debian/Ubuntu) - 已有用户请改用:
usermod -s /sbin/nologin sftpuser - 避免使用
/bin/false或/bin/true,某些旧版 OpenSSH(如 8.2 之前)会因此拒绝 SFTP 连接
必须绑定 internal-sftp 子系统
ChrootDirectory 只与 OpenSSH 内置的 internal-sftp 协同工作,和外部 sftp-server 进程不兼容:
- 确保
/etc/ssh/sshd_config中全局只保留一行:Subsystem sftp internal-sftp,删除或注释掉其他Subsystem sftp行 - 在
Match块中显式启用:ForceCommand internal-sftp - 配套关闭高危功能:
X11Forwarding no、AllowTcpForwarding no、PermitTunnel no
用户实际可写目录需单独授权
ChrootDirectory 根目录本身(如 /data/sftp/sftpuser)必须由 root 拥有且不可写;但用户需要上传文件,就得在其下建子目录并移交控制权:
- 创建子目录:
mkdir /data/sftp/sftpuser/upload - 属主交给用户:
chown sftpuser:sftpuser /data/sftp/sftpuser/upload - 权限设为
755(不是700)——因为 group 和 other 至少要有r-x,SFTP 进程才能进入该目录


















