在 Debian 上安全配置 SFTP 的实操指南
一 基础安装与最小加固
- 安装 OpenSSH 服务并设为开机自启:
- sudo apt update && sudo apt install -y openssh-server
- sudo systemctl enable --now ssh
- 备份并编辑 SSH 配置:
- sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- sudo nano /etc/ssh/sshd_config
- 建议的最小安全项(全局段):
- PermitRootLogin no(禁止 root 远程登录)
- PasswordAuthentication no(禁用密码,改用密钥;若必须启用密码,请配合强口令与 Fail2ban)
- PubkeyAuthentication yes
- KbdInteractiveAuthentication no
- UsePAM yes
- MaxAuthTries 3
- MaxSessions 10
- AllowUsers/AllowGroups(按需白名单)
- Port 22(可选变更端口,配合防火墙与合规策略)
- 说明:SFTP 复用 SSH 的 22 端口,无需额外端口。
二 创建 SFTP 用户与目录隔离
- 创建受限用户组与用户:
- sudo groupadd sftpusers
- sudo useradd -m -s /usr/sbin/nologin -G sftpusers sftpuser
- sudo passwd sftpuser(若启用密钥认证,可不设密码)
- 推荐目录结构(集中式 Chroot,便于统一管控):
- sudo mkdir -p /sftp/uploads
- sudo chown root:root /sftp
- sudo chmod 755 /sftp
- sudo chown sftpuser:sftpusers /sftp/uploads
- sudo chmod 700 /sftp/uploads
- 要点:Chroot 根目录必须由 root 拥有且不可被普通用户写入;用户的可写目录应放在根目录下的子目录中,否则会出现 “bad ownership or modes for chroot directory” 或上传报 “permission denied”。
三 配置 SSH 以强制 SFTP 与禁用隧道
- 在 /etc/ssh/sshd_config 的全局段设置内置 SFTP 子系统:
- Subsystem sftp internal-sftp
- 在文件末尾添加对 SFTP 用户组的策略(推荐使用集中式 Chroot):
- Match Group sftpusers
- ChrootDirectory /sftp
- ForceCommand internal-sftp -d /uploads(登录后直接进入可写目录)
- AllowTcpForwarding no
- X11Forwarding no
- PermitTunnel no
- 若需按用户隔离到家目录(使用 %h),务必保证每个用户家目录由 root 拥有且权限为 755,并在其下创建可写子目录再赋权给用户。
- 使配置生效:
- sudo systemctl restart ssh
- 说明:使用 internal-sftp 更安全且便于与 Chroot 配合;禁用端口转发、隧道与 X11 转发可减少攻击面。
四 防火墙与入侵防护
- UFW(Debian 常用):
- 仅开放 22 端口:sudo ufw allow 22
- 或按来源 IP 限制:sudo ufw allow from 192.168.1.100 to any port 22
- 启用:sudo ufw enable;查看:sudo ufw status
- iptables(如需更细粒度控制):
- 允许某 IP 访问 22:sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
- 保存规则(Debian):sudo iptables-save > /etc/iptables/rules.v4
- 防暴力破解:
- 安装并启用 fail2ban:sudo apt install -y fail2ban && sudo systemctl enable --now fail2ban
- 按需配置 /etc/fail2ban/jail.local(SSH 监狱)。
五 密钥认证与连通性测试
- 客户端生成密钥并部署公钥:
- ssh-keygen -t ed25519 -C “sftpuser@client”
- 将公钥内容追加到服务器对应用户的 ~/.ssh/authorized_keys
- 权限:chmod 700 ~/.ssh;chmod 600 ~/.ssh/authorized_keys;chown -R sftpuser:sftpusers ~/.ssh
- 服务端若之前禁用了密码,请确保公钥已就位再重启 ssh。
- 连接测试:
- sftp -P 22 sftpuser@your_server_ip
- 登录后验证工作目录:pwd 应显示 /uploads;测试 put/get 是否正常
- 日志审计:
- 实时查看认证与 SFTP 活动:sudo tail -f /var/log/auth.log
- 常见问题排查:
- 登录失败且提示 “bad ownership or modes for chroot directory” → Chroot 根目录非 root 拥有或权限过宽
- 能登录但无法上传 → 可写子目录未正确赋权或未在 ForceCommand internal-sftp -d 中指定
- 修改配置后无法连接 → 检查语法(sshd -t)、端口与防火墙策略,必要时回滚到备份配置。