PAM 认证模块¶
先决条件和假设¶
- 一台非关键的 Rocky Linux PC、服务器或虚拟机
- Root 访问权限
- 具备一定的 Linux 知识(非常有帮助)
- 渴望了解 Linux 上的用户和应用程序认证
- 能够承担自己行为的后果
简介¶
PAM (可插拔认证模块) 是 GNU/Linux 系统中允许许多应用程序或服务以集中方式对用户进行身份验证的系统。换句话说
PAM 是一套库,允许 Linux 系统管理员配置用户身份验证的方法。它提供了一种灵活且集中的方式,可以通过配置文件更改安全应用程序的身份验证方法,而无需更改应用程序代码。- 维基百科
本文档不旨在教您如何加固您的机器。它更像是一个参考指南,展示 PAM 可以做什么,而不是您应该做什么。
概述¶
身份验证是验证您是否是您声称的那个人的阶段。最常见的例子是密码,但其他形式的身份验证也存在。

实现新的身份验证方法不应该要求更改程序源代码或服务配置。这就是为什么应用程序依赖 PAM,它为它们提供了身份验证用户的必要*原语。
系统中的所有应用程序都可以完全透明地实现复杂的身份验证功能,例如 SSO (单点登录)、OTP (一次性密码) 或 Kerberos。系统管理员可以独立于应用程序,精确选择要用于单个应用程序(例如,用于加固 SSH 服务)的身份验证策略。
支持 PAM 的每个应用程序或服务将在 /etc/pam.d/ 目录中有一个对应的配置文件。例如,login 进程为其配置文件分配名称 /etc/pam.d/login。
* 原语字面意思是程序或语言的最简单元素,允许您在它们之上构建更复杂的东西。
警告
PAM 配置不当可能会危及整个系统的安全性。如果 PAM 存在漏洞,那么整个系统都将存在漏洞。请谨慎进行任何更改。
指令¶
指令用于设置应用程序以与 PAM 一起使用。指令将遵循此格式
mechanism [control] path-to-module [argument]
一个指令(完整一行)由一个机制(auth、account、password 或 session)、一个成功检查(include、optional、required 等)、模块路径,以及可能的参数(例如 revoke)组成。
每个 PAM 配置文件都包含一组指令。模块接口指令可以堆叠或放置在彼此之上。事实上,模块列出的顺序对于身份验证过程非常重要。
例如,这是配置文件 /etc/pam.d/sudo
#%PAM-1.0
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
机制¶
auth - 身份验证¶
这处理请求者的身份验证并建立账户的权限
-
通常通过将其与数据库中存储的值进行比较,或依赖于身份验证服务器来使用密码进行身份验证,
-
建立账户设置:uid、gid、组和资源限制。
account - 账户管理¶
检查请求的账户是否可用
- 与账户的可用性相关,原因不限于身份验证(例如,时间限制)。
session - 会话管理¶
与会话设置和终止相关
- 执行与会话设置相关的任务(例如,日志记录),
- 执行与会话终止相关的任务。
password - 密码管理¶
用于修改与账户关联的身份验证令牌(过期或更改)
- 更改身份验证令牌,并可能验证其是否足够健壮或尚未被使用。
控制指示符¶
PAM 机制(auth、account、session 和 password)指示 success 或 failure。控制标志(required、requisite、sufficient、optional)告诉 PAM 如何处理此结果。
required¶
所有 required 模块的成功完成都是必需的。
-
如果模块通过: 将执行链的其余部分。除非其他模块失败,否则请求将被允许。
-
如果模块失败: 将执行链的其余部分。最终将拒绝请求。
模块必须成功验证才能继续进行身份验证。如果标记为 required 的模块验证失败,用户将在验证完与该接口关联的所有模块后才会收到通知。
requisite¶
所有 requisite 模块的成功完成都是必需的。
-
如果模块通过: 将执行链的其余部分。除非其他模块失败,否则请求将被允许。
-
如果模块失败: 请求将立即被拒绝。
模块必须成功验证才能继续进行身份验证。但是,如果标记为 requisite 的模块验证失败,用户将立即收到一条消息,指示第一个 required 或 requisite 模块的失败。
sufficient¶
标记为 sufficient 的模块可用于在某些条件下“提前”允许用户登录
-
如果模块成功: 如果之前的模块均未失败,身份验证请求将立即被允许。
-
如果模块失败: 该模块将被忽略。将执行链的其余部分。
但是,如果标记为 sufficient 的模块检查成功,但标记为 required 或 requisite 的模块检查失败,则 sufficient 模块的成功将被忽略,请求将失败。
optional¶
模块被执行,但请求的结果被忽略。如果链中的所有模块都标记为 optional,所有请求都将始终被接受。
结论¶

