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 为例)
-
用户输入用户名
-
sshd 调用 PAM
-
执行
/etc/pam.d/sshd -
执行
auth模块链(验证密码) -
执行
account模块链(检查账号状态) -
执行
session模块链(记录日志等) -
登录成功
退出时:
- 执行 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 不能用
-
本地登录失败
-