Linux-PAM (Pluggable Authentication Modules for Linux)
PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中"插入"所需鉴别功能模块,从而真正实现了"鉴别功能,随需应变"。实际上,这一思路 非常符合软件设计中的"高内聚,低耦合"这一重要思想,PAM 的体系如下简图所示:
PAM 在模块层提供
* 鉴别模块外
* 支持帐户管理
* 会话管理
* 口令管理
PAM API
第一类: 调用下层特定模块的接口
这类接口与底层的模块(上面所提的PAM四种功能)相对应1. 鉴别类接口: pam_authenticate()用于鉴别用户,pam_setcred()用于修改用户的秘密信息。
2. 帐号类接口: pam_acct_mgmt()检查受鉴别的用户所持帐户是否有权登陆系统,以及该帐户是否已过期等。
3. 会话类接口: 包括用于会话管理和记帐的 pam_open_session()和 pam_close_session()函数。
4. 口令类接口: 包括用于修改用户口令的 pam_chauthtok()。
第二类: 对底层模块提供支持以及实现应用程序与模块之间的通信等
1. 管理性接口2. 应用程序与模块间的通讯接口
3. 用户与模块间的通讯接口: pam_start()函数可以通过会话式的回调函数,让底层模块通过它们读写模块相关的鉴别信息,比如以应用程序所规定的方式提示用户输入口令。
4. 模块间通讯接口
5. 读写模块状态信息的接口
配置文件及其格式
PAM的配置文件:1. /etc/pam.conf
2. /etc/pam.d
这两种方式的区别在于: pam.conf中一个登记项(每行对应一个登记项)需要标明服务名, 对于/etc/pam.d的方式, 其下面每个文件名其实就是服务名, 无需要在配置文件中标明服务名
什么是服务名?
服务名就是使用PAM认证的服务在自己程序代码中硬编码要使用的pam配置文件. 要修改只能修改程序代码
PAM的API:
int pam_start(const char *service_name, const char *user,
const struct pam_conv *pam_conversation, pam_handle_t **pamh);
The service_name argument specifies the name of the service to apply and will be stored as
PAM_SERVICE item in the new context. The policy for the service will be read from the file
/etc/pam.d/service_name or, if that file does not exist, from /etc/pam.conf.
* 来自man 3 pam_start
在samba的source/auth/pampass.c原代码中:
pam_start("samba", user, pconv, pamh);
* 所以, samba的PAM配置文件为:/etc/pam.d/samba
下面以pam.d下的配置文件为基础说明PAM的配置文件
PAM每一个登记项格式如下:
第一栏: module_type
* auth表示鉴别类模块
* account表示帐户类模
* session表示会话类模块
* password表示口令类模块
第二栏: control_flag
* required: 当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别
* Requisite: 同required, 不同之处在于其一旦失败就不再执行堆中后面的其它模块
* sufficient: 一旦成功立即返回成功, 失败即等于optional
* optional: 表示即便该模块失败,用户仍能通过鉴别
第三栏: module_path 模块文件名
第四栏: options 模块传递的选项
总: 当程序支持PAM的认证方式, 系统管理员就可以按需求更换认证方式而不影响到程序.
python的binding: http://ace-host.stuart.id.au/russell/files/pam_python
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.