PAM
Linux Pluggable Authentication Modules (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-login 或 system-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 中,其中包含各种指南,还有可浏览的标准模块手册页。
示例
下面是两个简短的例子来说明上述警告。
首先,我们从一个历史上的 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 的用途。只需交换这两行的控制值 required 和 optional 即可禁用密码认证,即任何用户都可以登录而不提供密码。
其次,作为反例,在 /etc/pam.d/login 中,pam_nologin.so 的默认配置是,创建以下文件:
# touch /etc/nologin
将导致除 root 之外的任何用户都无法登录(如果允许 root 登录,请参见 安全#限制 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#Auto-mounting
- 使用
pam_ecryptfs.so自动挂载加密目录。 - Dm-crypt/Mounting at login
- 展示了如何使用
pam_exec.so在用户登录时执行自定义脚本。 - Active Directory integration#Configuring PAM
- 使用
pam_winbind.so和pam_krb5.so让用户通过 Active Directory (LDAP, Kerberos) 服务进行认证。 - LDAP 认证
- 是一篇关于将 LDAP 客户端或服务器端认证与
pam_ldap.so集成的文章。 - YubiKey#Linux user authentication with PAM
- 介绍了如何使用 YubiKey 提供的 U2F (
pam_u2f.so) 和专有的 Yubico OTP 实现 (pam_yubico.so) 与 PAM 集成。 - pam_oath
- 展示了使用
pam_oath.so实现基于软件的双因素认证的示例。 - fprint
- 使用
pam_fprintd.so设置指纹认证。 - pam_autologin
- 保存用户名和密码以自动登录。
- pam_usb
- 展示了如何配置
pam_usb.so使用 USB 设备进行(可选的双因素)认证。 - SSH keys#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 with virtual users
- 解释了如何使用
pam_pwdfile.so配置 FTP chroot 以认证没有本地系统账户的用户。
其他 PAM 包
除了前面提到的包之外,Arch 用户仓库还包含许多其他的 PAM 模块和工具。
与 PAM 相关的通用实用程序是
- Pamtester — 用于测试可插拔认证模块 (PAM) 功能的程序
请注意,AUR 为 PAM 提供了一个关键字标签,但并非所有可用包都已更新以包含它。因此,可能需要搜索包描述。
技巧与提示
被锁定
如果 PAM 将您锁定,可能是因为输入密码错误次数过多,请参阅 安全#登录失败三次后锁定用户。
参见
- linux-pam.org - 项目主页
- 理解和配置 PAM - 入门文章
- 登录管理器:简介 - 在登录管理器的上下文中解释 PAM 的动机。