Wednesday, July 22, 2009

系统与PAM认证

本文为如下地址学习笔记: http://fhc2007.blog.ubuntu.org.cn/?p=1155
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.