线上一台centos服务器报故障,表现为用户密码修改不了,报错。一般这种情况可能的原因有:linux相关的文件/etc/passwd和/etc/shadow的权限;文件系统有问题;空间满等原因导致。
后来排查可能是pam的缘故,对比发现/etc/pam.d/system-auth配置文件在安全加固时候曾经修改过。
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid
account required pam_permit.so
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
password requisite pam_cracklib.so retry=5 difok=3 minlen=8 lcredit=-1 dcredit=-1 ocredit=-1
其中最后一个password的配置有点异常,位置不对。于是对其做了修改,将它调整到中间"password required pam_deny.so"这一部分的最前面。
保存,然后再试,就可以修改了。由于password控制类型顺序导致认证流程出现问题,导致报错了。
借此此机会,虫虫给大家说说关于linux pam相关的知识。
Linux PAM介绍
Linux pam源于著名厂商后来被甲骨文收购的SUN公司的软件DCE-RFC的开源实现。PAM全称为Pluggable Authentication Modules,可插入认证模块。可以动态引入认证各种认证模块和插件,而无需重新加载系统。具有高度灵活性,随配随生效。
更多特性信息想见其官方网站(linux-pam.org),此处不在赘述。
PAM配置
PAM配置通过配置文件,默认是在/etc/pam.d/目录下,每一个服务都是以服务名命名的配置文件。比如虫虫一个服务器的配置目录如下:
其中比较重要,直接关注是system-auth,sshd,以下是system-auth配置
可见配置分为基本分为四列:模块名称、控制、模块库文件和参数。
模块介绍
其中模块主要分四种,具体功能如下:
auth模块实现用户认证。比如提示用户输入密码,或判断用户是否为root等。
account模块对用户的各项属性进行检查。比如是否允许登录,是否达到最大用户数,或是root用户是否允许在这个终端登录等。
session模块实现用户登录前的,及用户退出后所要进行的操作。比如登录连接信息,用户数据的打开与关闭,挂载文件系统等。
password模块实现用户信息修改。比如修改用户密码。
控制介绍
控制用来标记处理和判断各个模块的返回值。控制分为六种:
required表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM 才返回错误信息。
requisite和required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表示此类型失败.不再进行同类型后面的操作.
sufficient表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息,把控制权交回应用程序。其后相关模块的所有控制都将会比忽略。这就是开头为啥最后一个passwd 的required不会执行而导致报错的原因。
optional只有当它是与此服务+类型相关联的配置项是中的唯一模块时,模块返回才有意义。
include引入改项指定文件中的所有配置项。
substack和include类似。不同之处在于,对子堆中的完成和失败的行为的评估不会导致跳过整个模块堆栈的其余部分,而只会跳过子模块。
常用PAM模块
下面总结一个常用模块的介绍,希望对大家有用
领取专属 10元无门槛券
私享最新 技术干货