Solaris 开发者安全性指南

PAM 框架介绍

PAM 框架由四个部分组成:

该框架可为与验证相关的活动提供统一的执行方式。采用该方式,应用程序开发者可使用 PAM 服务,而不必了解策略的语义。算法是集中提供的。可以独立于各个应用程序对算法进行修改。借助 PAM,管理员可以根据特定系统的需要调整验证过程,而不必更改任何应用程序。调整是通过 PAM 配置文件 pam.conf 来执行的。

下图说明了 PAM 体系结构。应用程序通过 PAM 应用编程接口 (application programming interface, API) 与 PAM 库进行通信。PAM 模块通过 PAM 服务提供者接口 (service provider interface, SPI) 与 PAM 库进行通信。通过这种方式,PAM 库可使应用程序和模块相互进行通信。

图 3–1 PAM 体系结构

图中显示了通过应用程序和 PAM 服务模块访问 PAM 库的方式。

PAM 服务模块

PAM 服务模块是一个共享库,用于为系统登录应用程序(如 loginrlogintelnet)提供验证和其他安全服务。四种类型的 PAM 服务是:

一个 PAM 模块可以实现其中的一项或多项服务。将简单模块用于明确定义的任务中可以增加配置灵活性。因此,应该在不同的模块中实现 PAM 服务。然后,可以按照 pam.conf(4) 文件中定义的方式根据需要使用这些服务。

例如,Solaris OS 为系统管理员提供了用于配置站点口令策略的 pam_authtok_check(5) 模块。pam_authtok_check(5) 模块可以检查符合各种强度条件的建议口令。

有关 Solaris PAM 模块的完整列表,请参见手册页第 5 节:Standards, Environments, and Macros。PAM 模块的前缀为 pam_

PAM 库

PAM 库 libpam(3LIB) 是 PAM 体系结构中的中心元素:

PAM 验证过程

以消费方如何使用 PAM 库进行用户验证为例,请考虑 login 如何验证用户:

  1. login 应用程序通过调用 pam_start(3PAM) 并指定 login 服务来启动 PAM 会话。

  2. 该应用程序将调用 pam_authenticate(3PAM),后者是 PAM 库 libpam(3LIB) 导出的 PAM API 的一部分。

  3. 该库将在 pam.conf 文件中搜索 login 项。

  4. 对于 pam.conf 中为 login 服务配置的每个模块,PAM 库将调用 pam_sm_authenticate(3PAM)pam_sm_authenticate() 函数是 PAM SPI 的一部分。pam.conf 控制标志和每个调用的结果将确定是否允许用户访问系统。PAM 堆栈工作原理对此过程进行了更详细的介绍。

通过此方式,PAM 库可以将 PAM 应用程序与系统管理员已配置的 PAM 模块连接起来。

PAM 消费方的要求

PAM 消费方必须与 PAM 库 libpam 链接。应用程序使用模块提供的任何服务之前,必须通过调用 pam_start(3PAM) 初始化其 PAM 库的实例。调用 pam_start() 可初始化必须传递给所有后续 PAM 调用的句柄。应用程序完成使用 PAM 服务后,系统将调用 pam_end() 以清除 PAM 库已使用的任何数据。

PAM 应用程序与 PAM 模块之间的通信是通过进行的。例如,以下各项有助于进行初始化:

有关可用项的完整列表,请参见 pam_set_item(3PAM)。应用程序可以通过 pam_set_item(3PAM) 对项进行设置。应用程序可以通过 pam_get_item(3PAM) 检索模块已设置的值。但是,应用程序不能检索 PAM_AUTHTOK 和 PAM_OLDAUTHTOK。无法设置 PAM_SERVICE 项。