PAM 模块¶
PAM 有很多模块。以下是最常见的模块
- pam_unix
- pam_ldap
- pam_wheel
- pam_cracklib
- pam_console
- pam_tally
- pam_securetty
- pam_nologin
- pam_limits
- pam_time
- pam_access
pam_unix¶
pam_unix 模块允许您管理全局身份验证策略。
在 /etc/pam.d/system-auth 中,您可能添加
password sufficient pam_unix.so sha512 nullok
此模块可以使用参数
nullok:在auth机制中允许空密码登录。sha512:在密码机制中,定义加密算法。debug:将信息发送到syslog。remember=n:使用此参数来记住最近使用的n个密码(与/etc/security/opasswd文件配合使用,该文件需要管理员创建)。
pam_cracklib¶
pam_cracklib 模块允许您测试密码。
在 /etc/pam.d/password-auth 中添加
password sufficient pam_cracklib.so retry=2
此模块使用 cracklib 库来检查新密码的强度。它还可以检查新密码是否不是从旧密码构建的。它仅影响密码机制。
默认情况下,此模块检查以下方面,并在符合条件时拒绝
- 新密码是否来自字典?
- 新密码是否与旧密码是回文(例如:azerty <> ytreza)?
- 用户是否仅更改了密码的大小写(例如:azerty <>AzErTy)?
此模块可能的参数
retry=n:强制进行n次新密码请求(默认为 1)。difok=n:强制要求至少n个字符(默认为10),与旧密码不同。如果新密码的字符有一半与旧密码不同,则新密码将被验证。minlen=n:强制要求至少n+1个字符的密码。您不能设置低于 6 个字符的最小值(模块已编译为如此)。
其他可能的参数
dcredit=-n:强制要求密码至少包含n个数字,ucredit=-n:强制要求密码至少包含n个大写字母,credit=-n:强制要求密码至少包含n个小写字母,ocredit=-n:强制要求密码至少包含n个特殊字符。
pam_tally¶
pam_tally 模块允许您根据不成功的登录尝试次数锁定账户。
此模块的默认配置文件可能如下所示: /etc/pam.d/system-auth
auth required /lib/security/pam_tally.so onerr=fail no_magic_root
account required /lib/security/pam_tally.so deny=3 reset no_magic_root
auth 机制接受或拒绝身份验证并重置计数器。
account 机制会增加计数器。
pam_tally 模块的一些参数包括
onerr=fail:增加计数器。deny=n:一旦超过n次不成功的尝试,账户将被锁定。no_magic_root:可用于拒绝由守护进程启动的 root 级服务的访问。- 例如,不要将此用于
su。
- 例如,不要将此用于
reset:如果身份验证成功,将计数器重置为 0。lock_time=nsec:账户将被锁定n秒。
此模块与不成功尝试的默认文件 /var/log/faillog(可以用参数 file=xxxx 替换)以及关联的命令 faillog 一起工作。
faillog 命令语法
faillog[-m n] |-u login][-r]
选项
m:在命令显示中定义不成功的最大尝试次数,u:指定一个用户,r:解锁用户。
pam_time¶
pam_time 模块允许您限制对 PAM 管理的服务的时间访问。
要激活它,请编辑 /etc/pam.d/system-auth 并添加
account required /lib/security/pam_time.so
配置在 /etc/security/time.conf 文件中完成
login ; * ; users ;MoTuWeThFr0800-2000
http ; * ; users ;Al0000-2400
指令的语法如下
services; ttys; users; times
在以下定义中,逻辑列表使用
&:是“和”逻辑。|:是“或”逻辑。!:表示否定,或“除…之外的所有”。*:是通配符。
列对应于
services:PAM 管理的服务逻辑列表,这些服务也将由此规则管理ttys:相关设备逻辑列表users:规则管理的用户逻辑列表times:授权时间段逻辑列表
如何管理时间段
- 天:
Mo、Tu、We、Th、Fr,、Sa、Su、Wk(周一至周五)、Wd(周六和周日)和Al(周一至周日) - 小时范围:
HHMM-HHMM - 重复会取消效果:
WkMo= 一周中的所有工作日(周一至周五),减去周一(重复)。
示例
- Bob,每天 07:00 到 09:00 之间可以通过终端登录,周三除外
login; tty*; bob; alth0700-0900
不允许登录,终端或远程,除了 root,每周的任何一天,在 17:30 到次日 7:45 之间
login; tty* | pts/*; !root; !wk1730-0745
pam_nologin¶
pam_nologin 模块禁用除 root 之外的所有账户
在 /etc/pam.d/login 中,您将输入
auth required pam_nologin.so
只有 root 可以连接,如果文件 /etc/nologin 存在且可读。
pam_wheel¶
pam_wheel 模块允许您将 su 命令的访问限制在 wheel 组的成员。
在 /etc/pam.d/su 中,您将输入
auth required pam_wheel.so
参数 group=my_group 将 su 命令的使用限制在 my_group 组的成员。
注意
如果 my_group 组为空,则系统上不再提供 su 命令,这会强制使用 sudo 命令。
pam_mount¶
pam_mount 模块允许您为用户会话挂载一个卷。
在 /etc/pam.d/system-auth 中,您将输入
auth optional pam_mount.so
password optional pam_mount.so
session optional pam_mount.so
挂载点在 /etc/security/pam_mount.conf 文件中配置
<volume fstype="nfs" server="srv" path="/home/%(USER)" mountpoint="~" />
<volume user="bob" fstype="smbfs" server="filesrv" path="public" mountpoint="/public" />
总结¶
现在,您应该对 PAM 的功能以及如何进行必要的更改有了更清晰的认识。然而,我们必须重申,对 PAM 模块进行的任何更改都要非常、非常谨慎。您可能会把自己锁在系统之外,或者更糟,让所有人都能进入。
我们强烈建议在易于恢复到先前配置的环境中测试所有更改。话虽如此,祝您玩得开心!
作者:Antoine Le Morvan
贡献者:Steven Spencer、Ezequiel Bruni、Ganna Zhyrnova