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

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]

我的理解是,模块可以返回各种令牌,并且与每个令牌相关的操作在配置文件中描述。基于这种理解,

new_authtok_reqd=ok

与...有关必需的控制标志?

ignore=ignore ?

仅此一点:

success=ok

我认为这符合必需的行为,但确实

default=bad

是否意味着如果模块返回任何其他操作令牌,模块就会失败?动作=值令牌成功=确定被否决默认=坏还是相反?哪个优先?从我读过的任何资料来看,这并不清楚。

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

[success=done default=die]

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

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

[default=done] ?

答案1

PAM 模块有 30 多个不同的返回值,它们映射到经过或者失败如配置中所述,整个 PAM 堆栈。

值得注意的是,PAM 模块的行为可能根据其被调用的上下文(身份验证、帐户、密码、会话)而有所不同。

价值=行动方括号中描述针对 PAM 模块的每个可能的返回值采取什么操作。

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

  • success=ok模块返回成功,这将在整个 PAM 堆栈的评估中得到尊重,如果前面的模块都没有失败,则考虑经过对于到目前为止的整个堆栈。
  • new_authtok_reqd=ok需要新的身份验证令牌。例如会议这可能会让用户更改他的密码。
  • ignore=ignorePAM 模块希望其结果被忽略,因此我们忽略它。
  • default=bad所有其他结果都会导致 PAM 堆栈失败(但不会停止处理后续模块)

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

PAM 模块仅返回一个值。

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

[default=done] ?

这意味着:任何这里未提及的标记(即每个可能的标记)都会结束 PAM 堆栈的处理并返回迄今为止的结果。

答案2

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

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

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

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

对我来说这听起来像一个模块可以返回一些状态代码。在阅读完 PAM 模块开发人员指南后,我才意识到状态代码以单个整数的形式返回,该整数映射到可能的状态代码值,如所述这里 (是的,同一个参考!)

我的下一个问题与将旧式控制标志关键字等同起来有关必需的使用以下方括号语法:

[success=ok new_authtok_reqd=ok ignore=ignore default=bad]

这种等价性在各处都有重复,例如这里

事实证明,这完全是胡说八道。任何特定模块返回的状态代码可能会有所不同,并且根据管理组类型(例如 auth 与 account)的不同而不同。

举例来说,pam_securetty 模块.本模块仅提供授權类型,并具有以下可能的状态代码返回值:

PAM_SUCCESS
PAM_AUTH_ERR
PAM_INCOMPLETE
PAM_SERVICE_ERR
PAM_USER_UNKNOWN

因此,值ignore=ignore/动作映射似乎毫无用处,因为此模块永远不会返回忽略。在这种情况下,user_unknown=ignore如果确实想在找不到用户时忽略结果,您可能需要考虑使用。

相关内容