跳转到内容

LPI Linux 认证/PAM 身份验证

来自 Wikibooks,开放世界中的开放书籍

详细目标 (210.2)

[编辑 | 编辑源代码]

(LPIC-2 版本 4.5)


权重 3


描述: 候选人应该能够配置 PAM 以支持使用各种可用方法进行身份验证。 这包括基本的 SSSD 功能。


关键知识领域

  • PAM 配置文件、术语和实用程序。
  • passwd 和 shadow 密码。
  • 使用 sssd 进行 LDAP 身份验证。


术语和实用程序

  • /etc/pam.d
  • pam.conf
  • nsswitch.conf
  • pam_unix, pam_cracklib, pam_limits, pam_listfile, pam_sss
  • sssd.conf

== PAM 身份验证 == 测试

PAM(可插拔身份验证模块)是一种灵活的机制,用于对用户进行身份验证。

从 UNIX 的诞生之日起,对用户的身份验证就通过用户输入密码并系统检查输入的密码是否与存储在 /etc/passwd 中的加密官方密码相符来实现。 想法是,只有当用户能够正确输入他们的秘密密码时,他们才是真正的用户。

那是最初。 从那时起,许多新的用户身份验证方式变得流行起来。 包括对 /etc/passwd 文件的更复杂的替换,以及硬件设备智能卡等等。 问题是,每次开发新的身份验证方案时,都需要重新编写所有必要的程序(login、ftpd 等)以支持它。

PAM 提供了一种开发独立于身份验证方案的程序的方法。 这些程序需要“身份验证模块”在运行时附加到它们才能工作。 要附加哪个身份验证模块取决于本地系统设置,由本地系统管理员决定。

PAM 身份验证

Linux-PAM(用于 Linux 的可插拔身份验证模块)是一套共享库,使本地系统管理员能够选择应用程序如何对用户进行身份验证。

换句话说,无需(重写和)重新编译 PAM 感知应用程序,就可以在它使用的身份验证机制之间切换。 事实上,可以完全升级本地身份验证系统,而无需触碰应用程序本身。

从历史上看,需要对给定用户进行身份验证的应用程序必须编译以使用特定的身份验证机制。 例如,在传统的 UN*X 系统中,用户的身份由用户输入正确的密码进行验证。 此密码在加上两个字符的salt后,会被加密(使用 crypt(3))。 然后,如果此加密密码与系统密码数据库(/etc/passwd 文件)中用户条目的第二个字段相同,则对用户进行身份验证。 在此类系统上,大多数如果不是全部的特权都是根据这种单一身份验证方案授予的。 特权以个人用户标识符 (uid) 和对各种组的成员身份的形式出现。 根据用户的个人身份和组身份提供服务和应用程序。 传统上,组成员身份是根据 /etc/group 文件中的条目分配的。

PAM 身份验证

不幸的是,计算机速度的提高和基于网络的计算的广泛引入,使得曾经安全的身份验证机制(如这种机制)容易受到攻击。 鉴于此类现实,新的身份验证方法不断涌现。 Linux-PAM 项目的目的是将特权授予软件的开发与安全且适当的身份验证方案的开发分离。 这是通过提供一个函数库来实现的,应用程序可以使用该函数库来请求对用户进行身份验证。 此 PAM 库在本地使用系统文件 /etc/pam.conf(或位于 /etc/pam.d/ 中的一系列配置文件)进行配置,以通过本地可用的身份验证模块对用户请求进行身份验证。 模块本身通常位于 /lib/security 目录中,并采用动态加载的可执行文件形式(参见 dlopen(3))。

PAM 身份验证

概述

对于新手,我们首先考虑一个例子。 我们拿一个向用户提供服务的应用程序; login 就是这样的一个程序。 login 做两件事,它首先确定请求的用户是他们声称的那个人,然后向他们提供请求的服务:在 login 的情况下,服务是使用用户身份运行的命令 shell(bash、tcsh、zsh 等)。

