在 Linux 上限制 SFTP 用户,常见目标是:只能使用 SFTP、不能 SSH 登录、只能访问指定目录。下面按最常用、最安全的方式给你一个完整指南。
internal-sftp + ChrootDirectory这是 OpenSSH 官方推荐 的方式,安全、稳定。
/home/sftpuser)useradd -m -s /sbin/nologin sftpuser
passwd sftpuser
-s /sbin/nologin:禁止 SSH 登录
也可用/bin/false
⚠️ ChrootDirectory 必须由 root 拥有,且其他用户不能写
mkdir -p /home/sftpuser/upload
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
chown sftpuser:sftpuser /home/sftpuser/upload
目录结构:
/home/sftpuser/ (root 拥有,755)
└── upload/ (sftpuser 拥有)
编辑:
vim /etc/ssh/sshd_config
确认存在:
Subsystem sftp internal-sftp
在文件末尾添加:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
✅ 说明:
ChrootDirectory:限制根目录ForceCommand internal-sftp:禁止 shellsystemctl restart sshd
# 或
service ssh restart
sftp sftpuser@服务器IP
✅ 成功示例:
sftp> pwd
Remote working directory: /upload
groupadd sftpusers
usermod -aG sftpusers sftpuser
修改 sshd_config:
Match Group sftpusers
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
这样:
sftpusers 组用户自动受限/home/用户名原因:
✅ 正确:
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
解决:
Match User sftpuser
DenyUsers sftpuser
或结合 sshd_config + 防火墙
SSH 本身不支持限速,需系统级实现。
Subsystem sftp internal-sftp -l INFO
查看:
journalctl -u sshd
| 需求 | 实现方式 |
|---|---|
| 禁止 SSH | /sbin/nologin |
| 限制目录 | ChrootDirectory |
| 强制 SFTP | ForceCommand internal-sftp |
| 多用户 | Match Group |
| 安全 | 目录权限必须 root |
如果你愿意,我可以:
直接告诉我你的系统版本和使用场景即可。