Linux-PAM模块简介
Linux-PAM工程的目的就是分离应用软件和验证机制的开发。通过验证函数库可以实现上述目的,一个应用程序可以使用这些函数库去进行用户的认证。
模块pam_*.so以动态可加载目标文件(使用dloptn(3)函数打开)的形式保存在 /lib/security、 /lib64/security、/lib/x86_64-linux-gnu/security/等。
配置文件:
- /etc/pam.conf
- /etc/pam.d/
- /etc/security/*(其他PAM环境的配置文件)。
以/etc/pam.d/sudo配置为例:
[table id=3 /]
| 验证类型 |
控制标记 |
模块路径 |
模块参数 |
| session |
required |
pam_env.so |
readenv=1 envfile=/etc/default/locale user_readenv=0 |

验证类型
| 名称 |
说明 |
| aut |
用于检查用户和密码,并分配权限。 |
| account |
负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等; |
| password |
修改密码需要用到的。如果用户不修改密码,几乎用不到这个模块。 |
| session |
提供对会话的管理,限定会话限制的。比如:vsftpd下午6点不允许访问,那6点过后用户再去访问的话就会被限制,或内存不足不允许访问等。 |
控制标记
| 控制 |
说明 |
| requuisite |
与required类似,该模块必须返回成功才能通过认证。一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。 |
| required |
通过鉴别的必要条件。换句话说,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。 反正说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。 |
| sufficient |
如果本条目的条件被满足,且本条目之前没有任何required条目失败,则立即返回“认证成功”信号;如果对本条目的验证失败,不对结果造成影响。 |
| sufficient |
表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以忽略。可以认为是一个充分条件。 |
| optional |
表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。 |
| substack |
运行其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出。该模式和 include的不同点在于认证结果的作用域:如果某个流程栈include了一个带requisite的栈,这个requisite |
| include |
在验证过程中调用其他的PAM配置文件。 |
模块路径
| 名称 |
说明 |
| pam_unix.so |
传统意义上的帐号和密码认证机制,这个机制实现了标准C库中基于让用户输入帐号密码并完成检测的认证过程。 |
| pam_permit.so |
直接通过,允许访问,定义默认策略。 |
| pam_deny.so |
拒绝访问,定义默认策略。 |
| pam_cracklib.so |
用来检验密码的强度,包括设定的密码是否在字典中,修改的密码是否能和上次一样,密码至少包含多 少个数字字符,可以输入多少次错误密码等,都是由这个模块定义的。 |
| pam_shells.so |
检查用户登录的shell是否是安全shell,也就是写在 /etc/shells中的shell |
| pam_securetty.so |
限定管理员只能通过安全的tty登录,/etc/securetty,tty就是传统终端 |
| pam_rootok.so |
管理员su到其他用户不用输入密码就是靠这个定义的。 |
| pam_nologin.so |
可以限制一般用户是否能够登入主机,当/etc/nologin这个档案存在时,则所有一般使用者均无法再登入系统。 |
| pam_limits.so |
资源限定打开文件数,使用进程数等等,对任何人都生效,/etc/security/limits或/etc/security/limits.d/*。 |