如何处理因PAM配置错误导致的Linux实例登录失败

更新时间:
复制 MD 格式

问题现象

启用或修改Linux系统的PAM(Pluggable Authentication Modules)模块配置后,或PAM模块文件缺失时,在系统日志/var/log/secure中,出现以下任一错误会导致无法登录:

  • requirement "uid >= 1000" not met by user "xxxx"

  • user xxxx (0) has 5 failed attempts, failed attempts threshold is 3

  • Refused user xxxx for service sshd

  • PAM unable to dlopen(/usr/lib64/security/pam_lastlog.so): /usr/lib64/security/pam_lastlog.so: cannot open shared object file: No such file or directory

解决方案

重要

请确保至少有一个管理员账户(root用户或其他拥有sudo权限的普通用户)可以登录实例,否则无法修改配置文件。

问题定位

  1. 使用管理员账户通过VNC连接登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过VNC远程连接。输入账号和密码,登录ECS实例。

  2. 检查认证日志,定位关键错误信息。

    • 账户因失败尝试被锁定:若日志包含Maximum amount of failed attempts was reached,说明配置了连续密码错误后锁定用户账户,需解除账户锁定。

      sudo grep -i "Maximum amount of failed attempts" /var/log/secure
    • 用户登录权限被限制:若日志包含requirement "uid >= 1000" not met by user ,说明配置了禁止UID小于1000的用户登录,需解除UID限制。

      sudo grep -i "not met by user" /var/log/secure
    • 用户被列入黑名单:若日志包含Refused user,说明配置了黑白名单文件控制用户访问,目标用户可能被显式拒绝或未被列入白名单,需解除用户黑白名单限制。

      sudo grep -i "Refused user" /var/log/secure
    • PAM模块文件缺失:若日志包含PAM unable to dlopen和No such file or directory,说明系统引用的PAM模块文件(如pam_lastlog.so)缺失,需修复缺失的PAM模块。

      sudo grep -i "unable to dlopen" /var/log/secure

解除账户锁定

  1. 检查用户的失败登录次数。

    将<username>替换为登录失败的用户名。

    sudo sudo pam_tally2 -u <username>

    若输出的失败次数大于0,则表示账户被锁定。

  2. 解锁账户。

    sudo pam_tally2 -u <username> -r
  3. 永久修复(可选)。

    如需禁用锁定策略,可编辑/etc/pam.d/system-auth文件,注释包含pam_tally2.so 的规则。

    sudo vim /etc/pam.d/system-auth

    如下配置,表示普通用户和root用户连续三次输入错误密码会被锁定,50秒后解锁。

    auth required pam_tally2.so deny=3 unlock_time=50  
    上述使用的是pam_tally2模块,不同的PAM版本,设置模块有所不同,请参见Linux PAM SAG。
  4. 重新登录实例,验证登录是否正常。

解除UID限制

  1. 定位配置文件。

    查找包含pam_succeed_if的配置文件,如/etc/pam.d/sshd、/etc/pam.d/login或/etc/pam.d/system-auth。

    sudo grep -r "pam_succeed_if" /etc/pam.d/
  2. 检查并修改配置。

    sudo vim /etc/pam.d/sshd

    对每个包含auth required pam_succeed_if.so uid >= 1000的文件,在其前面添加 # 号注释对应行。

    # auth required pam_succeed_if.so uid >= 1000
  3. 重新登录实例,验证登录是否正常。

解除用户黑白名单限制

  1. 定位配置文件。

    查找包含pam_listfile的配置文件,如/etc/pam.d/sshd、/etc/pam.d/login或/etc/pam.d/system-auth。

    sudo grep -r "pam_listfile" /etc/pam.d/
  2. 检查配置。

    sudo vim /etc/pam.d/sshd

    查看匹配的配置行,确认是白名单 (sense=allow) 还是黑名单 (sense=deny),并找到名单文件路径(如/etc/ssh/whitelist或/etc/ssh/blacklist)。

    # 设置了访问白名单,仅允许白名单用户允许登录
    auth required pam_listfile.so item=user sense=allow file=/etc/ssh/whitelist onerr=fail
    
    # 设置了访问黑名单,禁止黑名单用户登录
    auth required pam_listfile.so item=user sense=deny  file=/etc/ssh/blacklist onerr=fail
  3. 根据配置类型修改配置文件。

    • 白名单:在文件末尾添加用户名,每行一个用户,保存退出。

      sudo vim /etc/ssh/whitelist
    • 黑名单:删除包含目标用户名的行,保存退出。

      sudo vim /etc/ssh/blacklist
  4. 重新登录实例,验证登录是否正常。

修复缺失的PAM模块

  1. 定位缺失模块所属的软件包。

    诊断报告或系统日志中会给出缺失模块的路径(如/usr/lib64/security/pam_lastlog.so)。执行以下命令查询该文件所属的软件包。即使模块文件已丢失,rpm -qf命令仍可基于RPM数据库查询到归属软件包。

    rpm -qf /usr/lib64/security/pam_lastlog.so

    示例输出如下,表示该模块属于pam软件包。

    pam-1.3.1-39.1.al8.x86_64

    您也可以执行dnf provides "*/pam_lastlog.so"命令查询模块所属的软件包。

  2. 重装软件包,恢复缺失的模块文件。

    将命令中的pam替换为上一步查询到的软件包名称。

    sudo dnf reinstall pam -y

    使用yum作为包管理器的系统(如CentOS 7),请将上述命令中的dnf替换为yum。

  3. 验证模块已恢复。

    ls -l /usr/lib64/security/pam_lastlog.so

    若输出显示模块文件已存在,表示修复完成。

  4. 重新登录实例,验证登录是否正常。

说明

修复完成后,实例健康诊断可能仍会基于修复前产生的历史错误日志检出该问题,请等待一段时间后重新诊断。