一、问题现象

现网一台suse11 sp3主机在使用普通用户修改密码时,无法正常修改,使用root用户可以修改用户密码,具体错误日志如下:

passwd-recovered
passwd-recovered

message日志如下:

1Jun 16 11:35:47 ZJHZ-CMREAD-CGTEST17 passwd[16285]: password change failed, pam error 21 - account=bcwap, uid=3954, by=3954
2Jun 16 11:36:29 ZJHZ-CMREAD-CGTEST17 su: (to zabbix) zabbix on /dev/pts/2
3Jun 16 11:36:37 ZJHZ-CMREAD-CGTEST17 passwd[16712]: User zabbix: Authentication information cannot be recovered
4Jun 16 11:36:37 ZJHZ-CMREAD-CGTEST17 passwd[16712]: password change failed, pam error 21 - account=zabbix, uid=6606, by=6606

二、问题分析

从以上报错的日志及密码相关的东西来说,怀疑以下几项:

1、/etc/passwd、/etc/shadow文件设置了特殊权限,导致普通用户passwd执行时无法写入 ---经和其他主机对比,排除;

2、passwd命令特殊权限位被回收或该文件被更改过 ---对于同类主机,也排除该问题;

3、动态链接库so文件异常---通过ldd命令查看,发现所有链接的so库文件都存在,且版本和正常主机的版本一致。同时由于root可以正常修改,这个可能也比较小;

4、新建普通用户,再切到该问题,确认是否可以正常修改---发现新建用户也无法正常修改自己的密码,提示同上;

5、pam文件中有相关策略---可能性最大,因为message日志中有pam error 21的错误 。

跟用户认证相关的几个pam文件有,common-auth、common-password、common-account、common-session、su、sshd ,而第三方安全加固公司在加固时一般会修改前两个文件 。看了下前两个文件,发现使有的几条策略也都是经常用的几条配置,比较密码长度复杂度、失败锁定等。简单尝试修改了两处,发现情况并未解决,且现网大多数机器都加固过,已经没有完全纯净的环境可以对比参考。刚好公司刚新买了SUSE原厂维保,也想试下原厂维保的质量,建单联系了SUSE让其分析该问题。

三、问题解决

原厂的分析思路:

1、基本上也是照我上面说的先看了一遍,未发现明显问题。在pam策略上也注释了两处,发现问题仍旧;

2、使用strace命令进行跟踪,命令如下:

1strace -o /tmp/pw.log -ft su - testuser -c "passwd"

-f 跟踪进程fork的子进程,-t参数打印时间信息。

查看输出的这部分日志信息,发现在执行passwd命令修改前也无明显错误。

3、再次检查pam文件,官方将common-password里的所有规则全部还原为初始设置后,再进行密码修改验证,发现问题解决。common-password加固和初始值分别如下:

加固后:

 1auth    required        pam_unix2.so nullok
 2account required        pam_unix2.so
 3session required        pam_unix2.so
 4password        required        pam_pwcheck.so nullok
 5password        required        pam_unix2.so nullok use_first_pass use_authtok
 6password        required        pam_unix.so remember=5 use_authtok md5 shadow
 7password required pam_cracklib.so min=disabled,12,8,6,5 max=40 passphrase=3 match=4 similar=deny random=42 enforce=everyone retry=3
 8初始值:
 9password required       pam_pwcheck.so  nullok cracklib
10password required       pam_unix2.so    nullok use_authtok

四、小结

问题虽然解决,不过原厂工程师也给出了建议,common-auth、common-password、common-account、common-session这四个文件分别写的策略是 auth、password、account、session相关的内容,建议每个文件里,只写入跟该策略相关的内容。比如common-password里,只写入password开头的内容,而安全加固厂家在加固时,把auth和 session相关的东西也写在了该文件内。这样写,容易造成配置混乱,且某些模块重复加载。