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 不能用

    • 本地登录失败

相关推荐
i建模5 分钟前
华为MateBook X Pro 2020款在Ubuntu系统中提升音质
linux·ubuntu·华为
皮卡蛋炒饭.12 分钟前
进程间通信
linux·运维·服务器
小陈工14 分钟前
Python Web开发入门(十二):使用Flask-RESTful构建API——让后端开发更优雅
开发语言·前端·python·安全·oracle·flask·restful
艾莉丝努力练剑16 分钟前
【Linux系统:信号】线程安全不等于可重入:深度拆解变量作用域与原子操作
java·linux·运维·服务器·开发语言·c++·学习
楼田莉子18 分钟前
同步/异步日志系统:日志的工程意义及其实现思想
linux·服务器·开发语言·数据结构·c++
Echo-J23 分钟前
WinDbg 双机调试(调试机为Windows11系统,被调试机为Windows7系统)
安全·网络安全·云计算·系统安全
南湖北漠24 分钟前
记录生活中的一件小事(佚名整理)
网络·人工智能·计算机网络·其他·安全·生活
胖好白40 分钟前
【ZYNQ的Linux开发】移植Ubuntu根文件系统
linux·ubuntu
赵庆明老师1 小时前
Linux Docker打包
linux·运维·docker
Strange_Head1 小时前
《Linux系统编程篇》Linux Socket 网络编程03(Linux 进程间通信(IPC))——基础篇
linux·网络·单片机