https://www.freebsd.org/doc/en/articles/pam
PAM机制能够使应用程序与认证机制分离,这样,当认证机制改变时,不需要修改应用程序,只需要系统管理员对配置文件进行修改就能改变,极大地提高了认证机制的灵活性与通用性.
特点如下: 1)应用程序可以通过PAMAPI方便的使用PAM提供的各种鉴别功能,而不必了解太多的底层细节。
2)此外,PAM的易用性也较强,主要表现在它对上层屏蔽了鉴别的具体细节,所以用户不必被迫学习各种各样的鉴别方式。也不必记住多个口令:
3)又由于它实现了多鉴别机制的集成问题,所以单个程序可以轻易集成多种鉴别机制如Kerberos鉴别机制和Diffie—Hellman鉴别机制等,所以用户仍可以用同一个口令登录而感觉不到采取了各种不同鉴别方法。
设计思想:
分层设计,即让各鉴别模块从应用程序中独立出来。然后通过API作为两者联系的纽带。这样应用程序就可以根据需要灵活地在其中“插入”所需鉴别功能模块,从而真正实现了“鉴别功能,随需应变”
用户调用某个应用程序以便得到相对应的服务,PAM应用程序调用后台的PAM库进行验证工作,接着PAM库在目录/etc/pam.d/目录下面查找相应的配置文件,该文件告诉PAM应用程序使用何种验证机制以便PAM库装在所需要的验证模块,这些模块可以让PAM库与应用程序中的转换函数进行通信。转换函数向用户要求有关的验证信息,用户提供对应的信息,PAM验证模块对用户提供的信息进行鉴别,然后通过PAM库将认证的结果返回给应用程序,认证完成以后,应用程序做出两种选择:一,将所有权限赋予用户,并通知用户;二,认证失败,阻止用户获得服务。
1)认证管理(authenticationmanagement)
主要是接受用户名和密码,进而对该用户的密码进行认证。强制用户在开始服务之前提供认证信息,这个认证信息代表一个口令,这个口令的内容非常广泛,甚至可以包括硬件板卡或传感器。
2)账号管理(accountmanagement)
主要是让程序检查账户是否被允许登录系统,口令有效期或访问时间的限制等。典型的用法是基于一天的不同时间段来限制/允许访问某服务。
3)口令管理(passwordmanagement)
主要是更新用户的认证标志时需要。
4)会话管理(sessionmanagement) ‘
该模块和一系列动作有关,表明服务启动之前和关闭之后所执行的步骤,这包括记录用户的登录,登出,挂载必须的目录等。
应用程序使用PAM认证:
每个使用PAM认证的应用程序都以pam_start开始,pam_end结束。PAM还提供了pam_get_item和pam_set_item共享有关认证会话的某些公共信息,例如用户名、服务名、密码和会话函数。应用程序在调用了pam_start()后也能够用这些API来改变状态信息。实际做认证工作的API函数有4个:
a)认证管理:包括pam_authenticate()函数认证用户、pam_setcred()设置、刷新或销毁用户证书。
b)账号管理:包括pam_acc_mgmt()函数检查认证的用户是否可以访问他们的账户,该函数可以实现口令有效期、访问时间限制等。
c)会话管理:包括pam_open_session()和para_close_session()函数管理会话和记账,例如,系统可以存储会话的全部时间。
d)口令管理:包括pam_chauthok()函数改变密码