如何在 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
在哪里:
- service:实际的应用程序名称。
- 类型:模块类型/上下文/接口。
- control-flag:指示模块未能成功完成身份验证任务时 PAM-API 的行为。
- module:PAM 的绝对文件名或相对路径名。
- module-arguments:用于控制模块行为的标记的空格分隔列表。
/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,具体取决于体系结构。
支持的控制标志有:
- requisite:失败立即将控制权返回给应用程序,指示第一个模块故障的性质。
- 必需:需要所有这些模块才能使libpam成功向应用程序返回成功。
- 充分:假设所有前面的模块都已成功,则该模块的成功将导致立即成功返回应用程序(该模块的失败将被忽略)。
- 可选:此模块的成功或失败通常不被记录。
除了上面的关键字之外,还有另外两个有效的控制标志:
- include 和 substack:包含配置文件中指定类型的所有行,作为此控件的参数。
如何通过 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 管理员指南中找到支持的值。特殊值是 default,它表示所有未明确提及的 valueN。
actionN可以采用以下形式之一:
- 忽略:如果此操作与模块堆栈一起使用,则模块的返回状态将不影响应用程序获得的返回代码。
- bad:表示返回代码应被视为模块失败的指示。如果此模块是堆栈中第一个失败的模块,则其状态值将用于整个堆栈的状态。
- die:相当于 bad 但可能会终止模块堆栈并且 PAM 立即返回到应用程序。
- ok:这指示 PAM,系统管理员认为此返回代码应该直接影响整个模块堆栈的返回代码。
- done:相当于ok,但可能会终止模块堆栈和 PAM 立即返回到应用程序。
- N(无符号整数):相当于ok,但可能会跳过堆栈中的下N个模块。
- 重置:此操作将清除模块堆栈状态的所有内存并使用下一个堆叠模块重新启动。
这四个关键字:required、requisite、sufficient 和optional,在语法上都有一个等效的表达式[...]
,允许您编写更复杂的规则,它们是:
- 必需:[成功=ok new_authtok_reqd=ok 忽略=忽略 默认=坏]
- 要求:[成功=ok new_authtok_reqd=ok 忽略=忽略 默认=die]
- 足够:[成功=完成 new_authtok_reqd=完成 默认=忽略]
- 可选:[成功=ok new_authtok_reqd=ok 默认=忽略]
以下是现代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
最后,可以在Linux-PAM 文档中找到配置文件语法和所有 PAM 模块的全面描述。
概括
PAM是一个功能强大的高级 API,它允许依赖于身份验证的程序向 Linux 系统中的应用程序提供真实用户。它功能强大,但理解和使用起来非常具有挑战性。
在本文中,我们解释了如何在 Ubuntu 和 CentOS 中配置 PAM 的高级功能。如果您有任何问题或意见要分享,请使用下面的反馈表。