PAM

出自 ArchWiki

Linux 可插拔身份验证模块 (PAM) 提供了一个用于系统范围用户身份验证的框架。引用项目

PAM 提供了一种开发独立于身份验证方案的程序的方法。这些程序需要“身份验证模块”在运行时附加到它们才能工作。要附加哪个身份验证模块取决于本地系统设置,并由本地系统管理员自行决定。

本文解释了 Arch Linux 基础设置中 PAM 用于验证本地和远程用户的默认配置。对默认设置的应用更改是交叉链接的特定主题文章的主题。

安装

pam 软件包是 base 元软件包 的依赖项,因此通常安装在 Arch 系统上。PAM 模块专门安装到 /usr/lib/security 中。

存储库包含许多可选的 PAM 软件包,#配置指南 显示了示例。

配置

许多 /etc 路径与 PAM 相关;执行 pacman --query --list pam | grep /etc 以查看创建的默认配置文件。它们与模块的#安全参数#PAM 基础堆栈 配置有关。

安全参数

路径 /etc/security 包含身份验证方法提供的变量的系统特定配置。基本安装使用默认的上游配置文件填充它。

请注意,Arch Linux 不为这些文件提供特定于发行版的配置。例如,/etc/security/pwquality.conf 文件可用于定义系统范围的密码质量默认值。然而,要启用它,必须将 pam_pwquality.so 模块添加到模块的 #PAM 基础堆栈 中,但默认情况下并非如此。

有关一些可能性,请参阅#安全参数配置

PAM 基础堆栈

/etc/pam.d/ 路径专门用于 PAM 配置,以将应用程序链接到各个系统的身份验证方案。在系统基础安装期间,它由以下内容填充

  • pambase 软件包,其中包含 Arch Linux 特定的 PAM 配置基础堆栈,供应用程序使用,以及
  • 其他基础软件包。例如,util-linux 为中央 login 和其他程序添加配置,shadow 软件包添加 Arch Linux 默认设置以保护和修改用户数据库(请参阅 用户和组)。

基础安装的不同配置文件链接在一起并在运行时堆叠。例如,在本地用户登录时,login 应用程序会获取 system-local-login 策略,而该策略又会获取其他策略

/etc/pam.d/
login -> system-local-login -> system-login -> system-auth

对于不同的应用程序,可能适用不同的路径。例如,openssh 安装其 sshd PAM 策略

/etc/pam.d/
sshd -> system-remote-login -> system-login -> system-auth

因此,堆栈中配置文件的选择很重要。对于上面的示例,可能需要仅对 sshd 或所有远程登录使用特殊的身份验证方法,方法是更改 system-remote-login;这两种更改都不会影响本地登录。将更改应用于 system-loginsystem-auth 将会影响本地和远程登录。

sshd 的示例一样,任何pam 感知应用程序都需要将其策略安装到 /etc/pam.d 中,以便正确集成并依赖 PAM 堆栈。如果应用程序未能这样做,则应用 /etc/pam.d/other 默认策略来拒绝并记录警告。

提示

PAM 在运行时动态链接。例如

$ ldd /usr/bin/login | grep pam
libpam.so.0 => /usr/lib/libpam.so.0 (0x000003d8c32d6000)
libpam_misc.so.0 => /usr/lib/libpam_misc.so.0 (0x000003d8c30d2000)

login 应用程序是 pam 感知的,因此必须具有策略。

PAM 软件包手册页 pam(8)pam.d(5) 描述了配置文件的标准化内容。特别是,它们解释了四个 PAM 组:帐户、身份验证、密码和会话管理,以及可用于配置模块堆叠和行为的控制值。

此外,广泛的文档安装在 /usr/share/doc/Linux-PAM/index.html 中,其中包含各种指南,以及每个标准模块的可浏览手册页。

警告: 对 PAM 配置的更改从根本上影响用户身份验证。错误的更改可能导致任何用户都无法登录,或者所有用户都能够登录。
提示: 更改对已通过身份验证的用户无效;使用 PAM 的一种方法是在测试机器上最好本地登录并进行开发,保持会话持续运行,同时从另一个控制台上的另一个用户检查结果。

示例

本文或本节的事实准确性存在争议。

