在 Ubuntu 上限制 SFTP 用户(通常指:只能 SFTP,不能 SSH 登录;只能访问指定目录,不能越权),最常用、最安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot。
下面从最常用方案到进阶限制给你讲清楚。
sudo adduser sftpuser
(不建议给 shell,后面会改)
sudo mkdir -p /sftp/sftpuser
sudo chown root:root /sftp/sftpuser
sudo chmod 755 /sftp/sftpuser
存放文件的子目录(用户可写):
sudo mkdir /sftp/sftpuser/upload
sudo chown sftpuser:sftpuser /sftp/sftpuser/upload
sudo usermod -s /usr/sbin/nologin sftpuser
编辑:
sudo nano /etc/ssh/sshd_config
在文件末尾添加:
Match User sftpuser
ChrootDirectory /sftp/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
如果有多个用户:
Match Group sftp
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
(需要先 sudo groupadd sftp 并 usermod -aG sftp user)
sudo systemctl restart ssh
测试:
sftp sftpuser@服务器IP
✅ 只能 SFTP
❌ 不能 SSH
❌ 不能访问 /
sudo groupadd sftp
sudo usermod -aG sftp user1
sudo usermod -aG sftp user2
目录结构:
/sftp/user1
/sftp/user2
sshd_config:
Match Group sftp
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
只允许某个 IP 使用 SFTP:
Match User sftpuser
ChrootDirectory /sftp/sftpuser
ForceCommand internal-sftp
AllowUsers sftpuser@192.168.1.100
或在防火墙层限制 22 端口。
目录权限规则(非常重要):
错误示例(会登录失败):
chown sftpuser /sftp/sftpuser # ❌
如果你只想:
那就需要 第三方 SFTP 服务(如 ProFTPD + SFTP) 或 OverlayFS / 只读挂载,OpenSSH 本身不支持细粒度命令限制。
| 问题 | 原因 |
|---|---|
broken pipe |
Chroot 目录不是 root 拥有 |
| 能 SSH | 没设置 nologin |
| 能跳出目录 | 没用 internal-sftp |
| 登录慢 | DNS 反向解析 |
internal-sftp + Chroot + nologin = 标准 SFTP 限制方案
如果你愿意,我可以:
你现在是 单用户还是多用户?服务器是公网还是内网?