系统管理指南:安全性服务

第 16 章 使用 PAM

本章介绍可插拔验证模块 (Pluggable Authentication Module, PAM) 框架。PAM 提供了一种向 Solaris 操作系统 (Solaris Operating System, Solaris OS) 中“插入”验证服务的方法。PAM 会在访问系统时为多项验证服务提供支持。

PAM(概述)

使用可插拔验证模块 (Pluggable Authentication Module, PAM) 框架,可以“插入”新的验证服务,而无需更改系统登录服务,例如 loginftptelnet。还可以使用 PAM 将 UNIX 登录与其他安全机制(如 Kerberos)进行集成。也可以使用此框架来“插入”帐户、凭证、会话以及口令管理的机制。

使用 PAM 的益处

使用 PAM 框架,可以为用户验证配置系统登录服务(如 ftplogintelnetrsh)。PAM 提供的一些益处如下所示:

PAM 组件

PAM 软件由一个库、各种服务模块以及一个配置文件组成。其中还包括可利用这些 PAM 接口的 Solaris 命令或守护进程。

下图说明了系统登录应用程序、PAM 库、pam.conf 文件和 PAM 服务模块之间的关系。

图 16–1 PAM 工作原理

图中显示了如何在 PAM 模块与使用这些模块的应用程序之间放置 PAM 库。

系统登录应用程序(如 ftptelnet login)使用 PAM 库来调用配置策略。配置策略在 pam.conf 文件中定义。pam.conf 文件定义要使用的模块,以及每个应用程序使用这些模块的顺序。模块中的结果基于模块响应和已配置的控制标志。这些结果通过库传送回应用程序。

PAM 框架

PAM 框架提供了一种使用堆叠借助多项服务来验证用户的方法。根据配置,系统可以提示用户输入每种验证方法的口令。验证服务的使用顺序通过 PAM 配置文件确定。

PAM 库可提供框架以装入相应模块和管理堆叠过程。PAM 库提供了一种可在其中插入所有模块的通用结构。有关更多信息,请参见 pam_sm(3PAM) 手册页。

Solaris 10 发行版对 PAM 所做的更改

Solaris 10 发行版对可插拔验证模块 (Pluggable Authentication Module, PAM) 框架做了以下更改:

PAM(任务)

本节介绍使 PAM 框架使用特定安全策略所需执行的一些任务。应注意与 PAM 配置文件关联的某些安全问题。有关安全问题的信息,请参见规划 PAM 实现

PAM(任务列表)

任务 

说明 

参考 

规划 PAM 安装。 

开始软件配置过程之前,考虑配置问题并做出相关决定。 

规划 PAM 实现

添加新的 PAM 模块。 

有时,必须写入并安装特定于站点的模块,以满足通用软件不包括的要求。此过程说明如何安装这些新的 PAM 模块。 

如何添加 PAM 模块

阻止访问 ~/.rhosts

通过阻止访问 ~/.rhosts 来进一步提高安全性。

如何使用 PAM 防止从远程系统进行 Rhost 样式的访问

启动错误日志。 

通过 syslog 启动 PAM 错误消息日志。

如何记录 PAM 错误报告

规划 PAM 实现

所提供的 pam.conf 配置文件可实现标准的 Solaris 安全策略。此策略应适用于许多情况。如果需要实现其他安全策略,则应考虑以下问题:

以下是更改 PAM 配置文件之前要考虑的一些建议:

Procedure如何添加 PAM 模块

此过程说明如何添加新的 PAM 模块。可以创建新模块以提供特定于站点的安全策略或支持第三方应用程序。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)

  2. 确定应使用的控制标志和其他选项。

    有关模块的信息,请参阅PAM 模块

  3. 确保设置了拥有权和权限,以便模块文件由 root 拥有,并且权限为 555

  4. 编辑 PAM 配置文件 /etc/pam.conf,并将此模块添加到相应的服务中。

  5. 检验是否正确添加了模块。

    必须在重新引导系统之前进行测试,以防此配置文件配置错误。在重新引导系统之前,使用直接服务(例如 rlogintelnet )登录,并运行 su 命令。此服务可能是引导系统时仅产生一次的守护进程。因此,必须先重新引导系统,然后才能检验是否已添加模块。

Procedure如何使用 PAM 防止从远程系统进行 Rhost 样式的访问

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)

  2. 从 PAM 配置文件中删除所有包括 rhosts_auth.so.1 的行。

    此步骤用于防止在 rlogin 会话期间读取 ~/.rhosts 文件。因此,此步骤可防止从远程系统对本地系统进行未经验证的访问。无论 ~/.rhosts/etc/hosts.equiv 文件是否存在或包含什么内容,所有 rlogin 访问都需要口令。

  3. 禁用 rsh 服务。

    要防止对 ~/.rhosts 文件进行其他未经验证的访问,请记住要禁用 rsh 服务。


    # svcadm disable network/shell
    

Procedure如何记录 PAM 错误报告

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)

  2. 为所需的日志级别配置 /etc/syslog.conf 文件。

    有关日志级别的更多信息,请参见 syslog.conf(4)

  3. 刷新 syslog 守护进程的配置信息。


    # svcadm refresh system/system-log
    

