16.2. sshd 的 PAM 配置

为了说明 PAM 背后的工作原理,让我们看一下 sshd 的 PAM 配置这一实际示例:

例 16.1. sshd 的 PAM 配置


#%PAM-1.0
auth     include        common-auth
auth     required       pam_nologin.so
account  include        common-account
password include        common-password
session  include        common-session
# Enable the following line to get resmgr support for
# ssh sessions (see /usr/share/doc/packages/resmgr/README.SuSE)
#session  optional      pam_resmgr.so fake_ttyname

应用程序(在本例中是 sshd)的典型 PAM 配置包含 4 个 include 语句,它们指向 4 种模块类型的配置文件:common-authcommon-accountcommon-passwordcommon-session。这 4 个文件包含每种模块类型的默认配置。通过将它们包含在内而不是单独为每个 PAM 应用程序调用各个模块,在管理员更改默认值时可自动更新 PAM 配置。以前,在 PAM 发生更改或安装新应用程序时,必须手工调整所有应用程序的所有配置文件。而现在 PAM 配置是通过中央配置文件进行的,每个服务的 PAM 配置都将自动继承所有的更改。

第一个 include 文件 (common-auth) 调用 auth 类型的两个模块:pam_envpam_unix2。请参见 例 16.2 “auth 部分的默认配置”

例 16.2. auth 部分的默认配置


auth    required        pam_env.so
auth    required        pam_unix2.so

第一个模块 pam_env 装载文件 /ect/security/pam_env.conf 以按照此文件中指定的内容设置环境变量。这可以用于将 DISPLAY 变量设置为正确的值,原因是 pam_env 模块知道进行登录的位置。第二个模块 pam_unix2 根据 /etc/passwd/etc/shadow 检查用户的登录名和口令。

在成功调用 common-auth 中指定的模块后,第三个模块 pam_nologin 将检查文件 /etc/nologin 是否存在。如果存在,则只有 root 用户方可登录。在 sshd 得到登录是否成功的任何反馈之前,整批 auth 模块都将完成处理。假设这批模块中的所有模块都带有 required 控制标志,则必须先成功处理所有这些模块,在此之后 sshd 才能收到有关处理成功的讯息。如果其中的某个模块不成功,则仍将继续处理整批模块,在此之后 sshd 才能得到处理失败的通知。

成功处理了 auth 类型的所有模块后,将立即处理另一个 include 语句(在本例中即 例 16.3 “account 部分的默认配置” 中的语句)。common-account 只包含 pam_unix2 一个模块。如果 pam_unix2 返回的结果证明用户存在,则 sshd 会收到一条处理成功的消息,然后处理下一批模块 (password),如 例 16.4 “password 部分的默认配置” 中所示。

例 16.3. account 部分的默认配置


account required        pam_unix2.so

例 16.4. password 部分的默认配置


password required       pam_pwcheck.so  nullok
password required       pam_unix2.so    nullok use_first_pass use_authtok
#password required      pam_make.so     /var/yp

此外,sshd 的 PAM 配置只涉及一条引用 password 模块的默认配置的 include 语句,这些模块位于 common-password 中。当应用程序请求鉴定令牌的更改时,必须成功完成这些模块(控制标志 required)。更改口令或另一个鉴定令牌需要进行安全检查。使用 pam_pwcheck 模块可完成此操作。随后使用的 pam_unix2 模块存有来自 pam_pwcheck 的任何旧口令和新口令,因此用户无需再次鉴定。该模块还确保不能绕过 pam_pwcheck 所执行的检查。只要前面的 accountauth 类型的模块被配置为指出失效的口令,就应该使用 password 类型的模块。

例 16.5. session 部分的默认配置


session required        pam_limits.so
session required        pam_unix2.so

最后,调用 session 类型的模块(捆绑在 common-session 文件中)以根据相关用户的设置来配置会话。虽然再次处理 pam_unix2,但由于在该模块的相应配置文件 pam_unix2.conf 中指定了 none 选项,所以没有实际后果。pam_limits 模块装载文件 /etc/security/limits.conf,该文件定义对某些系统资源使用的限制。当用户注销时,将再次调用 session 模块。