在 Ubuntu 上配置 SFTP + Chroot(限制用户只能访问指定目录),通常使用 OpenSSH 内置的 ChrootDirectory 功能,而不是传统的 FTP。下面给你一套完整、可落地、安全的配置步骤。
sftp-serverChrootDirectory 限制用户根目录sudo apt update
sudo apt install openssh-server
检查状态:
systemctl status sshd
sudo useradd -m -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
⚠ Chroot 目录必须属于 root,且权限 ≤ 755
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
用户登录后:
/ → /sftp/sftpuserupload编辑配置文件:
sudo nano /etc/ssh/sshd_config
(通常已有)
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /sftp/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
如果你要 限制一组用户:
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
sudo systemctl restart sshd
sftp sftpuser@服务器IP
登录后:
pwd
# 显示 /
ls
# 只能看到 upload
常见原因:
| 问题 | 原因 |
|---|---|
| chroot 目录不是 root 拥有 | 必须 root:root |
| chroot 目录权限 > 755 | 必须 ≤ 755 |
| 家目录在 chroot 外 | 用户家目录应指向 chroot |
| SELinux | Ubuntu 默认无,除非你启用了 |
查看日志:
sudo journalctl -u sshd -f
PasswordAuthentication no
Match User sftpuser
ChrootDirectory /sftp/sftpuser
ForceCommand internal-sftp
AllowUsers sftpuser
✅ 必须记住的 3 个关键点:
internal-sftp如果你需要:
可以直接告诉我你的使用场景,我可以给你定制方案。