上周客户现场遇到一个奇怪的问题,在执行应用安装脚本时,需要输入密码,这个时候即使输入了正确的密码依然报校验失败。当时尝试解决了一下,但是没找到问题的根本原因,还会报其他原因。为了不耽误交付进度,只能让重新安装操作系统。
当时就怀疑和Linux的PAM有关,但苦于对PAM不熟,网上也找不到对应的解决方案,这两天正好利用周末研究下Linux的PAM机制,下面简要介绍一下什么是PAM。
在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如login, su等。在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性。
PAM的规则文件一般有4列,这里以/etc/pam.d/sshd为例:
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
第一列代表模块类型
第二列代表控制标记
第三列代表模块路径
第四列代表模块参数
模块类型常见如下几种:
控制标记如下:
这里我不打算具体介绍PAM的细节和配置规则,这里推荐大家看这一篇博客,写的非常详细字也非常多,感兴趣的可以抽半个小时看一下。
有了上面对PAM的初步认识后,下面我们来看几个小例子,通过例子加深对PAM的了解,以下例子都是在CentOS 8环境下实验。
-
root用户su普通用户也要用密码
我们创建一个普通并赋密码,在root下通过su - 切换该账号登录是不需要密码的,如图:
这是因为在/etc/pam.d/su中配置了当用户是root时直接返回成功不用输密码
当我们把第二行的sufficient改成required再切换用户就要输密码了
-
普通用户su - root用户也不用密码
我们在刚才的/etc/pam.d/su第二行前面加上一行
这个时候我们在test下直接su到root,不用输入密码。
-
不用密码即可登录
在/etc/pam.d/system-auth中加一行
可以看到在输入用户名后直接回车就能进入系统。
-
有密码也不能登录
注:该方法会导致你退出后再也登陆不了系统,请先做好快照再实验。
把下图中原来的sufficient改成required
这个时候我们发现系统进入不了了。
今天的小实验做完了,通过这4个实验我们初步知道PAM的作用和怎么用了,还有很多其他知识点等待我们在实践中取挖掘,希望大家在遇到类似问题时有个大概的判断和方向去排查。