提升 Ubuntu 上 SFTP 安全性 的核心思路是:最小权限 + 强认证 + 访问控制 + 审计。下面按“必做 → 推荐 → 进阶”分层说明,并给出可直接使用的配置示例。
不要给 SFTP 用户 shell 权限
sudo groupadd sftpusers
sudo useradd -m -g sftpusers -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
Ubuntu 自带 OpenSSH 即可:
sudo apt update
sudo apt install openssh-server
编辑 SSH 配置:
sudo nano /etc/ssh/sshd_config
在文件末尾添加:
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
创建目录结构(非常关键):
sudo mkdir -p /sftp/sftpuser
sudo chown root:root /sftp/sftpuser
sudo chmod 755 /sftp/sftpuser
sudo mkdir /sftp/sftpuser/upload
sudo chown sftpuser:sftpusers /sftp/sftpuser/upload
✅ ChrootDirectory 必须属于 root,且不能被其他用户写
重启 SSH:
sudo systemctl restart ssh
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
为 sftp 用户配置公钥:
mkdir -p /sftp/sftpuser/.ssh
nano /sftp/sftpuser/.ssh/authorized_keys
chown -R root:root /sftp/sftpuser/.ssh
chmod 700 /sftp/sftpuser/.ssh
chmod 600 /sftp/sftpuser/.ssh/authorized_keys
Port 2222
避免自动化扫描。
AllowUsers sftpuser
sudo apt install fail2ban
SSH 规则默认生效,可自定义:
[sshd]
enabled = true
maxretry = 3
bantime = 3600
sudo ufw allow from 1.2.3.4 to any port 2222
或仅允许公司 IP。
编辑:
Subsystem sftp internal-sftp -l INFO -f AUTH
查看日志:
journalctl -u ssh
或 /var/log/auth.log
KexAlgorithms curve25519-sha256
Ciphers aes256-gcm@openssh.com
MACs hmac-sha2-256
❌ Chroot 目录可写
❌ 给 sftp 用户 /bin/bash
❌ 用 FTP(明文)
❌ 允许 root + 密码登录
| 等级 | 内容 |
|---|---|
| ⭐ | 仅 SFTP + 密码 |
| ⭐⭐ | Chroot + 禁止 shell |
| ⭐⭐⭐ | 密钥登录 + 非 root |
| ⭐⭐⭐⭐ | Fail2ban + 防火墙 |
| ⭐⭐⭐⭐⭐ | 审计 + 限制算法 + IP 白名单 |
如果你愿意,我可以: ✅ 帮你 生成完整 sshd_config ✅ 给你 Docker / 云服务器专用方案 ✅ 帮你 排查 SFTP 无法登录问题
直接告诉我你的使用场景即可。