vsftpd 530 Login incorrect 但密码正确 的 PAM 与用户 shell 问题

9次阅读

530 Login incorrect 错误主因是PAM认证拦截或用户shell不在/etc/shells中;需检查/etc/pam.d/vsftpd配置、确保shell合法(如添加/bin/false到/etc/shells),并区分系统/虚拟用户模式。

vsftpd 530 Login incorrect 但密码正确 的 PAM 与用户 shell 问题

VSFTPD 报错 530 Login incorrect,但确认用户名密码无误,问题往往出在 PAM 认证流程或用户 shell 限制上。VSFTPD 默认通过 PAM(Pluggable Authentication Modules)验证登录,并严格检查用户 shell 是否在 /etc/shells 中——即使密码正确,shell 不合法也会直接拒绝登录。

PAM 配置导致认证被拦截

VSFTPD 使用 /etc/pam.d/vsftpd 文件控制认证流程。若该文件中包含 auth [Error=ignore] pam_succeed_if.so user = ftp 类规则,或误启用了 pam_deny.sopam_listfile.so 等模块,可能在未比对密码前就拒绝登录。

  • 检查 /etc/pam.d/vsftpd 是否存在语法错误或过于严格的条件判断
  • 临时备份并替换为最小化配置(仅保留必要 auth/account 行),例如:
    auth    [default=ignore]  pam_localuser.so auth    required        pam_unix.so

  • 确保没有启用 pam_shells.so 的重复校验(vsftpd 自身已做 shell 检查,PAM 层再加会冗余且易冲突)

用户 shell 不在 /etc/shells 中

VSFTPD 默认开启 check_shell=YES(编译时默认启用,配置中不显式写出也生效),要求用户 shell 必须存在于 /etc/shells 文件里。常见陷阱是给 FTP 用户设为 /bin/false/usr/sbin/nologin,但这两个路径未被加入 /etc/shells

  • 运行 cat /etc/shells 查看当前允许的 shell 列表
  • 若需禁用用户 ssh 登录但允许 FTP,可将 shell 设为 /bin/bash 并配合 chsh -s /bin/bash username,再用 usermod -s /bin/bash username 确保一致
  • 更安全的做法:添加受限 shell 到 /etc/shells,如执行 echo "/bin/false" >> /etc/shells(注意权限和换行)

系统用户 vs 虚拟用户混淆

若你实际想用虚拟用户(如通过 PAM + mysql 或文本数据库),但 VSFTPD 配置仍走系统用户认证路径,会导致 PAM 尝试查找系统账户失败。此时即使密码匹配虚拟库,PAM 的 pam_unix.so 也会因找不到系统用户而返回失败。

  • 确认 /etc/vsftpd.conf 中是否设置了 guest_enable=YESvirtual_use_local_privs=YES
  • 虚拟用户必须搭配独立的 PAM 配置(如 /etc/pam.d/vsftpd.virtual),并在 vsftpd.conf 中指定 pam_service_name=vsftpd.virtual
  • 避免在虚拟用户模式下混用 local_enable=YES 和系统用户登录,否则认证逻辑会冲突

调试与验证步骤

启用日志后快速定位真实原因:

  • /etc/vsftpd.conf 中添加:
    log_ftp_protocol=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log vsftpd_log_file=/var/log/vsftpd.log

  • 重启服务:systemctl restart vsftpd
  • 尝试登录后查看日志:tail -f /var/log/vsftpd.log,重点关注 “PAM”、“shell”、“auth” 相关提示
  • getent passwd username 确认用户是否存在、shell 字段是否合法、UID/GID 是否有效

text=ZqhQzanResources