1 问题背景
时间:2023 年 12 月 11 日
需求:使用 x2openEuler 工具完成从 CentOS 7.6 到 openEuler 22.03 LTS SP1 的升级后,在终端界面登陆时出现登录失败的报错,但可以使用 SSH 远程登录系统,如下图所示

2 问题分析及复现
2.1 问题分析
在排除了密码输入错误等因素后,使用 SSH 远程登录系统,查看 /var/log/secure 日志,内容如下

从日志可以看出,在登录系统时,要进行 PAM 认证,但是找不到认证需要的 pam_tally2.so 库文件,导致认证失败而拒绝登录
执行 grep -r pam_tally2.so /etc/pam.d 命令,查看哪个配置文件在调用这个库文件

从查询结果可以看到,/etc/pam.d/system-auth 这个配置文件调用此库文件
然而在全新安装的 openEuler 22.03 LTS SP1 操作系统中,查看这个配置文件发现调用的是 pam_faillock.so 这个库文件

查阅资料后得知,新的 pam 认证软件包弃用了 pam_tally2 模块,而是采用 pam_faillock 模块,那么出现了一个问题:在升级到 openEuler 22.03 LTS SP1 操作系统后,对应的 pam 软件包也被升级了,但是怎么还使用了旧版本的模块呢?
查看 /etc/pam.d 目录下的所有文件,出现了名为 system-suth.rpmsave 的文件,查看此文件的内容,发现在升级前配置过连续登录失败锁定用户的安全加固项,在升级系统生成新配置文件时,引用了错误的库文件

为什么会出现
*.rpmsave文件呢?这是由构建 RPM 包时的 SEPC 文件决定的。若使用了
%config关键字标记了配置文件,表示在升级 rpm 包时,若旧配置文件没有被修改过,那么使用新配置文件覆盖旧配置文件,旧配置文件被删除;若旧配置文件被修改过,那么仍然使用新配置文件覆盖旧配置文件,但旧配置文件会以*.rpmsave的形式保留下来
2.2 问题复现
2.2.1 准备工作
准备如下表所示的机器
| 版本号 | 用途 | |
|---|---|---|
| 源操作系统 | CentOS 7.6 | 配置安全加固项后升级 |
| 目标操作系统 | openEuler 22.03 LTS SP1 | 使用终端登录验证 |
2.2.2 源操作系统配置
(1)配置连续登录失败锁定账户的安全加固项
# 配置连续登录失败锁定账户的安全加固项
$ sed -i '/#%PAM-1.0/a auth \t required \t pam_tally2.so deny=3 lock_time=30 even_deny_root root_unlock_time=30 per_user reset' /etc/pam.d/system-auth
参数说明:
pam_tally2.so 使用 pam_tally2.so 模块,不同 pam 版本调用的模块可能不同
deny=3 用户连续输入错误密码的次数
lock_time=300 普通用户连续输入错误密码后锁定时间,单位:秒
even_deny_root 对 root 用户生效
root_unlock_time=30 root 用户连续输入错误密码后锁定时间,单位:秒
per_user reset 解锁时间到了以后,清除用户锁定状态重启操作系统,连续三次输入错误密码,查看配置是否生效

# 查看 root 用户登录失败记录
$ pam_tally2 --user root
Login Failures Latest failure From
root 2 12/27/23 10:30:30 tty1(2)使用 x2openEuler 工具升级到目标操作系统

2.2.3 目标操作系统验证
在 tty 终端登录系统报错

使用 SSH 远程登录后,查看 /var/log/secure 日志
# 查看 /var/log/secure 日志
$ vim /var/log/secure
......
Dec 27 11:23:37 localhost login[5251]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: cannot open shared object file: No such file or directory
Dec 27 11:23:37 localhost login[5251]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Dec 27 11:23:41 localhost login[5251]: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 27 11:23:43 localhost login[5251]: FAILED LOGIN SESSION FROM tty1 FOR root, Module is unknown报错内容与生产环境一致,成功复现了问题
3 解决措施
3.1 如何临时补救
共有两种临时补救方案,详见下文
3.1.1 补全缺失的库文件
补救思路:根据报错内容,从备份目录 /.osbak 中找到缺失的库文件,然后将库文件复制到当前操作系统的对应目录
存在问题:因为新版本不再使用这个库文件,人为复制过来调用,会造成额外的资源消耗,并且在以后升级该软件包时也会遇到一些问题,治标不治本
操作流程:
# 查看 /var/log/secure 日志
$ vim /var/log/secure
......
Dec 27 11:23:37 localhost login[5251]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: cannot open shared object file: No such file or directory
Dec 27 11:23:37 localhost login[5251]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Dec 27 11:23:41 localhost login[5251]: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 27 11:23:43 localhost login[5251]: FAILED LOGIN SESSION FROM tty1 FOR root, Module is unknown
# 查找缺失的库文件
$ find / -name pam_tally2.so
/.osbak/usr/lib64/security/pam_tally2.so
# 复制查找到的库文件到 /usr/lib64/security 目录
$ cp /.osbak/usr/lib64/security/pam_tally2.so /usr/lib64/security/能够成功在 tty 终端登录系统

