在 Ubuntu 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能跳出目录),通常使用 OpenSSH 的 internal-sftp + Chroot 方式。下面是最常见、最稳妥的做法。
假设:
sftpuser/data/sftp/sftpusersudo mkdir -p /data/sftp/sftpuser
sudo useradd -m -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
-s /usr/sbin/nologin禁止 SSH 登录
Chroot 目录必须归 root 所有,且其他用户不可写
sudo chown root:root /data/sftp
sudo chmod 755 /data/sftp
sudo chown root:root /data/sftp/sftpuser
sudo chmod 755 /data/sftp/sftpuser
如果你想让用户能上传文件,需要再建一个子目录:
sudo mkdir /data/sftp/sftpuser/upload
sudo chown sftpuser:sftpuser /data/sftp/sftpuser/upload
编辑配置文件:
sudo nano /etc/ssh/sshd_config
# Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
如果有多个用户,可以用组:
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
sudo systemctl restart ssh
sftp sftpuser@服务器IP
✅ 成功限制在该目录
❌ 无法 cd / 或 SSH 登录
fatal: bad ownership or modes for chroot
原因:Chroot 目录不是 root 拥有,或权限太大
解决:确保 /data/sftp/sftpuser 是 root:root,权限 755
upload)中写sftpMatch Group sftp如果你告诉我:
我可以给你更精确的配置。