问题现象
启用或修改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 3Refused user xxxx for service sshdPAM 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权限的普通用户)可以登录实例,否则无法修改配置文件。
问题定位
使用管理员账户通过VNC连接登录ECS实例。
访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。
进入目标实例详情页,单击远程连接,选择通过VNC远程连接。输入账号和密码,登录ECS实例。
检查认证日志,定位关键错误信息。
账户因失败尝试被锁定:若日志包含
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/securePAM模块文件缺失:若日志包含
PAM unable to dlopen和No such file or directory,说明系统引用的PAM模块文件(如pam_lastlog.so)缺失,需修复缺失的PAM模块。sudo grep -i "unable to dlopen" /var/log/secure
解除账户锁定
检查用户的失败登录次数。
将<username>替换为登录失败的用户名。
sudo sudo pam_tally2 -u <username>若输出的失败次数大于0,则表示账户被锁定。
解锁账户。
sudo pam_tally2 -u <username> -r永久修复(可选)。
如需禁用锁定策略,可编辑
/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。重新登录实例,验证登录是否正常。
解除UID限制
定位配置文件。
查找包含
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/检查并修改配置。
sudo vim /etc/pam.d/sshd对每个包含
auth required pam_succeed_if.so uid >= 1000的文件,在其前面添加 # 号注释对应行。# auth required pam_succeed_if.so uid >= 1000重新登录实例,验证登录是否正常。
解除用户黑白名单限制
定位配置文件。
查找包含
pam_listfile的配置文件,如/etc/pam.d/sshd、/etc/pam.d/login或/etc/pam.d/system-auth。sudo grep -r "pam_listfile" /etc/pam.d/检查配置。
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根据配置类型修改配置文件。
白名单:在文件末尾添加用户名,每行一个用户,保存退出。
sudo vim /etc/ssh/whitelist黑名单:删除包含目标用户名的行,保存退出。
sudo vim /etc/ssh/blacklist
重新登录实例,验证登录是否正常。
修复缺失的PAM模块
定位缺失模块所属的软件包。
诊断报告或系统日志中会给出缺失模块的路径(如
/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"命令查询模块所属的软件包。重装软件包,恢复缺失的模块文件。
将命令中的
pam替换为上一步查询到的软件包名称。sudo dnf reinstall pam -y使用yum作为包管理器的系统(如CentOS 7),请将上述命令中的
dnf替换为yum。验证模块已恢复。
ls -l /usr/lib64/security/pam_lastlog.so若输出显示模块文件已存在,表示修复完成。
重新登录实例,验证登录是否正常。
修复完成后,实例健康诊断可能仍会基于修复前产生的历史错误日志检出该问题,请等待一段时间后重新诊断。