手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

深入Linux PAM 体系结构

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  • 会话类接口:包括用于会话管理和记帐的 pam_open_session()和 pam_close_session()函数。
  • 口令类接口:包括用于修改用户口令的 pam_chauthtok()。
  • 第二类接口通常并不和底层模块一一对应,他们的作用是对底层模块提供支持连同实现应用程式和模块之间的通信等。具体如下:

    1. 管理性接口
      每组 PAM 事务从 pam_start()开始,结束于 pam_end()函数。接口 pam_get_item()和 pam_set_item()用来读写和 PAM 事务有关的状态信息。同时,能够用 pam_str()输出 PAM 接口的出错信息。
    2. 应用程式和模块间的通讯接口
      在应用程式初始化期间,某些诸如用户名之类的数据能够通过 pam_start()将其存放在PAM接口层中,以备将来底层模块使用。另外,底层模块还能够使用 pam_putenv()向应用程式传递特定的环境变量,然后应用程式利用 pam_getenv() 和 pam_getenvlist() 读取这些变量。
    3. 用户和模块间的通讯接口
      pam_start()函数能够通过会话式的回调函数,让底层模块通过他们读写模块相关的鉴别信息,比如以应用程式所规定的方式提示用户输入口令。
    4. 模块间通讯接口
      尽管各模块是单独的,但是他们仍然能够通过 pam_get_item()和 pam_set_item()接口共享某些和鉴别会话有关的公用信息,诸如用户名、服务名、口令等。此外,这些API还能够用于在调用 pam_start()之后,让应用程式修改状态信息。
    5. 读写模块状态信息的接口
      接口 pam_get_data()和 pam_set_data()用以按照PAM句柄需要访问和更新特定模块的信息。此外,还能够在这些模块后附加一个清除数据函数,以便当调用 pam_end()时清除现场。

    由于 PAM 模块随需加载,所以各模块始化任务在第一次调用时完成。假如某些模块的清除任务必须在鉴别会话结束时完成,则他们应该使用 pam_set_data()规定清除函数,这些执行清除任务的函数将在应用程式调用 pam_end()接口时被调用。

    五、配置文档

    我们注意到,配置文档也放在了在应用接口层中,他和 PAM API 配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的。他的作用主要是为应用选定具体的鉴别模块,模块间的组合连同规定模块的行为。下面是个示例配置文档:

    图2.示例配置文档

    我们能够看到,配置文档有许多登记项(每行对应一个登记项)组成,每一行又分为五列(每列对应一栏),周详解释如下:

    第一栏,service表示使用PAM的应用程式,比如login、passwd、rlogin等。这一栏中的 OTHER表示任何没在该文档中显式列出的应用。也就是说,假如任何程式具备相同的需求,整个配置文档只需要一行即可,并且该行的第一栏为OTHER。本例中,因为任何应用程式使用相同的会话模块,所以实际上能够用单行,即

    
    
                " OTHER   auth        required     pam_unix_auth.so"
    
                

    来代替文档中的这些行:

    
    
                "login   session     required     pam_unix_session.so
    
                ftp     session     required     pam_unix_session.so
    
                telnet  session     required     pam_unix_session.so"。
    
                

    第二栏,module_type 指明程式所用PAM底层模块的类型:auth表示鉴别类模块;account表示帐户类模块;session表示会话类模块;password表示口令类模块。注意,每行只能指定一种类型模块,假如程式需要多种模块的话,可在多行中分别规定。

    第三栏,control_flag规定如何处理模块的成功和失败情况。单个应用程式能够调用多种底层模块,这通常称为"堆叠",对应于某程式的按照配置文档中出现顺序执行的任何模块成为"堆",堆中的各模块的地位和出错时的处理由control_flag栏的取值决定,他的五种可能的取值分别为required、Requisite、sufficient或_optional,现介绍如下:

    required--他表示该模块的成功是用户通过鉴别的必要条件,换句话说,只有当对应于应用程式的任何带 required标记的模块全部成功后,该程式才能通过鉴别。同时,假如任何带required标记的模块出现了错误,PAM并不立即将错误消息返回给应用程式,而是在任何模块都调用完毕后才将错误消息返回调用他的程式。

    Requisite--他和required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别,不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束。

    optional--他表示即便该模块失败,用户仍能通过鉴别。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。

    sufficient--他表示该模块取得成功是用户通过鉴别的充分条件,也就是说只要标记为sufficient的模块一旦成功,那么PAM便立即向应用程式返回成功而不必尝试任何其他模块。当标记为sufficient的模块失败时,sufficient模块当做 optional对待。

    第四栏,module_path指出PAM模块的位置。

    第五栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些任选项。比如使用此栏打开模块调试,或向某模块传递诸如超时值之类的参数等。另外,他还用于支持下文所述的口令映射技术。

    假如任一栏出现错误,或某模块没有找到,那么所在行被忽略并将其作为严重错误进行记录。

    本例中,login程式使用UNIX口令模块进行鉴别,而ftp程式却使用S/Key模块进行鉴别。如我们想改变ftp程式的鉴别方法,比如也用UNIX口令模块进行鉴别,那么我们不必改变源程式,只需将配置文档中的

    文章整理:西部数码--专业提供域名注册虚拟主机服务
    http://www.west263.com
    以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!