传统上,前一个步骤是通过 login 应用程序提示用户输入密码,然后验证它是否与系统上的密码一致; 因此验证就系统而言用户是他们声称的那个人。 这是委托给 Linux-PAM 的任务。 从应用程序程序员(在本例中是编写 login 应用程序的人)的角度来看,Linux-PAM 处理了此身份验证任务 - 验证用户的身份。

PAM 身份验证

Linux-PAM 的灵活性在于,您可以(系统管理员)自由指定要使用的身份验证方案。 您有权为 Linux 系统上的任何/所有 PAM 感知应用程序设置方案。 也就是说,您可以从简单的信任(pam_permit)等简单方案到视网膜扫描、语音指纹和一次性密码相结合等复杂方案进行身份验证!

为了说明您面临的灵活性,请考虑以下情况:一位系统管理员(家长)希望提高其用户(孩子)的数学能力。 他们可以配置用户最喜欢的射击游戏(当然,它支持 PAM)来验证他们的身份,方法是要求他们提供两个小于 12 的随机数的乘积。 很明显,如果这款游戏还不错,他们很快就会学会乘法表。 随着他们的成长,身份验证可以升级到包括(长)除法!

PAM 身份验证

Linux-PAM 处理四种不同的(管理)任务类型。 这些是:身份验证管理; 帐户管理; 会话管理; 和密码管理。首选管理方案与应用程序行为之间的关联是通过相关 Linux-PAM 配置文件中的条目进行的。 管理功能由配置文件中指定的模块执行。

Linux-PAM 库会查询 PAM 配置文件的内容并加载适合应用程序的模块。 这些模块属于四种管理组之一,并按它们在配置文件中出现的顺序堆叠。 这些模块在被 Linux-PAM 调用时,会为应用程序执行各种身份验证任务。 通过使用应用程序提供的对话函数,可以交换用户需要或提供的文本信息。

PAM 身份验证

Linux-PAM 旨在为系统管理员提供很大的灵活性来配置其系统的特权授予应用程序。 由 Linux-PAM 控制的系统安全性的这些方面的本地配置包含在两个地方之一:单个系统文件 /etc/pam.conf; 或 /etc/pam.d/ 目录。

此文件中的 Linux-PAM 特定标记不区分大小写。 但是,模块路径区分大小写,因为它们指示文件名称并反映典型 Linux 文件系统的区分大小写性。 任何给定模块的参数的区分大小写性由每个模块依次定义。 除了下面描述的行之外,还提供了两个特殊字符以方便系统管理员:注释以“#”开头,一直延伸到下一行结束; 此外,模块规范行可以用转义换行符“\”扩展。

/etc/pam.conf 文件的通用配置行具有以下形式: : service-name module-type control-flag module-path args

PAM 身份验证

下面,我们将解释每个标记的含义。 配置 Linux-PAM 的第二种(也是最近采用的)方法是通过 /etc/pam.d/ 目录的内容。 在我们解释了上述标记的含义之后,我们将描述这种方法。


服务名称

与此条目关联的服务的名称。 通常,服务名称是给定应用程序的传统名称。 例如,“ftpd”、“rlogind”和“su”等。 有一个特殊的服务名称,保留用于定义默认身份验证机制。 它名为“OTHER”,可以使用小写或大写字符指定。 请注意,当为命名服务指定模块时,将忽略“OTHER”条目。

PAM 身份验证模块类型 (当前)四种模块类型之一。 四种类型如下:

auth; 此模块类型提供了对用户进行身份验证的两个方面。 首先,它通过指示应用程序提示用户输入密码或其他识别方式来确定用户是他们声称的那个人。 其次,该模块可以通过其凭据授予属性来授予组成员身份(独立于上面讨论的 /etc/groups 文件)或其他特权。

account; 此模块执行非身份验证的帐户管理。 它通常用于根据时间、当前可用的系统资源(最大用户数)或申请用户的地理位置(仅在控制台上登录“root”)来限制/允许访问服务。

