要让特定用户只能通过SFTP访问Linux系统且无法SSH登录或访问其他目录,需配置Chroot环境并禁用shell:一、创建用户时指定/sbin/nologin shell;二、在sshd_config中启用internal-sftp并用Match User设置ChrootDirectory;三、确保/sftp/john及其上级目录属主为root、权限755,用户可写目录(如/home)在chroot内单独建立并授权;四、重启sshd前用sshd -t校验配置,通过auth.log排查权限类错误。

要让特定用户只能通过SFTP访问Linux系统,且无法执行SSH命令行登录或访问其他目录,核心是配置Chroot(根目录隔离)环境,并禁用shell交互能力。这不是简单改个shell路径就能完成的,必须配合OpenSSH的Match规则、严格的目录权限和正确的文件结构。
一、创建专用SFTP用户并禁用交互式登录
使用/sbin/nologin或/usr/sbin/nologin作为登录shell,确保该用户无法启动任何shell会话:
-
添加用户时指定chroot主目录和无登录shell:
sudo useradd -m -d /sftp/john -s /sbin/nologin john -
设置密码:
sudo passwd john - 注意:不要用/bin/false,部分旧版OpenSSH可能不兼容;优先选/sbin/nologin。
二、配置OpenSSH启用Chroot SFTP(关键步骤)
编辑/etc/ssh/sshd_config,在文件末尾添加以下内容(务必放在Subsystem sftp之后):
- 关闭默认sftp子系统:
#Subsystem sftp /usr/lib/openssh/sftp-server(注释掉) - 启用内建sftp服务器并限制用户组:
Subsystem sftp internal-sftp - 匹配目标用户(如john)并强制chroot:
Match User john<br> ChrootDirectory /sftp/%u<br> ForceCommand internal-sftp<br> AllowTcpForwarding no<br> X11Forwarding no
- 若需批量控制,可用Match Group sftponly,再将用户加入该组。
三、构建合规的Chroot目录结构与权限
Chroot路径(如/sftp/john)必须满足OpenSSH的严格要求,否则登录会失败:
-
所有上级目录(包括/sftp和/sftp/john)属主必须为root,且不能有群组/其他用户写权限:
sudo chown root:root /sftp /sftp/john<br>sudo chmod 755 /sftp /sftp/john
-
用户实际可写目录需在chroot内单独创建(如/home)并重新授权:
sudo mkdir /sftp/john/home<br>sudo chown john:sftponly /sftp/john/home<br>sudo chmod 755 /sftp/john/home
- 常见错误:/sftp/john本身被设为john所有 → 登录直接拒绝。
四、验证与排错要点
重启服务后测试前,务必检查基础项:
- 运行
sudo sshd -t确认配置语法无误 - 重启服务:
sudo systemctl restart sshd(或service ssh restart) - 从客户端测试:
sftp john@your-server-ip—— 成功即进入/home(实际是chroot后的根) - 若报错“Write failed: Broken pipe”或“Connection closed”,90%是Chroot目录权限不合规,重点复查/sftp和/sftp/john的属主与权限
- 日志查看:
sudo tail -f /var/log/auth.log | grep sshd,可快速定位拒绝原因


















