必须将用户shell设为/sbin/nologin并配置SSH强制internal-sftp子系统与chroot隔离:创建用户时指定-s /sbin/nologin,修改sshd_config启用Subsystem sftp internal-sftp,添加Match User块限制ForceCommand、禁用TTY等,且/sftp/alice及其上级目录须root属主、755权限,upload子目录才可写。

要让指定用户只能通过SFTP上传文件、完全无法SSH登录交互式终端,必须绕过shell启动流程,强制其会话进入internal-sftp子系统,并用chroot锁死路径——只改shell为nologin会导致SFTP本身也失败。
创建专用SFTP用户并禁用shell登录
执行命令创建用户,明确指定不可登录shell:
sudo useradd -m -s /sbin/nologin -d /sftp/alice alice
设置密码:
sudo passwd alice
【/sbin/nologin是必须项,不能用/bin/false或/bin/bash】。部分旧版OpenSSH对/bin/false兼容性差;而/bin/bash会直接允许SSH登录,彻底失效。
配置SSH强制SFTP会话与路径隔离
编辑SSH主配置:
sudo nano /etc/ssh/sshd_config
找到Subsystem行,注释掉原有外部sftp-server(避免冲突):
# Subsystem sftp /usr/lib/openssh/sftp-server
在其下方添加启用内建服务的声明:
Subsystem sftp internal-sftp
在文件末尾新增Match块(顺序不能错,必须在Subsystem之后、其他Match之前):
Match User alice
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTTY no
这一步生效的前提是ForceCommand接管整个会话——哪怕用户执行ssh alice@host,也不会出现$提示符,而是直接进入sftp>界面。
构建合规的chroot目录结构
第一步:创建根目录并设为root属主:
sudo mkdir -p /sftp/alice
第二步:严格设置权限与归属:
sudo chown root:root /sftp /sftp/alice
sudo chmod 755 /sftp /sftp/alice
【/sftp/alice及其所有上级目录(含/sftp)必须由root拥有且不可被组/其他用户写入】。若chmod 775或chown alice:alice /sftp/alice,连接将立即被拒绝,auth.log报fatal: bad ownership or modes for chroot directory。
第三步:在chroot内建可写子目录供上传:
sudo mkdir /sftp/alice/upload
sudo chown alice:alice /sftp/alice/upload
sudo chmod 755 /sftp/alice/upload
验证与重启服务
先校验配置语法是否正确:
sudo sshd -t
无报错后重启SSH服务:
sudo systemctl restart sshd
测试SFTP连接:
sftp alice@localhost
成功时应显示sftp>提示符,且执行ls、cd等命令仅限于/sftp/alice/upload可见范围;尝试ssh alice@localhost应直接进入sftp>,不会出现任何shell提示符。


















