跳至内容

PAM 身份验证模块

先决条件和假设

  • 非关键的 Rocky Linux PC、服务器或虚拟机
  • Root 访问权限
  • 一些现有的 Linux 知识(会有很大帮助)
  • 学习 Linux 上的用户和应用程序身份验证的愿望
  • 能够接受自己行为的后果

简介

PAM(**可插入身份验证模块**)是 GNU/Linux 下的系统,它允许许多应用程序或服务以集中方式验证用户身份。换句话说

PAM 是一个库套件,允许 Linux 系统管理员配置用户身份验证的方法。它提供了一种灵活且集中化的方式,可以使用配置文件而不是更改应用程序代码来切换受保护应用程序的身份验证方法。 - 维基百科

本文档的目的不是教你如何加强你的机器。它更像是一个参考指南,向你展示 PAM可以做什么,而不是你应该做什么。

概况

身份验证是在验证你就是你声称的那个人身份的阶段。最常见的示例是密码,但还有其他形式的身份验证。

PAM generalities

实施新的身份验证方法不应该需要更改程序或服务配置的源代码。这就是应用程序依赖 PAM 的原因,PAM 为他们提供了进行用户身份验证所需的*原语*。

因此,系统中的所有应用程序都可以以完全透明的方式实现复杂的功能,例如**SSO**(单点登录)、**OTP**(一次性密码)或**Kerberos**。系统管理员可以完全独立于应用程序地为单个应用程序选择要使用哪种身份验证策略(例如,为了加强 SSH 服务)。

每个支持 PAM 的应用程序或服务都将在 /etc/pam.d/ 目录中有一个相应的配置文件。例如,进程 login 为其配置文件指定了名称 /etc/pam.d/login

* 原语实际上是程序或语言的最简单元素,允许你在它们之上构建更复杂和复杂的元素。

警告

PAM 配置错误会导致整个系统的安全性受到损害。如果 PAM 有漏洞,那么整个系统就会有漏洞。请谨慎更改任何设置。

指令

指令用于将应用程序设置为与 PAM 一起使用。指令将遵循以下格式

mechanism [control] path-to-module [argument]

一个指令(完整的一行)由一个机制authaccountpasswordsession)、一个成功检查includeoptionalrequired,...)、模块路径以及可能包含的参数(例如 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 机制(authaccountsessionpassword)指示 successfailure。控制标志(requiredrequisitesufficientoptional)告诉 PAM 如何处理此结果。

required

必须成功完成所有 required 模块。

  • 如果模块通过:将执行链的其余部分。除非其他模块失败,否则请求将被允许。

  • 如果模块失败:将执行链的其余部分。最后,请求将被拒绝。

必须成功验证模块才能继续认证。如果标记为 required 的模块的验证失败,则在验证与该接口关联的所有模块之前不会通知用户。

requisite

必须成功完成所有 requisite 模块。

  • 如果模块通过:将执行链的其余部分。除非其他模块失败,否则请求将被允许。

  • 如果模块失败:请求将立即被拒绝。

必须成功验证模块才能继续认证。但是,如果标记为 requisite 的模块的验证失败,则用户将立即收到一条消息,指示第一个 requiredrequisite 模块的失败。

sufficient

标记为 sufficient 的模块可用于在某些条件下让用户“提前”进入。

  • 如果模块成功:如果之前的任何模块都没有失败,则认证请求将立即被允许。

  • 如果模块失败:该模块将被忽略。将执行链的其余部分。

但是,如果标记为 sufficient 的模块检查成功,但标记为 requiredrequisite 的模块检查失败,则会忽略 sufficient 模块的成功,并且请求失败。

optional

将执行该模块,但请求的结果将被忽略。如果链中的所有模块都标记为 optional,则所有请求将始终被接受。

结论

Rocky Linux installation splash screen

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:授权时间段的逻辑列表

如何管理时间段

  • 天:MoTuWeThFr, SaSuWk(周一至周五)、Wd(周六和周日)以及 Al(周一至周日)
  • 每小时范围:HHMM-HHMM
  • 重复会取消效果:WkMo = 一周中的所有日子(M-F),减去周一(重复)。

示例

  • 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

如果 /etc/nologin 文件存在且可读,则只有 root 可以连接。

pam_wheel

pam_wheel 模块允许您将对 su 命令的访问限制为 wheel 组的成员。

/etc/pam.d/su 中,您将放置

auth required pam_wheel.so

参数 group=my_groupsu 命令的使用限制为 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