10.2. 关于 PAM 配置文件
每个 PAM 感知 应用程序或服务 在
/etc/pam.d/
目录中都有一个文件。此目录中的每一文件的名称与其控制访问权限的服务相同。例如,登录程序将其服务名称定义为 login,并安装 /etc/pam.d/ login
PAM 配置文件。
警告
强烈建议您使用 authconfig 工具配置 PAM,而不是手动编辑 PAM 配置文件。
10.2.1. PAM 配置文件格式
每个 PAM 配置文件包含一组指令,这些指令定义模块(身份验证配置区域)以及其中的任何控制或参数。
这些指令都具有简单的语法,可识别模块用途(接口)和模块的配置设置。
module_interface control_flag module_name module_arguments
在 PAM 配置文件中,模块接口是定义的第一个字段。例如:
auth required pam_unix.so
PAM 接口 基本上是该特定模块可以执行的身份验证操作类型。可用的 PAM 模块接口有四种,分别对应于身份验证和授权过程的不同方面:
- auth - 此模块接口验证用户。例如,它请求并验证密码的有效性。带有此接口的模块也可以设置凭据,如组成员资格。
- account - 此模块接口验证是否允许访问。例如,它会检查用户帐户是否已过期,或者是否允许用户在特定时刻登录。
- password - 此模块接口用于更改用户密码。
- Session - 此模块接口配置和管理用户会话。使用此界面的模块还可以执行允许访问所需的其他任务,例如挂载用户的主目录和使用户的邮箱可用。
单个模块可以提供任何或所有模块接口。例如,
pam_unix.so
提供所有四个模块接口。
模块名称(如 pam_unix.so )为 PAM 提供包含指定模块接口的库名称。目录名称会被省略,因为应用程序链接到适当的
libpam
版本,它可以找到模块的正确版本。
调用时,所有 PAM 模块都会生成成功或失败的结果。控制标志 告诉 PAM 如何使用结果。可以按特定顺序列出(堆叠)模块,控制标志则决定特定模块的成功或失败对于向用户验证服务的整体目标而言有多重要。
有几个简单标记[2],它只使用关键字来设置配置:
- 必需 - 模块结果必须成功才能进行身份验证才能继续。如果此时测试失败,则只有在所有模块测试引用该接口完成之前,才会通知用户。
- requisite - 模块结果必须成功才能继续身份验证。但是,如果测试在此时失败,用户会立即收到一个显示第一个 failed 或 requisite 模块测试的消息。
- sufficient - 如果模块失败,则忽略该模块结果。但是,如果模块标记 足够 成功,并且没有 以前的模块标记失败,则不需要其他结果,用户会被验证到该服务。
- 可选 - 模块结果会被忽略。在没有其他模块引用 接口时,只有在成功进行身份验证时,才会将模块标记为可选。
- include - 与其他控制不同,这与处理模块结果无关。此标志拉取配置文件中与给定参数匹配的所有行,并将它们作为参数附加到模块。
模块接口指令可以 堆叠 或放在另一个模块上,从而能将多个模块一起用于一个用途。
注意
如果模块的 control 标志使用了
sufficient
或 requisite
值,则列出模块的顺序对身份验证过程非常重要。
利用堆栈,管理员可以先存在特定条件,然后才能允许用户进行身份验证。例如,setup 工具通常使用几个堆栈的模块,如其 PAM 配置文件中所示:
[root@MyServer ~]# cat /etc/pam.d/setup auth sufficient pam_rootok.so auth include system-auth account required pam_permit.so session required pam_permit.so
auth sufficient pam_rootok.so
- 此行使用pam_rootok.so
模块来检查当前用户是否为 root,方法是验证其 UID 是否为 0。如果此测试成功,则不会查询其他模块并执行 命令。如果此测试失败,则使用下一个模块。auth 包括 system-auth
- 此行包含/etc/pam.d/system-auth
模块的内容,并处理此内容进行验证。帐户 required pam_permit.so
- 此行使用pam_permit.so
模块来允许 root 用户或在控制台中登录的任何人都重新引导系统。会话 required pam_permit.so
- 此行与会话设置相关。使用pam_permit.so
,它会确保setup
实用程序不会失败。
PAM 使用 参数 将信息传递至某些模块的身份验证期间可插拔模块。
例如,
pam_pwquality.so
模块检查密码的强度程度,并可取几个参数。在以下示例中,force _for_root
指定即使 root 用户的密码也必须成功通过强度检查,然后 重试
定义用户将收到三个输入强密码的机会:
password requisite pam_pwquality.so enforce_for_root retry=3
无效的参数通常会被忽略,否则不会影响 PAM 模块的成功或失败。但是,一些模块可能会在无效的参数中失败。大多数模块向
journald
服务报告错误。有关如何使用 journald
和相关 journalctl
工具的详情,请参考 系统管理员指南。
注意
journald
服务在 Red Hat Enterprise Linux 7.1 中引入。在以前的 Red Hat Enterprise Linux 版本中,大多数模块会向 /var/log/secure
文件报告错误。
10.2.2. 注解的 PAM 配置示例
例 10.1 “简单的 PAM 配置” 是 PAM 应用程序配置文件示例:
例 10.1. 简单的 PAM 配置
#%PAM-1.0 auth required pam_securetty.so auth required pam_unix.so nullok auth required pam_nologin.so account required pam_unix.so password required pam_pwquality.so retry=3 password required pam_unix.so shadow nullok use_authtok session required pam_unix.so
- 第一行是注释,由行首处的 hash 标记(#)表示。
- 第二行(共四个堆栈)三个模块进行登录身份验证。auth required pam_securetty.so - 此模块可确保如果用户尝试以 root 身份登录,如果该文件存在,则
/etc/securetty
文件中列出了用户正在登录的 TTY。如果 TTY 没有列在文件中,则任何尝试以 root 身份登录都会失败,并显示Login incorrect
信息。auth required pam_unix.so nullok - 此模块提示用户输入密码,然后使用存储在/etc/passwd
中的信息检查密码(如果存在的话),以及/etc/shadow
。参数 nullok 指示pam_unix.so
模块允许空白密码。 - auth required pam_nologin.so - 这是最终身份验证步骤。它将检查
/etc/nologin
文件是否存在。如果存在并且用户不是 root,则身份验证会失败。注意在本例中,会检查所有三个 auth 模块,即使第一个 auth 模块失败。这可以防止用户在什么阶段知道其身份验证失败。这种在攻击者手中的知识让他们可以更容易地推断出如何破解系统。 - 帐户所需的 pam_unix.so - 此模块执行任何必要的帐户验证。例如,如果启用了 shadow 密码,
pam_unix.so
模块的帐户接口检查帐户是否已过期,或者用户是否在允许的宽限期中更改了密码。 - password required pam_pwquality.so retry=3 - 如果密码已过期,
pam_pwquality.so
模块的密码组件会提示输入新密码。然后,它会测试新创建的密码,看它是否能由基于字典的密码破解程序轻松确定。参数 retry=3 指定测试第一次失败,则用户有另外两个机会来创建强密码。 - password required pam_unix.so shadow nullok use_authtok - 如果程序使用
pam_unix.so
模块 的密码 接口更改用户的密码,则指定此行。- 参数 shadow 指示模块在更新用户密码时创建影子密码。
- 参数 nullok 指示模块允许用户从空白密码更改其密码,否则 null 密码被视为帐户锁定。
- 这一行上的最后一个参数 use_authtok 提供了堆栈 PAM 模块时顺序的重要性的好示例。此参数指示模块不要提示用户输入新密码。相反,它接受之前 password 模块记录的任何密码。这样,所有新密码都必须传递
pam_pwquality.so
测试安全密码,然后才能被接受。
- session required pam_unix.so - 最后一行指示
pam_unix.so
模块的会话接口来管理会话。此模块将用户名和服务类型记录到每个会话的开头和结尾处的/var/log/secure
中。此模块可通过与其他会话模块堆栈来获取额外的功能来补充。