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-aware应用程序都需要将其策略安装到 /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-aware 的,因此必须有一个策略。
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 登录,请参阅 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.so
和pam_krb5.so
让用户通过 Active Directory (LDAP, Kerberos) 服务进行身份验证。 - LDAP 身份验证
- 是一篇关于使用
pam_ldap.so
集成 LDAP 客户端或服务器端身份验证的文章。 - YubiKey#使用 PAM 进行 Linux 用户身份验证
- 描述了如何将 U2F (
pam_u2f.so
) 和 YubiKey 提供的专有 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
- 解释了如何使用
pam_pwdfile.so
配置 FTP chroot 以验证没有本地系统帐户的用户的身份。
更多 PAM 软件包
除了到目前为止提到的软件包外,Arch 用户仓库还包含许多额外的 PAM 模块和工具。
与 PAM 相关的通用实用程序是
- Pamtester — 用于测试可插拔身份验证模块 (PAM) 功能的程序
请注意,AUR 具有 PAM 的关键字标签,但并非所有可用的软件包都已更新以包含它。因此,可能需要搜索软件包描述。
技巧与诀窍
被锁定
如果 PAM 将您锁定,可能是因为输入密码错误次数过多,请参阅 Security#在三次登录尝试失败后锁定用户。
参见
- linux-pam.org - 项目主页
- 理解和配置 PAM - 一篇入门文章
- 登录管理器:简介 - 在登录管理器的上下文中解释 PAM 的动机