PAM 高级选项究竟是如何工作的?

pgo*_*etz 3 linux authentication pam

我一直在阅读我可以在 PAM 上找到的所有内容(例如http://wpollock.com/AUnix2/PAM-Help.htm),但是我仍然对高级选项应该如何精确工作感到困惑。例如,每个参考资料都是这样说的:

Each of the four control-flag keywords (required, requisite, sufficient, and
optional) have an equivalent expression in terms of the [...] syntax:

required
    [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
Run Code Online (Sandbox Code Playgroud)

我的理解是模块可以返回多种令牌,并且与每个令牌关联的操作在配置文件中进行了描述。基于这种理解,什么是

new_authtok_reqd=ok
Run Code Online (Sandbox Code Playgroud)

所需的控制标志有关吗?的意义/目的是什么

ignore=ignore ?
Run Code Online (Sandbox Code Playgroud)

仅此而已:

success=ok
Run Code Online (Sandbox Code Playgroud)

是我认为符合要求的行为,但确实如此

default=bad
Run Code Online (Sandbox Code Playgroud)

意味着如果模块返回任何其他操作令牌,模块将失败?是行动=值令牌成功= OK的否决默认=坏,反之亦然?哪个优先?从我读过的任何内容中都不清楚。

更一般地说,假设我有类似的东西

[success=done default=die]
Run Code Online (Sandbox Code Playgroud)

如果模块返回成功和另一个令牌会发生什么?

最后,我也找不到这个问题的答案:每个值都ok, done, bad, die, ignore, reset, N可以与任何操作相关联吗?甚至是什么意思说

[default=done] ?
Run Code Online (Sandbox Code Playgroud)

ua2*_*a2b 8

PAM 模块有超过 30 个不同的返回值,它们被映射到整个 PAM 堆栈的通过失败,如配置所述。

值得注意的是,PAM 模块的行为可能会因调用它的上下文(身份验证、帐户、密码、会话)而异。

方括号中的value = action对描述了对 PAM 模块的每个可能的返回值采取的操作。

通过仔细阅读上述页面到最后,可以找到对价值观和行动的很好的解释。

  • success=ok该模块返回成功,这将在整个PAM堆栈的评估兑现,如果没有前面的模块出现故障,可以考虑通过对整个堆到这一点。
  • new_authtok_reqd=ok需要新的身份验证令牌。例如,在会话上下文中,这可能会使用户更改她/他的密码。
  • ignore=ignore PAM 模块希望它的结果被忽略,所以我们忽略它。
  • default=bad 所有其他结果使 PAM 堆栈失败(但不要停止处理后续模块)

如果模块返回成功和另一个令牌会发生什么?

PAM 模块只返回一个值。

最后,我也找不到这个问题的答案:每个值都可以,完成,坏,死,忽略,重置,N 可以与任何操作相关联吗?甚至是什么意思说

[default=done] ?

这意味着:此处未提及的任何令牌(即每个可能的令牌)结束 PAM 堆栈的处理并返回到目前为止的结果。


pgo*_*etz 5

首先,ua2b 提供了导致我困惑的关键答案:

PAM 模块每次调用只能返回一个状态值

由于模块只能返回一个状态代码,很明显,任何括号中的一组值/动作对的动作是明确的。我认为一个模块可以一次返回多个状态代码(基于阅读各种文档),因此我很困惑。令人难以置信的是,我找不到任何参考资料,包括官方文档,都无法清楚地说明这一点。相反,人们会发现这样的评论:

每个 PAM-API 例程都会返回一个或多个状态代码。

这对我来说听起来像是一个模块可以返回几个状态代码。只有在阅读 PAM 模块开发人员指南后,我才意识到状态代码作为单个整数返回,该整数映射到此处描述的可能状态代码值 (是的,相同的参考!)

我的下一个问题是关于等同老式的控制标志关键字做需要用此方括号语法:

[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
Run Code Online (Sandbox Code Playgroud)

这种等价性在所有地方都重复出现,例如这里

事实证明,这完全是胡说八道。任何特定模块返回的状态代码可能不同,并且根据管理组类型(例如身份验证与帐户)再次不同。

pam_securetty 模块为例。此模块仅提供auth类型,并具有以下可能的状态码返回值:

PAM_SUCCESS
PAM_AUTH_ERR
PAM_INCOMPLETE
PAM_SERVICE_ERR
PAM_USER_UNKNOWN
Run Code Online (Sandbox Code Playgroud)

因此,ignore=ignore值/操作映射似乎是无用的,因为该模块永远不会返回 ignore。在这种情况下,您可能需要考虑使用user_unknown=ignoreif 事实上如果无法找到用户,您确实希望忽略结果。