原因: (1) nullok 的使用 (2) pam 处理可选模块的方式(在 Talk:PAM#PAM#示例的准确性 中讨论)

两个简短的示例来说明上述警告。

首先,我们从 历史 Arch 默认设置 中取出以下两行

/etc/pam.d/system-auth
auth      required  pam_unix.so     try_first_pass nullok
auth      optional  pam_permit.so

来自 pam_unix(8)

身份验证组件 pam_unix.so 执行检查用户凭据(密码)的任务。如果用户的官方密码为空白,则此模块的默认操作是不允许用户访问服务。

— 后者是 pam_permit.so 的用途。简单地交换两行的控制值 requiredoptional 就足以禁用密码身份验证,即任何用户都可以在不提供密码的情况下登录。

其次,作为相反的示例,根据 /etc/pam.d/loginpam_nologin.so 的默认配置,创建以下文件

# touch /etc/nologin

会导致除 root 之外的任何用户都无法登录(如果允许 root 登录,请参阅 Security#限制 root 登录)。要再次允许登录,请在从创建它的控制台注销之前再次删除该文件。

以此为背景,请参阅 #PAM 堆栈和模块配置 以了解特定用例的配置。

配置指南

本节概述了详细说明如何将更改应用于 PAM 配置以及如何将特殊的新 PAM 模块集成到 PAM 堆栈中的内容。请注意,通常可以通过删除 .so 扩展名来访问模块的手册页。

安全参数配置

以下各节描述了更改默认 PAM 参数配置的示例

展示了如何使用 pam_cracklib.so 强制执行强密码。
展示了如何使用 pam_faillock.so 配置登录尝试次数限制。
使用 pam_wheel.so 限制用户登录。
详细说明了如何使用 pam_limits.so 配置系统进程限制。
展示了通过 pam_env.so 设置环境变量的示例。

PAM 堆栈和模块配置

以下文章详细介绍了如何针对特殊用例更改 #PAM 基础堆栈

pam_mount
详细介绍了使用 pam_mount.so 在用户登录时自动挂载加密目录路径的示例。
ECryptfs#自动挂载
使用 pam_ecryptfs.so 自动挂载加密目录。
Dm-crypt/登录时挂载
展示了如何使用 pam_exec.so 在用户登录时执行自定义脚本。
Active Directory 集成#配置 PAM
使用 pam_winbind.sopam_krb5.so 让用户通过 Active Directory (LDAP, Kerberos) 服务进行身份验证。
LDAP 身份验证
是一篇关于使用 pam_ldap.so 集成 LDAP 客户端或服务器端身份验证的文章。
YubiKey#使用 PAM 进行 Linux 用户身份验证
描述了如何将 YubiKey 与 PAM 提供的 U2F (pam_u2f.so) 和专有的 Yubico OTP 实现 (pam_yubico.so) 一起使用
pam_oath
展示了使用 pam_oath.so 实现基于软件的双因素身份验证的示例。
fprint
使用 pam_fprintd.so 设置指纹身份验证。
pam_autologin
保存用户名和密码以自动登录。
pam_usb
展示了如何配置 pam_usb.so 以将 usb 设备用于可选的双因素身份验证。
SSH 密钥#pam_ssh
使用 pam_ssh.so 以远程用户身份进行身份验证。
pam_abl
解释了如何使用 pam_abl.so 限制通过 ssh 进行的暴力破解攻击。
EncFS
可以通过 pam_encfs.so 自动挂载。
Google Authenticator
展示了如何使用 pam_google_authenticator.so 设置双因素身份验证。
Very Secure FTP Daemon#使用虚拟用户的 PAM
解释了如何使用 pam_pwdfile.so 配置 FTP chroot 以对没有本地系统帐户的用户进行身份验证。

更多 PAM 软件包

除了到目前为止提到的那些软件包外,Arch 用户仓库 还包含许多额外的 PAM 模块和工具。

与 PAM 相关的通用实用程序是

  • Pamtester — 用于测试可插拔身份验证模块 (PAM) 功能的程序
https://pamtester.sourceforge.net/ || pamtesterAUR

请注意,AUR 具有 PAM 的关键字标签,但并非所有可用的软件包都更新为包含它。因此,可能需要搜索 软件包描述

技巧与诀窍

被锁定

如果 PAM 已将您锁定,可能是因为您多次输入错误的密码,请参阅 Security#三次登录尝试失败后锁定用户

参见