PAM 配置文件(参考)

PAM 配置文件 pam.conf 确定要使用的验证服务模块,以及这些模块的使用顺序。可以修改此文件来为每个系统登录应用程序选择验证模块。

PAM 配置文件语法

PAM 配置文件所包含项的语法如下:


service-name module-type control-flag module-path module-options
service-name

系统登录服务的名称,例如 ftp logintelnet

module-type

服务的模块类型。有关更多信息,请参见PAM 模块类型

control-flag

确定模块的延续行为或失败行为。

module-path

指定实现安全策略的库对象的路径。

module-options

指定传送到服务模块的选项。

通过以 #(井号)开始行,可以向 pam.conf 文件中添加注释。可以使用空格或制表符来分隔字段。


注 –

如果在 PAM 配置文件的项中发现错误,则会生成 syslog 错误消息。如果此错误是请求服务的项,则此服务可能会返回一个错误。


PAM 的服务名称

每项服务的特定服务名称应该在该服务的手册页中进行介绍。例如,sshd(1M) 手册页列出 sshd 命令的所有 PAM 服务名称。

PAM 模块类型

您需要了解 PAM 模块类型,因为这些类型定义模块的接口。以下是 PAM 模块的类型:

PAM 控制标志

使用 PAM 服务模块的请求返回以下三种状态之一:

栈中的每个模块都可以确定请求的成功或失败。要确定模块的延续行为或失败行为,必须为 PAM 配置文件中的每个项选择一个控制标志

延续行为定义是否检查后面的所有模块。根据特定模块的响应,可以决定跳过所有其他模块。

失败行为定义如何记录或报告错误消息。失败信息既可以是可选信息,也可以是必需信息。必需的失败信息会导致此请求失败,即使其他模块成功也是如此。可选的失败信息不会始终导致此请求失败。

控制标志如下所示:

有关这些控制标志的更多信息,请参见下一节,其中介绍了通用 /etc/pam.conf 文件。

PAM 模块

每个 PAM 模块都可实现一种特定的功能。设置 PAM 验证时,需要指定模块和模块类型,后者定义模块执行的操作。一个模块可以实现多个模块类型,例如 authaccountsessionpassword

每个模块的路径由已安装的 Solaris 发行版中提供的指令集确定。对于 32 位模块,模块路径为 /usr/lib/security。对于 64 位模块,路径为 /usr/lib/security/ $ISA。有关更多信息,请参见 isalist(5) 手册页。

Solaris PAM 模块的完整列表位于 /usr/lib/security/$ISA 中。每个模块都有关联的手册页,其中介绍了应用的模块类型以及所有的特殊选项。

出于安全原因,这些模块文件必须由 root 拥有,并且禁止使用 groupother 权限写入。如果文件并非由 root 拥有,则 PAM 不会装入模块。

通用 pam.conf 文件的示例

通用 /etc/pam.conf 文件包括以下项:


login   auth requisite          pam_authtok_get.so.1

login   auth required           pam_dhkeys.so.1

login   auth required           pam_unix_cred.so.1

login   auth required           pam_unix_auth.so.1

login   auth required           pam_dial_auth.so.1

运行 login 命令时,必须针对 pam_authtok_getpam_dhkeyspam_auth_credpam_auth_unixpam_dial_auth 模块成功执行验证。pam_authtok_get 项中的 requisite 标志表示,如果此模块响应失败,则不再检查任何其他模块。但是,如果此模块响应成功,则会继续检查其余模块。如果针对所有模块的验证都失败,则验证请求也会失败。


rlogin  auth sufficient         pam_rhosts_auth.so.1

rlogin  auth requisite          pam_authtok_get.so.1

rlogin  auth required           pam_dhkeys.so.1

rlogin  auth required           pam_unix_cred.so.1

rlogin  auth required           pam_unix_auth.so.1

对于 rlogin 命令,sufficient 控制标志表示通过 pam_rhosts_auth 模块进行的验证足以使验证请求成功。无需执行任何其他检查。如果通过 pam_rhosts_auth 进行的验证失败,则通过 pam_authtok_getpam_dhkeyspam_auth_credpam_unix_auth 模块进行的验证必须成功。虽然其他模块中的失败信息会阻止成功验证,但是 pam_rhosts_auth 模块中的失败信息不会。此外,与 login 中的项相同,pam_authtok_get 项中的 requisite 控制标志表示如果此模块响应失败,则验证请求失败,并且不再检查任何其他模块。


other   session required        pam_unix_session.so.1

使用 other 服务名称,可以为 pam.conf 文件中未包括的任何其他命令设置缺省服务。other 服务名称简化了文件管理,因为只需一个项就可涵盖使用同一模块的许多服务。此外,other 服务名称用作“全面管理功能”时,可以确保每个访问都由一个模块来表示。

module-path 的项是“相对于根目录的”。如果为 module-path 指定的文件名未以斜杠 (/) 开始,则文件名前面为路径 /usr/lib/security/$ISA。必须对位于其他目录中的模块使用全路径名。可以在每个模块的手册页中找到 module-options 的值。