PAM
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-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 中安装了 extensive 文档,其中包含各种指南,以及每个标准模块的可浏览手册页。
示例
以下是两个简短的示例,用于说明上述警告。
首先,我们从一个历史上的 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 的控制值就足以禁用密码认证,即任何用户都可以在不提供密码的情况下登录。
其次,作为反向示例,根据 pam_nologin.so 在 /etc/pam.d/login 中的默认配置,创建以下文件:
# 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 - 项目主页
- Understanding and configuring PAM - 入门文章
- Login managers: An introduction - 在登录管理器的上下文中阐述 PAM 的动机。