CentOS 上 SFTP 配置失败的定位与修复
一、快速自检清单
systemctl status sshd、systemctl enable --now sshd。firewall-cmd --permanent --add-port=22/tcp && firewall-cmd --reload。Subsystem sftp internal-sftp;如需限制用户,使用 Match User/Group ... ForceCommand internal-sftp,并确保该块位于文件末尾(或显式以 Match All 结束)。systemctl restart sshd 并观察是否报错。journalctl -u sshd -xe 或 tail -n50 /var/log/secure。二、常见报错与对应修复
chown sftpuser:sftpuser /datas/www/sftpuser; chmod 755 /datas/www/sftpuser)。Subsystem sftp internal-sftp 放在全局,所有 Match ... 块置于文件末尾,或显式以 Match All 结束;必要时调整顺序避免与全局指令冲突。/sbin/nologin 仅影响 SSH 登录,配合 ForceCommand internal-sftp 仍可 SFTP);确认密码正确、用户属于正确组;若用密钥,确保 ~/.ssh/authorized_keys 权限为 600、目录 700,且公钥内容正确。setenforce 0 验证;生产环境建议保留 SELinux 并启用布尔值:setsebool -P ssh_chroot_rw_homedirs on,或用 semanage fcontext/restorecon 修正目录上下文。三、一个最小可用的 chroot 配置示例
groupadd sftpuseradd -g sftp -s /sbin/nologin sftpuserpasswd sftpusermkdir -p /datas/www/sftpuserchown root:root /datas/wwwchmod 755 /datas/wwwchown sftpuser:sftp /datas/www/sftpuserchmod 755 /datas/www/sftpuser/etc/ssh/sshd_config(全局段保持默认,末尾追加):Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /datas/www
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
systemctl restart sshdsftp sftpuser@your_server_ip四、开启日志与进一步排查
Match 块内加入 LogLevel VERBOSE,重启 sshd,随后在 /var/log/secure 观察认证与会话细节(如 Accepted password、Starting session: forced-command 'internal-sftp')。ForceCommand internal-sftp -l INFO -f local5 的同时,向 /etc/rsyslog.conf 添加 auth,authpriv.*,local5.* /var/log/sftp.log,并重启 rsyslog 与 sshd。telnet your_ip 22)、用户 shell(/etc/passwd)、PAM/SELinux 策略、以及 Match 块位置与语法。