温馨提示×

SFTP配置错误怎么排查Debian

小樊
37
2025-11-16 08:17:02
栏目: 智能运维

Debian SFTP配置错误排查清单

一 快速自检

  • 确认 SSH 服务已运行并开机自启:sudo systemctl status ssh,若未运行执行 sudo systemctl start ssh && sudo systemctl enable ssh
  • 校验配置语法并应用:sudo sshd -t && sudo systemctl restart ssh(Debian 上服务名为 ssh,某些教程写作 sshd)。
  • 查看实时日志定位问题:sudo tail -f /var/log/auth.logsudo tail -f /var/log/syslog,或使用 sudo journalctl -u ssh -f
  • 如启用防火墙,放行 22 端口:sudo ufw statussudo ufw allow 22(或对应防火墙工具)。
  • 若系统启用 AppArmor,检查是否被策略拦截:grep -i apparmor /var/log/syslog,必要时查看 /var/log/audit/audit.log
  • 客户端快速连通性测试:sftp -P 22 用户名@服务器IP,观察报错关键词(如 permission denied、connection closed、timeout)。

二 配置文件关键点

  • 确认 Subsystem sftp 行正确:使用内置更高效与安全,推荐 Subsystem sftp internal-sftp;如使用外部程序,路径需存在(常见为 /usr/lib/openssh/sftp-server,可用 find /usr -name sftp-server 2>/dev/null 确认)。
  • 使用 Chroot 限制目录时,推荐在 Match 段内设置:ChrootDirectory %h(或指定目录),并配合 ForceCommand internal-sftpX11Forwarding noAllowTcpForwarding noPermitTTY no
  • 典型最小可用示例(放到文件末尾,注意 Match 块缩进):
    Subsystem sftp internal-sftp
    
    Match Group sftp_users
        ChrootDirectory %h
        ForceCommand internal-sftp
        X11Forwarding no
        AllowTcpForwarding no
        PermitTTY no
    
  • 修改后务必执行:sudo sshd -t && sudo systemctl restart ssh

三 权限与目录结构

  • 使用 ChrootDirectory %h 时,用户的家目录(如 /home/用户名)及其上级目录必须归 root:root 且权限为 755,否则 internal-sftp 会拒绝登录。
  • 为用户创建可写目录(如上传目录),并归属相应用户/组,例如:
    sudo mkdir -p /home/用户名/upload
    sudo chown 用户名:用户名 /home/用户名/upload
    sudo chmod 755 /home/用户名/upload
    
  • 若需将用户限制到自定义目录(如 /sftp/www-data),该目录及其父目录必须归 root:root 755,可写子目录再交给业务用户:
    sudo mkdir -p /sftp/www-data/website_files
    sudo chown root:root /sftp/www-data
    sudo chmod 755 /sftp/www-data
    sudo chown www-data:www-data /sftp/www-data/website_files
    sudo chmod 755 /sftp/www-data/website_files
    
  • 禁止 Shell 登录(可选,更安全):sudo usermod -s /sbin/nologin 用户名

四 常见报错对照与处理

症状 高频原因 快速修复
Authentication failed 密码错误、用户未在目标组、密钥/密码方式不匹配 核对密码或配置密钥;确认用户属于 sftp_users;必要时允许密码或配置公钥登录
Connection closed by remote host ChrootDirectory 或上级目录权限/属主不对(非 root:root 755) 将家目录及上级目录改为 root:root 755,可写目录单独赋权给用户
Permission denied 用户家目录/上传目录权限过宽或属主错误 家目录 755 且 root:root;上传目录属主给对应用户,权限 755/750
Connection timeout / No route to host 防火墙/安全组未放行 22,或网络不通 放行 22 端口;检查云安全组/本机防火墙;测试网络连通
Couldn’t stat remote file: Permission denied 上传目录不可写或父目录权限问题 确认可写目录属主正确且权限合适(如 755/750
subsystem request failed on channel 0 Subsystem sftp 行错误或路径不存在 改为 internal-sftp 或修正 /usr/lib/openssh/sftp-server 路径
Address already in use 22 端口被占用 检查端口占用 `ss -ltnp

五 验证与回归测试

  • 语法与配置回归:sudo sshd -t 无输出即为通过;再 sudo systemctl restart ssh
  • 连接与目录限制验证:sftp -P 22 用户名@服务器IP,登录后 pwd 应显示 /(即 Chroot 根),执行 cd .. 应失败;在可写目录尝试上传/下载验证权限。
  • 日志复核:sudo tail -n 50 /var/log/auth.log 关注 Accepted/Failed、subsystem、chroot 等关键日志行。
  • 安全建议:为 SFTP 用户启用 SSH 密钥登录、禁用密码;按需限制端口转发与 TTY;定期审计日志与目录权限。

0