session; 主要是,此模块与在用户可以获得服务之前/之后需要执行的操作相关联。 这些操作包括记录有关与用户打开/关闭某些数据交换的信息,挂载目录等。

password; 此最后一个模块类型是更新与用户关联的身份验证令牌所必需的。 通常,每个“挑战/响应”基于身份验证 (auth) 模块类型有一个模块。 PAM 身份验证

控制标志

控制标志用于指示 PAM 库将如何对与其关联的模块的成功或失败做出反应。 由于模块可以堆叠(同一类型的模块按顺序执行,一个接一个),因此控制标志决定每个模块的相对重要性。 应用程序不会意识到 `/etc/pam.conf' 文件中列出的各个模块的成功或失败。 相反,它从 Linux-PAM 库接收一个汇总的成功或失败响应。 这些模块的执行顺序是 /etc/pam.conf 文件中条目的顺序; 较早的条目在较晚的条目之前执行。 从 Linux-PAM v0.60 开始,此控制标志可以用两种语法之一定义。

控制标志的更简单(也是历史上的)语法是一个单独的关键字,用于指示与特定模块的成功或失败相关的严重性。 有四个这样的关键字:required、requisite、sufficient 和 optional。

PAM 身份验证

控制标志

Linux-PAM 库以以下方式解释这些关键字:required;这表示模块的成功对于模块类型设施的成功是必需的。此模块的失败在所有剩余的模块(相同模块类型)都执行之前不会对用户显现。

requisite;类似于 required,但是,如果这样的模块返回失败,则控制权直接返回给应用程序。返回值与第一个失败的 required 或 requisite 模块相关联。请注意,此标志可用于防止用户有机会在不安全的媒介上输入密码。可以想象,这种行为可能会通知攻击者系统上的有效帐户。应权衡这种可能性与在敌对环境中公开敏感密码的并非不重要的担忧。

sufficient;此模块的成功被认为“足以”让 Linux-PAM 库相信此模块类型已成功完成其目的。如果之前没有 required 模块失败,则不会调用更多此类型的“堆叠”模块。(请注意,在这种情况下,不会调用后续的 required 模块。)此模块的失败不被认为是满足应用程序已成功完成此模块类型的致命错误。

Optional;顾名思义,此控制标志将模块标记为对用户应用程序服务成功或失败并不重要。通常,Linux-PAM 在确定模块堆栈是否成功或失败时会忽略此类模块。但是,如果之前或后续堆叠模块没有明确的成功或失败,则此模块将决定对应用程序的响应的性质。后一种情况的一个示例是,当其他模块返回类似 PAM_IGNORE 的内容时。PAM 身份验证

控制标志 

更详细(较新)的语法更加具体,并为管理员提供了对用户身份验证方式的很大控制。这种形式的控制标志用方括号分隔,并包含一系列 value=action 标记

 [value1=action1 value2=action2 ...]

这里,valueI 是以下返回值之一:success;open_err;symbol_err;service_err;system_err;buf_err;perm_denied;auth_err;cred_insufficient;authinfo_unavail;user_unknown;maxtries;new_authtok_reqd;acct_expired;session_err;cred_unavail;cred_expired;cred_err;no_module_data;conv_err;authtok_err;authtok_recover_err;authtok_lock_busy;authtok_disable_aging;try_again;ignore;abort;authtok_expired;module_unknown;bad_item;和 default。其中最后一个(default)可用于为未明确定义的返回值设置操作。

actionI 可以是正整数或以下标记之一:ignore;ok;done;bad;die;和 reset。当将正整数 J 指定为操作时,它可以用于指示将跳过当前模块类型的下一个 J 个模块。通过这种方式,管理员可以开发一个具有多个不同执行路径的相当复杂的模块堆栈。可以根据各个模块的反应来确定选择哪条路径。

PAM 身份验证

ignore - 当与一组模块一起使用时,模块的返回状态不会影响应用程序获得的返回代码。

bad - 此操作表示应将返回代码视为模块失败的指示。如果此模块是堆栈中第一个失败的模块,则其状态值将用于整个堆栈。

die - 等同于 bad,并具有终止模块堆栈并立即将 PAM 返回给应用程序的副作用。

ok - 这告诉 PAM 管理员认为此返回代码应直接影响整个模块堆栈的返回代码。换句话说,如果堆栈的先前状态会导致返回 PAM_SUCCESS,则模块的返回代码将覆盖此值。请注意,如果堆栈的先前状态包含某些表示模块失败的值,则此“ok”值将不会用于覆盖该值。

done - 等同于 ok,并具有终止模块堆栈并立即将 PAM 返回给应用程序的副作用。

reset - 清除模块堆栈状态的所有内存,并从下一个堆叠模块开始重新开始。PAM 身份验证四个关键字中的每一个:required;requisite;sufficient;和 optional,在 [...] 语法方面都有等效的表达式。它们如下

required 等同于 [success=ok new_authtok_reqd=ok ignore=ignore default=bad]

requisite 等同于 [success=ok new_authtok_reqd=ok ignore=ignore default=die]

sufficient 等同于 [success=done new_authtok_reqd=done default=ignore]

optional 等同于 [success=ok new_authtok_reqd=ok default=ignore]

为了了解这种新语法的强大功能,这里提供了一些您可以使用它的示例。在 Linux-PAM-0.63 中,引入了客户端插件代理的概念。这使 PAM 能够使用客户端/服务器应用程序固有的传输协议支持机器到机器身份验证。使用 [ ... value=action ... ] 控制语法,应用程序可以被配置为支持与兼容客户端的二进制提示,但对于较旧的传统应用程序,可以优雅地转换为备用身份验证模式。

PAM 身份验证

Module-path

可动态加载的对象文件的路径名;可插拔模块本身。如果模块路径的第一个字符是“/”,则假定它是一个完整路径。如果不是这种情况,则给定的模块路径将附加到默认模块路径:/lib/security

Args

参数是调用模块时传递给模块的一系列标记。非常类似于典型 Linux shell 命令的参数。通常,有效参数是可选的,并且特定于任何给定的模块。无效参数被模块忽略,但是,当遇到无效参数时,模块需要向 syslog(3) 写入错误。有关通用选项的列表,请参见下一节。

在(一个或多个)配置文件中的任何未正确格式化的行通常倾向于(以谨慎为准)使身份验证过程失败。相应的错误将使用对 syslog(3) 的调用写入系统日志文件。

PAM 身份验证

基于目录的配置

从版本 0.56 开始,比单个配置文件更灵活,可以通过 /etc/pam.d/ 目录的内容配置 libpam。在这种情况下,目录中包含的文件每个文件都具有一个文件名,该文件名等于服务名称(小写):它是命名服务的个人配置文件。

Linux-PAM 可以编译为两种模式之一。首选模式使用 /etc/pam.d/ 或 /etc/pam.conf 配置,但不能同时使用两者。也就是说,如果存在 /etc/pam.d/ 目录,则 libpam 仅使用此目录中包含的文件。但是,如果不存在 /etc/pam.d/ 目录,则使用 /etc/pam.conf 文件(这可能是您首选发行版使用的模式)。另一种模式是按顺序使用 /etc/pam.d/ 和 /etc/pam.conf。在此模式下,/etc/pam.d/ 中的条目将覆盖 /etc/pam.conf 中的条目。/etc/pam.d/ 中每个文件的语法类似于 /etc/pam.conf 文件的语法,由以下形式的行组成

module-type control-flag module-path arguments 唯一的区别是服务名称不存在。服务名称当然是给定配置文件的名称。例如,/etc/pam.d/login 包含登录服务的配置。

PAM 身份验证

这种配置方法比单文件方法有很多优点。我们在此列出它们以帮助读者决定采用哪种方案

错误配置应用程序的可能性较低。手动编辑配置文件时,需要输入的字段少一个。

更易于维护。可以重新配置一个应用程序,而不会干扰系统上的其他应用程序。

可以将不同服务的配置文件符号链接到单个文件。这使得更容易在不同的应用程序之间保持一致的访问系统策略。(需要注意的是,为了节省空间,也可以将多个配置文件硬链接在一起。但是,在管理此安排时要谨慎,因为编辑硬链接文件可能会破坏链接。)

配置文件解析可能更快。当服务绑定到其模块时,仅解析相关的条目。可以使用文件系统的文件保护限制对各个 Linux-PAM 配置文件的读取访问。

包管理变得更简单。每次安装新应用程序时,都可以使用 /etc/pam.d/xxxxxx 文件作为伴随文件。

PAM 身份验证

以下是任何模块都可能理解的可选参数。参数(包括这些参数)通常是可选的。

Debug : 使用 syslog(3) 调用将调试信息记录到系统日志文件。

no_warn : Instruct module to not give warning messages to the application. 
use_first_pass : The module should not prompt the user for a password. Instead, it should obtain the previously typed password (from the preceding auth module), and use that. If that doesn't work, then the user will not be authenticated. (This option is intended for auth and password modules only). 
try_first_pass : The module should attempt authentication with the previously typed password (from the preceding auth module). If that doesn't work, then the user is prompted for a password. (This option is intended for auth modules only). 
use_mapped_pass : This argument is not currently supported by any of the modules in the Linux-PAM distribution because of possible consequences associated with U.S. encryption exporting restrictions. Within the U.S., module developers are, of course, free to implement it (as are developers in other countries).

expose_account : 通常,泄露有关用户帐户的一些信息对于模块来说不是安全的策略。有时,用户名或主目录或首选 shell 等信息可用于攻击用户的帐户。但是,在某些情况下,这种信息不被视为威胁:在安全的环境中,在要求用户输入密码时显示用户的全名也可以称为“友好”。expose_account 参数是一个标准模块参数,用于鼓励模块在本地管理员认为合适的情况下,对帐户信息少一些谨慎。

PAM 身份验证

示例配置文件条目

默认策略 : 如果要将系统视为安全系统,它最好具有一个相当安全的“OTHER”条目。以下是偏执设置(这是一个不错的起点!)

  1. default; 拒绝访问

OTHER auth required pam_deny.so OTHER account required pam_deny.so OTHER password required pam_deny.so OTHER session required pam_deny.so

虽然从根本上来说这是一个安全的默认值,但这对于错误配置的系统来说并不友好。例如,如果文件的其余部分写得不好,这样的系统很容易导致所有用户被锁定。pam_deny 模块并不十分复杂。例如,它在被调用时不会记录任何信息,因此,除非系统的用户在无法执行服务应用程序时联系管理员,否则管理员可能很长时间都不知道他的系统配置错误。

PAM 身份验证

在上述示例中的那些行之前添加以下行将为管理员提供适当的警告。

  1. default; 醒醒!此应用程序未配置

OTHER auth required pam_warn.so OTHER password required pam_warn.so

拥有两个 OTHER auth 行是堆叠的示例。在使用 /etc/pam.d/ 配置的系统上,可以使用以下文件实现相应的默认设置

  1. 默认配置:/etc/pam.d/other

auth required pam_warn.so auth required pam_deny.so account required pam_deny.so password required pam_warn.so password required pam_deny.so session required pam_deny.so

PAM 身份验证

在配置较低的安全级别,系统管理员希望对 Linux-PAM 的强大功能保持无知的情况下,以下行(位于 /etc/pam.conf 中)的选择很可能模拟出传统熟悉的 Linux 设置。

  1. default; 标准 UN*X 访问

OTHER auth required pam_unix.so OTHER account required pam_unix.so OTHER password required pam_unix.so OTHER session required pam_unix.so


PAM 认证关键词、文件和实用程序:/etc/pam.d /etc/pam.conf /lib/libpam.so.*


华夏公益教科书