Ubuntu SFTP如何配置才能更安全
小樊
37
2025-12-11 03:55:18
Ubuntu SFTP 安全配置实践
一 基础安全配置
- 安装并启用 OpenSSH 服务,确保开机自启与运行状态:sudo apt update && sudo apt install -y openssh-server;sudo systemctl enable --now ssh。
- 使用internal-sftp 子系统并禁用不安全功能:在 /etc/ssh/sshd_config 中设置 Subsystem sftp internal-sftp;对 SFTP 用户组应用 Match 段,开启 ForceCommand internal-sftp,关闭 AllowTcpForwarding no / X11Forwarding no / PermitTunnel no。
- 采用密钥认证优先:启用 PubkeyAuthentication yes,在测试通过后关闭 PasswordAuthentication no,并禁用 ChallengeResponseAuthentication no,减少暴力破解面。
- 做好目录与权限:Chroot 根目录必须由 root:root 拥有且权限为 755;可写目录放在根目录下并归属相应用户,例如:/sftp 为根,/sftp/uploads 为用户可写目录,权限 700/755 合理设置。
- 重启使配置生效:sudo systemctl restart ssh。
以上做法兼顾隔离、最小权限与抗攻击性,是 Ubuntu 上 SFTP 的推荐基线。
二 用户与目录隔离
- 创建专用用户组与受限用户:sudo groupadd sftpusers;sudo useradd -g sftpusers -s /usr/sbin/nologin sftpuser(禁止 shell 登录,仅允许 SFTP)。
- 推荐的目录结构与权限:
- 共享根:sudo mkdir -p /sftp;sudo chown root:root /sftp;sudo chmod 755 /sftp
- 用户可写目录:sudo mkdir -p /sftp/uploads;sudo chown sftpuser:sftpusers /sftp/uploads;sudo chmod 700 /sftp/uploads
- 在 /etc/ssh/sshd_config 对 sftpusers 应用 Match:
- Match Group sftpusers
- ChrootDirectory /sftp
- ForceCommand internal-sftp -d /uploads(登录直接进入 uploads)
- AllowTcpForwarding no;X11Forwarding no;PermitTunnel no
- 常见报错与要点:
- “bad ownership or modes for chroot directory” → Chroot 根目录必须 root:root 且 755
- 登录后无法上传 → 需在 Chroot 下创建可写子目录并正确授权
- 登录后目录为空 → 使用 -d 指定默认目录
上述隔离能限制用户活动范围,避免越权访问系统其他路径。
三 认证与访问控制
- 强制SSH 公钥登录:客户端生成密钥(推荐 ed25519 或 4096-bit RSA),将公钥写入相应用户的 authorized_keys(如 /home/sftpuser/.ssh/authorized_keys 或按 Chroot 位置调整),并设置权限 700/.ssh、600/authorized_keys,所有者为相应用户。
- 禁用密码与交互式认证:在全局或 Match 段设置 PasswordAuthentication no、ChallengeResponseAuthentication no,仅保留 PubkeyAuthentication yes。
- 精细化访问控制:
- 按用户/组限制:使用 Match User/Group 分别下发 Chroot、ForceCommand、端口转发策略
- 管理员与普通 SFTP 用户分离:为管理员保留 shell 与必要转发,对 SFTP 用户严格限制
- 可选密钥集中管理:在 Match 中使用 AuthorizedKeysFile /sftp/%u/.ssh/authorized_keys 将公钥随用户目录管理
- 防火墙与来源限制:仅开放 22/TCP,如使用 ufw 执行 sudo ufw allow 22/tcp;生产环境建议进一步限制为可信 IP/网段访问。
四 加固与运维
- 保持系统与软件包更新:定期执行 sudo apt update && sudo apt upgrade,及时修补 OpenSSH 漏洞。
- 启用日志与审计:监控 /var/log/auth.log 的 SFTP 登录与失败尝试,必要时对接集中日志平台进行告警。
- 避免端口转发与隧道:保持 AllowTcpForwarding no / PermitTunnel no,降低被滥用的风险。
- 分阶段变更与回滚预案:先备份 /etc/ssh/sshd_config,变更后用 sshd -t 检查语法,另开终端验证登录后再关闭旧会话,确保不会锁死。
- 客户端最佳实践:使用 ed25519 密钥、禁用口令、配置连接空闲超时、仅使用 sftp 命令而非开放 shell。
五 快速最小可用配置示例
- 目标:仅允许 sftpuser 通过密钥登录,Chroot 到 /sftp,默认进入 /uploads,禁止转发与 shell。
- 步骤:
- 创建用户与目录
- sudo groupadd sftpusers
- sudo useradd -g sftpusers -s /usr/sbin/nologin sftpuser
- 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
- 配置公钥(客户端执行 ssh-keygen -t ed25519,将公钥内容追加到服务器)
- mkdir -p /home/sftpuser/.ssh
- echo “公钥内容” | sudo tee /home/sftpuser/.ssh/authorized_keys
- sudo chmod 700 /home/sftpuser/.ssh && sudo chmod 600 /home/sftpuser/.ssh/authorized_keys
- sudo chown -R sftpuser:sftpusers /home/sftpuser/.ssh
- 配置 /etc/ssh/sshd_config(确保全局有 Subsystem sftp internal-sftp)
- Match User sftpuser
- ChrootDirectory /sftp
- ForceCommand internal-sftp -d /uploads
- AllowTcpForwarding no;X11Forwarding no;PermitTunnel no
- PasswordAuthentication no;PubkeyAuthentication yes
- 语法检查与重启
- sudo sshd -t && sudo systemctl restart ssh
- 测试
- sftp -P 22 sftpuser@your_server_ip
以上示例集成了隔离、最小权限与密钥认证,适合作为生产环境的安全基线。