pam(1)-介绍

Linux PAM(Pluggable Authentication Modules,可插拔认证模块)是一个灵活的认证框架,用于在 Linux 系统上为应用程序提供统一的认证、账户管理和会话管理功能。它最初由 Sun Microsystems 开发,后来被广泛应用于 Linux 和其他类 Unix 系统。PAM 的核心思想是将认证逻辑从应用程序中分离出来,通过模块化的方式实现可配置性和可扩展性


PAM 的主要特点

  1. 模块化:PAM 使用独立的可插拔模块(如 pam_unix.sopam_limits.so)来实现不同的认证功能,管理员可以根据需求组合这些模块。
  2. 灵活性:通过配置文件,系统管理员可以为不同的应用程序(如 sshsudo)定制认证策略,而无需修改应用程序代码。
  3. 统一性:提供标准化的 API,应用程序只需调用 PAM 接口即可完成复杂的认证流程。
  4. 可扩展性:支持添加自定义模块以满足特定需求。

PAM 的组成部分

PAM 的工作依赖以下几个关键部分:

  1. PAM 库:提供 API,供应用程序调用。
  2. 配置文件
    • /etc/pam.conf:全局配置文件(较少使用)。
    • /etc/pam.d/:按服务命名的配置文件目录(如 /etc/pam.d/sshd),更常用。
  3. PAM 模块:位于 /lib/security//lib64/security/ 目录下,具体实现认证逻辑的动态库文件。
  4. 应用程序:如 loginsshdsudo 等,通过 PAM 完成用户认证。

PAM 的四种管理类型

PAM 将功能分为以下四类,每类由不同的模块处理:

  1. auth(认证):验证用户身份,例如检查用户名和密码。
  2. account(账户):检查账户状态,例如是否过期、是否被锁定。
  3. password(密码):处理密码更改或更新。
  4. session(会话):管理用户会话,例如记录登录日志或设置资源限制。

配置文件格式

PAM 配置文件通常包含以下字段:

类型  控制标志  模块路径  [模块参数]
  • 类型authaccountpasswordsession
  • 控制标志:决定模块执行的逻辑,如:
    • 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 的工作过程

  1. 应用程序(如 sshd)调用 PAM API。
  2. PAM 根据服务名读取对应的配置文件(如 /etc/pam.d/sshd)。
  3. 按配置文件中的顺序加载并执行模块栈。
  4. 每个模块返回成功或失败,PAM 根据控制标志决定最终结果。
  5. 将结果返回给应用程序,完成认证流程。

PAM架构
c186fdeccb804d1de130213a5f28c6bb.png

PAM调用过程
b742c8ec31735279ee9c6e8efad9d549.png

常用 PAM 模块

  • pam_unix.so:基于传统 /etc/passwd/etc/shadow 的认证。
  • pam_tally2.so:限制登录失败次数,防止暴力破解。
  • pam_limits.so:设置用户资源限制(如最大进程数)。
  • pam_env.so:设置环境变量。

优点与应用场景

  • 优点:PAM 提供了高度的可配置性和一致性,支持多种认证方式(如密码、指纹、LDAP 等)。
  • 应用场景:广泛用于登录认证(login)、远程访问(sshd)、权限提升(sudo)等。