Solaris 开发者安全性指南

PAM 配置

PAM 配置文件 pam.conf(4) 用于为系统服务(如 loginrloginsucron)配置 PAM 服务模块。系统管理员可以管理此文件。如果 pam.conf 中的项顺序有误,则会导致无法预料的负面影响。例如,如果 pam.conf 配置错误,则会将多个用户锁定在外,这样必须采用单用户模式才能进行修复。有关设置顺序的说明,请参见PAM 堆栈工作原理。有关系统管理员所管理的 PAM 配置的信息,请参见《系统管理指南:安全性服务》中的“PAM 配置文件(参考)”

PAM 配置文件语法

该配置文件中的项采用以下格式:

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

服务的名称,例如 ftploginpasswd。应用程序可以针对其提供的服务使用不同的服务名。例如,Solaris 安全 shell 守护进程使用以下服务名:sshd-nonesshd-passwordsshd-kbdintsshd-pubkey 以及 sshd-hostbased。服务名 other 是用作通配符服务名的预定义名称。如果在配置文件中未找到特定的服务名,则会使用 other 的配置。

module-type

服务类型,即 authaccountsessionpassword

control-flag

控制标志。用于指明在确定服务的集成成败值的过程中模块所起的作用。有效的控制标志包括 bindingoptionalrequiredrequisitesufficient。有关这些标志用法的信息,请参见PAM 堆栈工作原理

module-path

用于实现服务的库对象的路径。如果路径名不是绝对路径名,则假设路径名相对于 /usr/lib/security/$ISA/。 通过使用与体系结构有关的宏 $ISA,libpam 可查看应用程序特定体系结构的目录。

module-options

传递给服务模块的选项。模块的手册页介绍了相应模块可接受的选项。典型的模块选项包括 nowarndebug

PAM 堆栈工作原理

应用程序调用以下函数时,libpam 将读取配置文件 /etc/pam.conf 以确定针对该服务参与操作的模块:

如果对于该服务的操作(如验证或帐户管理)/etc/pam.conf 仅包含一个模块,则该模块的结果将确定操作的结果。例如,passwd 应用程序的缺省验证操作包含一个模块 pam_passwd_auth.so.1


passwd  auth required           pam_passwd_auth.so.1

另一方面,如果为服务操作定义了多个模块,那么这些模块就堆叠起来,即,对于该服务存在一个 PAM 堆栈。例如,请考虑 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 服务的 auth 栈样例。要确定此栈的结果,各个模块的结果代码需要进行集成处理。在集成处理中,模块按照 /etc/pam.conf 中指定的顺序执行。每个成功/失败代码都会根据模块的控制标志集成到整体结果中。控制标志会导致栈很早就终止。例如,requisite 模块可能会失败,而 sufficientbinding 模块则可能会成功。处理栈之后,各个结果会组合成一个整体结果并随后传送给应用程序。

控制标志用于指明 PAM 模块在确定对服务的访问方面所起的作用。五个控制标志及其作用如下所示:

下面的两个图说明了如何在集成处理中确定访问权限。第一个图说明如何为每种类型的控制标志记录成败信息。第二个图说明如何确定集成值。

图 3–2 PAM 堆栈:控制标志的影响

该流程图说明控制标志如何影响 PAM 堆栈。

图 3–3 PAM 堆栈:如何确定集成值

该流程图说明如何在 PAM 堆栈中确定集成值。

PAM 堆栈示例

请考虑以下请求验证的 rlogin 服务示例。


示例 3–1 典型 PAM 配置文件的部分内容

该示例中的 pam.conf 文件包含以下有关 rlogin 服务的内容:


     # Authentication management

     ...     

     # rlogin service 

     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_auth.so.1

     ...

rlogin 服务请求验证时,libpam 将首先执行 pam_rhosts_auth(5) 模块。对于 pam_rhosts_auth 模块,控制标志将设置为 sufficient。如果 pam_rhosts_auth 模块可以验证用户,则处理将停止并且会向应用程序返回成功信息。

如果 pam_rhosts_auth 模块无法验证用户,则将执行下一个 PAM 模块 pam_authtok_get(5)。此模块的控制标志将设置为 requisite。如果 pam_authtok_get 失败,则验证过程将结束并向 rlogin 返回失败信息。

如果 pam_authtok_get 成功,则将执行接下来的两个模块 pam_dhkeys(5)pam_unix_auth(5)。这两个模块的关联控制标志都会设置为 required,以便该过程可继续进行,无论是否会返回单独的失败信息。执行 pam_unix_auth 后,不会再保留任何用于验证 rlogin 的模块。此时,如果 pam_dhkeyspam_unix_auth 返回失败信息,则会拒绝用户通过 rlogin 进行访问。