要让特定用户只能通过sftp访问linux系统,需配置openssh的chrootdirectory与internal-sftp子系统,禁用交互式shell、强制sftp会话、构建合规chroot环境并严格设置目录权限。

要让特定用户只能通过SFTP访问Linux系统(即禁止SSH登录、Shell交互、文件系统遍历等),核心是配置OpenSSH的ChrootDirectory与受限子系统,配合严格的权限控制。这不是简单禁用Shell就能实现的——SFTP本身运行在SSH协议之上,必须在SSH服务层面做隔离。
1. 创建专用SFTP用户并禁用交互式Shell
先创建用户,并指定不可登录的shell(如/usr/sbin/nologin或/bin/false),同时不分配家目录(后续由chroot路径替代):
sudo useradd -m -s /usr/sbin/nologin -d /sftp/john john echo "john:password123" | sudo chpasswd
注意:-d指定的初始家目录只是占位,实际SFTP根目录由ChrootDirectory决定,且该路径不能由用户可写(否则OpenSSH拒绝启动chroot)。
2. 配置SSH强制SFTP+Chroot(修改 /etc/ssh/sshd_config)
在sshd_config末尾添加以下段落(务必放在Subsystem sftp之后、全局Match之前):
# 禁用默认sftp子系统(可选,避免冲突) # Subsystem sftp /usr/lib/openssh/sftp-server <h1>启用内建sftp服务器(更安全、支持ForceCommand)</h1><p>Subsystem sftp internal-sftp</p><p>Match User john X11Forwarding no AllowTcpForwarding no PermitTTY no ForceCommand internal-sftp ChrootDirectory /sftp/%u</p><h1>可选:限制仅允许SFTP协议(拒绝scp/rsync等)</h1><pre class="brush:php;toolbar:false;"># AllowAgentForwarding no
关键点:
-
ChrootDirectory /sftp/%u:路径必须存在,且属主为root,权限为755(不能有写权限给组/其他); -
internal-sftp是OpenSSH内置SFTP服务器,比外部sftp-server更可控; -
ForceCommand确保即使用户尝试SSH连接,也强制进入SFTP会话,无法执行命令; -
PermitTTY no和AllowTcpForwarding no进一步封堵逃逸通道。
3. 构建合规的Chroot环境
chroot路径本身不能由用户写入,但用户需要上传/管理文件,因此需在其下创建可写子目录:
sudo mkdir -p /sftp/john/upload sudo chown root:root /sftp/john sudo chmod 755 /sftp/john sudo chown john:sftpusers /sftp/john/upload sudo chmod 755 /sftp/john/upload # 或 775(若需组协作)
说明:
-
/sftp/john必须由root拥有、不可被用户写入(否则sshd拒绝chroot); - 所有用户文件操作只能发生在其子目录(如
upload)中; - 若需多用户共用组权限,可创建
sftpusers组,将用户加入,并设置对应目录GID + SGID位。
4. 重启服务并验证
完成配置后,重载SSH服务:
sudo systemctl restart sshd
验证方式:
- 用
sftp john@your-server能正常登录并列出upload目录; - 用
ssh john@your-server应直接退出(或提示“Connection closed”); - 尝试
scp或rsync上传文件到/路径会失败(被chroot拦截); - 检查
journalctl -u sshd -f可捕获chroot权限错误(常见于目录权限不对)。
不复杂但容易忽略:每一步的权限和属主都必须严格匹配OpenSSH的chroot安全要求,否则服务不会报错,但用户会卡在认证后立即断开。










