跳转到内容

PAM

来自 Arch Linux 中文维基

Linux 可插拔认证模块(PAM,Pluggable Authentication Modules)提供了系统级的用户认证框架。如下描述引用自项目介绍:

PAM 将程序开发与认证方式进行分离,程序在运行时调用附加的“认证模块”完成自己的工作。本地系统管理员可通过配置选择要使用哪些认证模块。

本文描述在 Arch Linux 下用于认证本地和远程用户的基础默认设置。对默认设置的更改在链接的专门文章内展开。

安装

pam包 包受 base包 元软件包依赖,默认已经安装在系统。PAM 模块放置于 /usr/lib/security 目录。

软件仓库中还包括其它一些可选的 PAM 包,详见 #配置方法。

配置文件

/etc 目录有多个子目录与 PAM 相关,使用命令 pacman -Ql pam | grep /etc 查看创建的默认配置文件。这些配置与模块的 #安全性参数或 #PAM 基础配置有关。

安全性参数

/etc/security 包含了对认证方法参数的系统级配置,基础安装使用上游默认配置。

注意 Arch Linux 没有对这些配置文件进行定制。例如 /etc/security/pwquality.conf 可用于配置系统级的密码强度要求,但需要手动将 pam_pwquality.so 模块加入到 #PAM 基础栈内(Arch Linux 默认没有包含该模块)。

详见 #安全性参数配置。

PAM 基础栈

/etc/pam.d/ 目录专门用于存放 PAM 配置,用于为具体的应用程序设置独立的认证方式。配置文件由以下安装包提供:

  • pambase包。包含供应用程序使用的特定于 Arch Linux 的 PAM 基础配置。
  • 其它基础包。例如 util-linux包 添加了为 login 及其它一些应用的认证配置, shadow包 提供 Arch Linux 默认的用户数据库认证方式(参见用户和用户组)。

基础安装的不同配置文件相互链接,在运行时“堆叠”,称为“PAM 栈”。例如,在用户登录时,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(pam-aware)的应用程序都需要在 /etc/pam.d 目录下安装的单独策略,以便正确集成并依赖 PAM 栈。否则应用程序将使用默认配置 /etc/pam.d/other,拒绝认证并在日志中记录警告。

提示:

接入 PAM 的程序在运行时动态链接 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 管理组⸺账户管理(account)、认证管理(auth)、密码管理(password)、会话管理(session)⸺和各种控制值(用于配置模块堆叠方式和行为)。

此外,详尽的文档安装在 /usr/share/doc/Linux-PAM/index.html,包含多个指南,其中提供每个标准模块的手册页。

警告:对 PAM 配置的修改会影响用户认证。不正确的修改可能导致所有用户都无法/都可以登录。
提示:更改对于已通过身份验证的用户无效;测试 PAM 的一种比较好的方法是在测试机器上本地登录并进行开发,保持会话持续运行,同时在另一个控制台用另一个用户测试结果。

配置方法

本节提供了一个目录,包括关于如何修改 PAM 配置和如何添加特殊的 PAM 模块的文章/章节。注意,模块的 man 手册通常与模块名一致(不包括 .so 后缀)。

安全性参数配置

下面的章节描述如何修改 PAM 默认参数配置:

更改允许空密码的默认设置。
使用 pam_crackib.so 强制使用强密码。
使用 pam_tally.so 限制尝试登录次数。
使用 pam_wheel.so 限制用户登录。
使用 pam_limits.so 来配置系统进程限制。
使用 pam_env.so 设置环境变量的示例。

PAM 栈和模块配置

下面的章节说明对于具体的用例,如何修改 #PAM 基础栈:

使用 pam_mount.so 在用户登录时自动挂载加密目录。
使用 pam_ecryptfs.so 自动挂载加密目录。
使用 pam_exec.so 在用户登录时执行自定义脚本。
使用 pam_winbind.so 和 pam_krb5.so 通过活动目录(LDAP、Kerberos)服务进行用户认证。
使用 pam_ldap.so 集成 LDAP 客户端或服务端认证。
使用 U2F(pam_u2f.so)和 YubiKey 提供的专有 Yubico OTP 实现(pam_yubico.so)。
使用 pam_oath.so 进行软件双因素认证。
使用 pam_fprintd.so 进行指纹认证。
保存用户名和密码以自动登录。
使用 pam_usb.so 通过 USB 设备进行(可作为双因素)认证。
使用 pam_ssh.so 认证远程用户身份。
使用 pam_abl.so 限制通过 ssh 的暴力破解攻击。
使用 pam_encfs.so 自动挂载加密目录。
使用 pam_google_authenticator.so 进行双因素认证。
使用 pam_pwdfile.so 配置 FTP chroot,以便在没有本地系统账户的情况下对用户进行身份验证。

更多 PAM 包

除了上面提到的包,AUR 中还包括许多另外的 PAM 模块和工具:

https://pamtester.sourceforge.net/ || pamtesterAUR

注意,AUR中有一个 PAM 关键词标签,但并不是所有可用的相关软件包都包含。因此,可能还是需要搜索软件包描述。

提示与技巧

被封锁

如果被 PAM 封锁,可能是密码输错太多次了,参见安全#在三次登录尝试失败后封锁用户。

参阅