Linux PAM(Pluggable Authentication Modules)完整指南——从入门原理到进阶机制,再到实战配置

Linux PAM(Pluggable Authentication Modules)完整指南

------从入门原理到进阶机制,再到实战配置

1. PAM 入门:它是什么、为什么存在、解决了什么问题?

1.1 PAM 是什么?

PAM(可插拔认证模块)是 Linux 的统一认证框架。 它的核心思想是:

应用程序不负责认证逻辑,只调用 PAM;认证方式由 PAM 模块链决定。

例如:

  • sshd 不验证密码,它调用 PAM

  • sudo 不验证密码,它调用 PAM

  • login 不验证密码,它调用 PAM

认证方式(本地密码、LDAP、指纹、二次认证)都由 PAM 配置文件决定。

1.2 为什么需要 PAM?

没有 PAM 时,每个程序都要自己实现认证逻辑:

  • 密码验证

  • 账号是否过期

  • 是否允许从某个 IP 登录

  • 是否需要二次认证

这导致:

  • 重复造轮子

  • 难以统一管理

  • 修改认证方式需要改多个程序

PAM 让所有程序共享一套认证体系。

1.3 PAM 的四大模块类型(必须理解)

PAM 的配置文件中,每一行都属于以下四类之一:

  • auth:身份认证(密码、二次认证等)

  • account:账号状态检查(是否过期、是否允许登录)

  • password:密码修改策略(复杂度、历史密码)

  • session:会话管理(登录/退出时执行的操作)

这四类模块构成了完整的认证流程。

2. PAM 进阶:配置文件结构、控制标志、执行流程

2.1 PAM 配置文件在哪里?

所有配置文件都在:

代码

复制代码
/etc/pam.d/

每个服务都有自己的配置文件,例如:

  • /etc/pam.d/sshd

  • /etc/pam.d/sudo

  • /etc/pam.d/login

Debian/Ubuntu 还有四个"公共配置":

  • common-auth

  • common-account

  • common-password

  • common-session

服务文件通常会包含它们:

代码

复制代码
@include common-auth

2.2 配置文件的语法结构

每一行的格式:

代码

复制代码
<模块类型>  <控制标志>  <模块>  [参数...]

示例:

代码

复制代码
auth required pam_unix.so nullok

含义:

  • auth:身份认证

  • required:必须成功

  • pam_unix.so:使用本地密码认证

  • nullok:允许空密码

2.3 控制标志(Control Flags)------PAM 的"跳转规则"

控制标志决定当前模块成功或失败时,后续模块如何执行。

① required
  • 必须成功,否则最终失败

  • 即使失败,也继续执行后续模块(不暴露失败点)

② requisite
  • 必须成功

  • 失败立即中断整个认证流程

③ sufficient
  • 成功即可跳过后续模块

  • 常用于多种认证方式并存时

④ optional
  • 成功失败都不影响整体结果

  • 常用于日志类模块

⑤ 复杂控制语法(跳转式)

例如:

代码

复制代码
auth [success=1 default=ignore] pam_unix.so

含义:

  • 成功 → 跳过下一行

  • 失败 → 忽略,继续执行下一行

这是 PAM 最强大的机制。

2.4 PAM 的执行流程(以 SSH 为例)

  1. 用户输入用户名

  2. sshd 调用 PAM

  3. 执行 /etc/pam.d/sshd

  4. 执行 auth 模块链(验证密码)

  5. 执行 account 模块链(检查账号状态)

  6. 执行 session 模块链(记录日志等)

  7. 登录成功

退出时:

  • 执行 session 的"关闭"逻辑(卸载、清理)

3. PAM 实战:常用模块、典型配置、真实案例

3.1 常用 PAM 模块

身份认证类(auth)

  • pam_unix.so:本地密码认证

  • pam_google_authenticator.so:二次认证

  • pam_faillock.so:失败次数限制

账号检查类(account)

  • pam_time.so:限制登录时间

  • pam_access.so:限制登录来源

密码策略类(password)

  • pam_pwquality.so:密码复杂度

  • pam_cracklib.so:密码强度检查

会话管理类(session)

  • pam_limits.so:资源限制

  • pam_lastlog.so:显示上次登录

  • pam_mkhomedir.so:自动创建 home 目录

3.2 实战案例 1:为 SSH 添加二次认证(TOTP)

步骤 1:安装 Google Authenticator

代码

复制代码
apt install libpam-google-authenticator

步骤 2:为用户生成密钥

代码

复制代码
google-authenticator

步骤 3:修改 PAM 配置

编辑 /etc/pam.d/sshd

代码

复制代码
auth required pam_google_authenticator.so

步骤 4:修改 SSH 配置

编辑 /etc/ssh/sshd_config

代码

复制代码
ChallengeResponseAuthentication yes

步骤 5:重启 SSH

代码

复制代码
systemctl restart sshd

效果:

  • 登录时先输入密码

  • 再输入动态验证码

3.3 实战案例 2:限制用户只能在工作时间登录

编辑 /etc/security/time.conf

代码

复制代码
login;*;alice;MoTuWeThFr0800-1800

编辑 /etc/pam.d/login

代码

复制代码
account required pam_time.so

效果:

  • 用户 alice 只能在工作日 8:00--18:00 登录

3.4 实战案例 3:限制 SSH 登录来源 IP

编辑 /etc/security/access.conf

代码

复制代码
-:ALL EXCEPT root:192.168.1.0/24

编辑 /etc/pam.d/sshd

代码

复制代码
account required pam_access.so

效果:

  • 只有内网 IP 可以登录

  • root 不受限制

3.5 实战案例 4:登录失败 5 次锁定 10 分钟

编辑 /etc/pam.d/system-auth(CentOS):

代码

复制代码
auth required pam_faillock.so preauth silent deny=5 unlock_time=600
auth [success=1 default=bad] pam_unix.so
auth required pam_faillock.so authfail deny=5 unlock_time=600

效果:

  • 密码错误 5 次 → 锁定 10 分钟

4. PAM 调试与安全注意事项

4.1 查看日志

Debian/Ubuntu:

代码

复制代码
/var/log/auth.log

RHEL/CentOS:

代码

复制代码
/var/log/secure

4.2 开启调试模式

例如:

代码

复制代码
auth required pam_unix.so debug

日志会非常详细。

4.3 修改 PAM 的安全建议

  • 永远不要在生产机上直接改

  • 保留一个 root 已登录的终端

  • 改错可能导致:

    • SSH 登录不上

    • sudo 不能用

    • 本地登录失败

相关推荐
圥忈&&丅佽&&扗虖2 小时前
ubuntu 安装git
linux·git·ubuntu
萤丰信息2 小时前
科技赋能・智慧引领:新时代智慧园区系统性建设与高质量发展路径
人工智能·科技·安全·重构·智慧城市·智慧园区
Mr_sun.2 小时前
Mac中通过PD安装Rockly、Centos版本的linux并设置静态ip与安装Docker
linux·macos·centos
爱装代码的小瓶子2 小时前
【c++与Linux进阶】线程篇 -互斥锁
linux·c++·算法
glartchen2 小时前
🛡️ 安全实验室:MS08-067 漏洞复现与防御深度实践
安全·黑客
湛生2 小时前
pikachu通关笔记
笔记·计算机网络·安全·web安全·网络安全·bp
ren049182 小时前
Linux基础
linux·运维·服务器
研究点啥好呢2 小时前
3月13日GitHub热门项目推荐 | AI代理的安全思考
人工智能·安全·网络安全·ai·github·openclaw
Wyawsl2 小时前
Linux系统安全
linux·运维·系统安全