PAM
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 模块的文章/章节。注意,模块的 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_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 模块和工具:
- Pamtester — PAM 测试工具集
注意,AUR中有一个 PAM 关键词标签,但并不是所有可用的相关软件包都包含。因此,可能还是需要搜索软件包描述。
提示与技巧
被封锁
如果被 PAM 封锁,可能是密码输错太多次了,参见安全#在三次登录尝试失败后封锁用户。
参阅
- linux-pam.org⸺项目主页
- Understanding and configuring PAM⸺一篇入门文章
- Login managers: An introduction⸺结合显示管理器说明 PAM 的必要性