pam(1)-介绍
Linux PAM(Pluggable Authentication Modules,可插拔认证模块)是一个灵活的认证框架,用于在 Linux 系统上为应用程序提供统一的认证、账户管理和会话管理功能。它最初由 Sun Microsystems 开发,后来被广泛应用于 Linux 和其他类 Unix 系统。PAM 的核心思想是将认证逻辑从应用程序中分离出来,通过模块化的方式实现可配置性和可扩展性。
PAM 的主要特点
- 模块化:PAM 使用独立的可插拔模块(如
pam_unix.so
、pam_limits.so
)来实现不同的认证功能,管理员可以根据需求组合这些模块。 - 灵活性:通过配置文件,系统管理员可以为不同的应用程序(如
ssh
、sudo
)定制认证策略,而无需修改应用程序代码。 - 统一性:提供标准化的 API,应用程序只需调用 PAM 接口即可完成复杂的认证流程。
- 可扩展性:支持添加自定义模块以满足特定需求。
PAM 的组成部分
PAM 的工作依赖以下几个关键部分:
- PAM 库:提供 API,供应用程序调用。
- 配置文件:
/etc/pam.conf
:全局配置文件(较少使用)。/etc/pam.d/
:按服务命名的配置文件目录(如/etc/pam.d/sshd
),更常用。
- PAM 模块:位于
/lib/security/
或/lib64/security/
目录下,具体实现认证逻辑的动态库文件。 - 应用程序:如
login
、sshd
、sudo
等,通过 PAM 完成用户认证。
PAM 的四种管理类型
PAM 将功能分为以下四类,每类由不同的模块处理:
auth
(认证):验证用户身份,例如检查用户名和密码。account
(账户):检查账户状态,例如是否过期、是否被锁定。password
(密码):处理密码更改或更新。session
(会话):管理用户会话,例如记录登录日志或设置资源限制。
配置文件格式
PAM 配置文件通常包含以下字段:
类型 控制标志 模块路径 [模块参数]
- 类型:
auth
、account
、password
或session
。 - 控制标志:决定模块执行的逻辑,如:
required
:必须成功,但失败时继续执行后续模块, 。requisite
:必须成功,失败时立即中止。sufficient
:成功即可通过,后续模块可跳过。optional
:可选,结果不影响整体。
- 模块路径:如
/lib/security/pam_unix.so
。 - 模块参数:模块特定的配置选项。
示例(/etc/pam.d/sshd
):
auth required pam_unix.so
auth required pam_tally2.so deny=3
account required pam_unix.so
session optional pam_limits.so
PAM 的工作过程
- 应用程序(如
sshd
)调用 PAM API。 - PAM 根据服务名读取对应的配置文件(如
/etc/pam.d/sshd
)。 - 按配置文件中的顺序加载并执行模块栈。
- 每个模块返回成功或失败,PAM 根据控制标志决定最终结果。
- 将结果返回给应用程序,完成认证流程。
PAM架构
PAM调用过程
常用 PAM 模块
pam_unix.so
:基于传统/etc/passwd
和/etc/shadow
的认证。pam_tally2.so
:限制登录失败次数,防止暴力破解。pam_limits.so
:设置用户资源限制(如最大进程数)。pam_env.so
:设置环境变量。
优点与应用场景
- 优点:PAM 提供了高度的可配置性和一致性,支持多种认证方式(如密码、指纹、LDAP 等)。
- 应用场景:广泛用于登录认证(
login
)、远程访问(sshd
)、权限提升(sudo
)等。