Linux-PAM模块简介

Linux-PAM工程的目的就是分离应用软件和验证机制的开发。通过验证函数库可以实现上述目的,一个应用程序可以使用这些函数库去进行用户的认证。

模块pam_*.so以动态可加载目标文件(使用dloptn(3)函数打开)的形式保存在 /lib/security、 /lib64/security、/lib/x86_64-linux-gnu/security/等。

配置文件:

验证类型 控制标记 模块路径 模块参数
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/*。