3.1.2 修改配置文件
补救思路:根据报错内容,查找是哪个配置文件调用了缺失的库文件,然后注释掉配置文件中调用缺失模块的代码
存在问题:相比 3.3.1 中的解决办法,不会造成额外资源消耗,说得上是比较稳妥的处理办法,但是毕竟和新版本的配置文件不同,可能影响后续的配置
操作流程:
# 查看 /var/log/secure 日志
$ vim /var/log/secure
......
Dec 27 11:23:37 localhost login[5251]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: cannot open shared object file: No such file or directory
Dec 27 11:23:37 localhost login[5251]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Dec 27 11:23:41 localhost login[5251]: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 27 11:23:43 localhost login[5251]: FAILED LOGIN SESSION FROM tty1 FOR root, Module is unknown
# 查找缺失的库文件被哪个配置文件调用
$ grep -r pam_tally2.so /etc/pam.d/
/etc/pam.d/system-auth:auth required pam_tally2.so deny=3 lock_time=30 even_deny_root root_unlock_time=30 per_user reset
# 注释或删除相应的代码
$ sed -i '/pam_tally2.so/ s/^/#/' /etc/pam.d/system-auth能够成功在 tty 终端登录系统

3.2 如何完美解决
共有两种临时解决方案,详见下文
3.2.2 使用新配置文件覆盖旧文件
解决思路:根据报错内容,查找是哪个配置文件调用了缺失的库文件,然后查看该配置文件的同级目录下,是否有与该配置文件同名但是后缀为 .rpmnew 的文件,使用 *.rpmnew 文件覆盖旧文件
方案特点:这是软件包升级后根据旧配置文件生成的新配置文件,可以大胆正常使用,但前提是生成了 *.rpmnew 配置文件
操作流程:
# 查看 /var/log/secure 日志
$ vim /var/log/secure
......
Dec 27 11:23:37 localhost login[5251]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: cannot open shared object file: No such file or directory
Dec 27 11:23:37 localhost login[5251]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Dec 27 11:23:41 localhost login[5251]: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 27 11:23:43 localhost login[5251]: FAILED LOGIN SESSION FROM tty1 FOR root, Module is unknown
# 查找缺失的库文件被哪个配置文件调用
$ grep -r pam_tally2.so /etc/pam.d/
/etc/pam.d/system-auth:auth required pam_tally2.so deny=3 lock_time=30 even_deny_root root_unlock_time=30 per_user reset
# 查看 /etc/pam.d 目录下的所有相关文件
$ cd /etc/pam.d
$ ls -l | grep system-auth
-rw-r--r-- 1 root root 1133 12月 27 14:29 system-auth
-rw-r--r--. 1 root root 1031 11月 21 21:10 system-auth-ac
-rw-r--r-- 1 root root 1496 3月 22 2023 system-auth.rpmnew
# 备份旧配置文件
$ mv system-auth system-auth.bak
# 恢复新配置文件
$ cp system-auth.rpmnew system-auth能够成功在 tty 终端登录系统

3.2.1 从 rpm 包中恢复配置文件
解决思路:先查找缺失的库文件被哪个配置文件调用,然后查找这个配置文件来源于哪个软件包,从软件包中恢复该配置文件
方案特点:从 rpm 包中恢复出全新的配置文件,替换旧文件,缺点是需要重新配置安全加固项
操作流程:
(1)安装基础工具
# 安装 yumdownloader 包下载工具
$ yum install -y dnf-plugins-core
# 安装 cpio 备份工具
$ yum install -y cpio(2)恢复配置文件
# 查看 /var/log/secure 日志
$ vim /var/log/secure
......
Dec 27 11:23:37 localhost login[5251]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: cannot open shared object file: No such file or directory
Dec 27 11:23:37 localhost login[5251]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Dec 27 11:23:41 localhost login[5251]: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 27 11:23:43 localhost login[5251]: FAILED LOGIN SESSION FROM tty1 FOR root, Module is unknown
# 查找缺失的库文件被哪个配置文件调用
$ grep -r pam_tally2.so /etc/pam.d/
/etc/pam.d/system-auth:auth required pam_tally2.so deny=3 lock_time=30 even_deny_root root_unlock_time=30 per_user reset
# 查找配置文件来源于哪个 rpm 包
$ rpm -qf /etc/pam.d/system-auth
pam-1.5.2-6.oe2203sp1.x86_64
-------------------------------以下内容在 /root 目录操作-------------------------------
$ cd /root
# 下载查找到的 rpm 包
$ yumdownloader pam-1.5.2-6.oe2203sp1.x86_64
# 查看下载的 rpm 包
$ ls -l pam-1.5.2-6.oe2203sp1.x86_64.rpm
-rw-r--r-- 1 root root 448921 12月 27 14:49 pam-1.5.2-6.oe2203sp1.x86_64.rpm
# 执行以下命令恢复配置文件
$ rpm2cpio pam-1.5.2-6.oe2203sp1.x86_64.rpm | cpio -idv ./etc/pam.d/system-auth
./etc/pam.d/system-auth
4127 块
# 在当前目录下会生成恢复的配置文件
$ ls -l ./etc/pam.d/
总用量 4
-rw-r--r-- 1 root root 1496 12月 27 14:54 system-auth
# 备份旧配置文件
$ mv /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
# 恢复新配置文件
$ cp etc/pam.d/system-auth /etc/pam.d/能够成功在 tty 终端登录系统

评论