vsftpd 530 Login incorrect 但密码正确的 PAM/shell 配置坑

9次阅读

530 Login incorrect 根本原因通常是用户 shell 不在 /etc/shells 中或被 PAM 拒绝。需检查用户 shell 是否存在于 /etc/shells、PAM 配置中 pam_shells.so 是否生效、用户是否被锁定、shell 是否为 /sbin/nologin,以及 userlist 是否禁用该用户。

vsftpd 530 Login incorrect 但密码正确的 PAM/shell 配置坑

vsftpd 报 530 Login incorrect 但密码确实正确

这基本不是密码输错了,而是 vsftpd 在 PAM 验证或 shell 权限环节被拦下了。vsftpd 默认只允许 /etc/shells 中列出的 shell 用户登录 FTP,哪怕系统用户密码完全正确,只要其 /bin/bash(或其它 shell)没被显式加入该文件,PAM 就会静默拒绝——不报错原因,只甩个 530 Login incorrect

/etc/shells 必须包含用户 shell

检查用户实际 shell:
getent passwd username | cut -d: -f7
再确认该路径是否出现在 /etc/shells 中:
grep "^/bin/bash$" /etc/shells(替换成你用户的 shell)

如果不在,追加进去:
echo "/bin/bash" | sudo tee -a /etc/shells

  • 不要用 shdash 替代——它们常被默认禁用 FTP 登录
  • 避免写错路径,比如 /usr/bin/bash/bin/bash 是不同路径,必须严格匹配
  • 改完不用重启 vsftpd,PAM 每次认证都实时读取该文件

PAM 配置中 auth [success=ignore default=bad] 的陷阱

vsftpd 默认使用 /etc/pam.d/vsftpd。常见错误是直接复制网上配置,却忽略了这一行:

auth [success=ignore default=bad] pam_shells.so

它的意思是:如果 shell 不合法,立刻标记为 bad,后续所有 auth 规则跳过,最终登录失败。而这个失败在日志里往往只体现为 pam_shells(vsftpd:auth): couldn't open /etc/shells 或干脆无声。

  • 先确认 /etc/shells 文件权限是 644,且 vsftpd 进程能读(非 root 启动时尤其注意)
  • 临时注释掉 pam_shells.so 行,测试能否登录——能则 100% 是 shell 列表问题
  • 别盲目启用 pam_permit.so,它绕过所有验证,仅用于排查

用户被锁定或 shell 被设为 /sbin/nologin 也触发 530

即使密码对、shell 在 /etc/shells 里,以下情况仍会导致 530

  • 用户状态被锁:passwd -S username 显示 LK,需 passwd -u username
  • shell 被设为 /sbin/nologin/bin/false —— 它们虽在 /etc/shells 中(某些发行版默认加了),但 pam_shells.so 会额外拒绝
  • vsftpd 配置启用了 userlist_enable=YES 且用户在 /etc/vsftpd.user_list/etc/vsftpd.ftpusers 中(后者默认拒绝所有 root 和 ftp 等敏感用户)

最省事的排查顺序:查 /var/log/secure/var/log/auth.log,搜索 vsftpd 和用户名,看 PAM 实际拒绝原因——比盲调配置快得多。

text=ZqhQzanResources