如何在 Linux 中配置和使用 PAM如何在 Linux 中配置和使用 PAM如何在 Linux 中配置和使用 PAM如何在 Linux 中配置和使用 PAM
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

如何在 Linux 中配置和使用 PAM

发表 admin at 2025年2月28日
类别
  • 未分类
标签

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 的高级功能。如果您有任何问题或意见要分享,请使用下面的反馈表。

©2015-2025 Norria support@norria.com