如何在 Linux 中配置和使用 PAM
Linux-PAM(可插入身份验证模块的缩写,从 Unix-PAM 架构发展而来)是一套功能强大的共享库,用于动态地对应用程序(或服务)的用户进行身份验证)在Linux系统中。
它将多个低级身份验证模块集成到一个高级 API 中,为应用程序提供动态身份验证支持。这使得开发人员可以编写需要身份验证的应用程序,而与底层身份验证系统无关。
许多现代Linux发行版默认支持Linux-PAM(以下简称“PAM”)。在本文中,我们将解释如何在Ubuntu和CentOS系统中配置高级PAM。
在我们继续之前,请注意:
- 作为系统管理员,最重要的是掌握 PAM 配置文件如何定义应用程序(服务)和执行实际身份验证任务的可插入身份验证模块 (PAM) 之间的连接。您不一定需要了解 PAM 的内部工作原理。
- PAM 有可能严重改变 Linux 系统的安全性。错误的配置可能会部分或完全禁用对系统的访问。例如,意外删除 /etc/pam.d/* 和/或 /etc/pam.conf 下的配置文件可能会导致您无法使用自己的系统!
如何检查程序是否支持 PAM
要使用PAM,应用程序/程序需要“PAM 感知”;它需要专门编写和编译才能使用 PAM。要查明程序是否“PAM 感知”,请使用 ldd 命令检查该程序是否已使用 PAM 库进行编译。
例如 sshd:
sudo ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)
如何在 Linux 中配置 PAM
PAM 的主要配置文件是 /etc/pam.conf,/etc/pam.d/ 目录包含以下 PAM 配置文件:每个 PAM 感知的应用程序/服务。如果目录存在,PAM 将忽略该文件。
主配置文件的语法如下。该文件由单行编写的规则列表组成(您可以使用 “\ ”
转义字符扩展规则),注释前面带有 “# ”
标记并延伸到该行的下一个末端。
每个规则的格式是空格分隔的标记集合(前三个不区分大小写)。我们将在后续部分中解释这些标记。
service type control-flag module module-arguments
在哪里 :
- 服务:实际应用程序名称。
- 类型:模块类型/上下文/接口。
- control-flag:指示模块未能成功完成其身份验证任务时 PAM-API 的行为。
- 模块:PAM 的绝对文件名或相对路径名。
- 模块参数:用于控制模块行为的空格分隔的标记列表。
/etc/pam.d/ 中每个文件的语法与主文件的语法类似,由以下形式的行组成:
type control-flag module module-arguments
这是在 /etc/pam.d/sshd 文件中找到的规则定义示例(不带模块参数),该规则定义在 /etc/nologin 时禁止非 root 登录。强>存在:
account required pam_nologin.so
了解 PAM 管理组和控制标志
PAM 身份验证任务分为四个独立的管理组。这些组管理典型用户对受限服务的请求的不同方面。
模块与以下管理组类型之一关联:
- 账户:提供账户验证服务:用户密码是否过期?该用户是否被允许访问所请求的服务?
- 身份验证:对用户进行身份验证并设置用户凭据。
- password:负责更新用户密码,与认证模块配合。
- 会话:管理会话开始和结束时执行的操作。
PAM 可加载目标文件(模块)位于以下目录中:/lib/security/ 或 /lib64/security,具体取决于架构。
支持的控制标志是:
- 必要条件:故障立即将控制权返回给应用程序,指示第一个模块故障的性质。
- 必需:所有这些模块都需要成功,libpam才能将成功返回给应用程序。
- 足够:假设所有前面的模块都已成功,则此模块的成功会导致立即成功返回到应用程序(忽略此模块的失败)。
- 可选:一般不记录该模块的成功或失败。
除了上面的关键字之外,还有另外两个有效的控制标志:
- 包含和子堆栈:包含指定为该控件参数的配置文件中给定类型的所有行。
如何通过 PAM 限制 root 对 SSH 服务的访问
作为示例,我们将配置如何使用 PAM 来禁止 root 用户通过 SSH 和登录程序访问系统。在这里,我们希望通过限制对登录和 sshd 服务的访问来禁用 root 用户对系统的访问。
我们可以使用 /lib/security/pam_listfile.so 模块,该模块在限制特定帐户的权限方面提供了极大的灵活性。打开并编辑 /etc/pam.d/ 目录中目标服务的文件,如图所示。
sudo vim /etc/pam.d/sshd
OR
sudo vim /etc/pam.d/login
在两个文件中添加此规则。
auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ssh/deniedusers
解释一下上述规则中的标记:
- auth:是模块类型(或上下文)。
- required:是一个控制标志,表示如果使用该模块,则该模块必须通过,否则总体结果将失败,无论其他模块的状态如何。
- pam_listfile.so:是一个提供拒绝或允许基于任意文件的服务的方法的模块。
- onerr=succeed:模块参数。
- item=user:模块参数,指定文件中列出的内容以及应检查的内容。
- sense=deny:模块参数,指定在文件中找到该项目时要采取的操作,如果在文件中未找到该项目,则请求相反的操作。
- file=/etc/ssh/deniedusers:模块参数,指定每行包含一项的文件。
接下来,我们需要创建文件 /etc/ssh/deniedusers 并在其中添加名称 root:
sudo vim /etc/ssh/deniedusers
保存更改并关闭文件,然后为其设置所需的权限:
sudo chmod 600 /etc/ssh/deniedusers
从现在开始,上述规则将告诉 PAM 查阅 /etc/ssh/deniedusers 文件并拒绝任何列出的用户访问 SSH 和登录服务。
如何在 Linux 中配置高级 PAM
要编写更复杂的 PAM 规则,您可以使用以下形式的有效控制标志:
type [value1=action1 value2=action2 …] module module-arguments
其中 valueN 对应于定义该行的模块中调用的函数的返回代码。您可以从在线 PAM 管理员指南中找到支持的值。默认值是一个特殊值,这意味着所有 valueN 都没有明确提及。
actionN 可以采用以下形式之一:
- 忽略:如果此操作与模块堆栈一起使用,则模块的返回状态不会影响应用程序获取的返回代码。
- bad:表示返回代码应被视为模块失败的指示。如果该模块是堆栈中第一个失败的模块,则其状态值将用于整个堆栈的状态值。
- die:相当于bad,但可能会终止模块堆栈并且PAM立即返回到应用程序。
- ok:这指示 PAM 系统管理员认为此返回代码应直接贡献于整个模块堆栈的返回代码。
- done:相当于ok,但可能会终止模块堆栈,PAM 立即返回到应用程序。
- N(无符号整数):相当于ok,但可以跳过堆栈中接下来的N个模块。
- 重置:此操作会清除模块堆栈状态的所有内存,并重新启动下一个堆栈模块。
四个关键字中的每一个:必填;必要条件;充足的;并且可选,在 [...]
语法方面有一个等效的表达式,它允许您编写更复杂的规则,它们是:
- 必需:[success=ok new_authtok_reqd=okignore=ignore default=bad]
- 必要条件:[success=ok new_authtok_reqd=okignore=ignoredefault=die]
- 足够:[success=done new_authtok_reqd=done default=ignore]
- 可选:[success=ok new_authtok_reqd=ok default=ignore]
以下是现代 CentOS 7 系统的示例。让我们考虑一下 /etc/pam.d/postlogin PAM 文件中的这些规则:
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
session [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session [default=1] pam_lastlog.so nowtmp showfailed
session optional pam_lastlog.so silent noupdate showfailed
以下是 /etc/pam.d/smartcard-auth PAM 文件中的另一个示例配置:
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password required pam_pkcs11.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
有关更多信息,请参阅 pam.d 手册页:
man pam.d
最后,配置文件语法和所有 PAM 模块的全面描述可以在 Linux-PAM 文档中找到。
概括
PAM 是一个功能强大的高级 API,它允许依赖身份验证的程序对 Linux 系统中的应用程序的真实用户进行身份验证。它功能强大,但理解和使用起来非常具有挑战性。
在本文中,我们解释了如何在 Ubuntu 和 CentOS 中配置 PAM 的高级功能。如果您有任何问题或意见要分享,请使用下面的反馈表。