PAM高级选项如何工作?

我一直在阅读所有可以在PAM上find的东西(例如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] 

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

 new_authtok_reqd=ok 

必须处理所需的控制标志? 这是什么意思/目的

 ignore=ignore ? 

仅这一点:

 success=ok 

是我认为会匹配所需的行为,但确实如此

 default=bad 

意思是如果模块返回任何其他的动作令牌,模块会失败? 是=动作=价值标记成功=确定否定违规=坏 ,反之亦然? 哪一个需要优先? 从我读过的任何东西都不清楚。

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

 [success=done default=die] 

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

最后,我也找不到这个问题的答案,可以把每个值都ok, done, bad, die, ignore, reset, N与任何行动联系起来? 那甚么意思呢?

 [default=done] ? 

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

值得注意的是,根据调用的上下文(auth,account,password,session),PAM模块的行为可能会有所不同。

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

对于价值观和行为的一个很好的解释可以通过仔细阅读上面提到的页面来find。

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

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

PAM模块只返回一个值。

最后,我也找不到这个问题的答案,可以把每个值都确定,完成,坏,死亡,忽略,重置,N与任何行动联系起来? 那甚么意思呢?

[default=done] ?

这意味着:这里没有提到的任何标记(即每个可能的标记)都会结束PAM堆栈的处理并返回结果。

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

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

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

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

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

我的下一个问题是将这个方括号语法中所需的旧式样控制标志关键字等同起来:

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

例如在这里 ,这种等同性被重复遍布。

事实certificate,这是完全的,完全是无稽之谈。 由任何特定模块返回的状态代码可能不同,并且根据pipe理组types(例如,auth vs account)而不同。

以例如pam_securetty模块为例。 该模块仅提供authtypes,并具有以下可能的状态码返回值:

 PAM_SUCCESS PAM_AUTH_ERR PAM_INCOMPLETE PAM_SERVICE_ERR PAM_USER_UNKNOWN 

ignore=ignore值/操作映射因此似乎是无用的,因为这个模块不会返回忽略。 在这种情况下,如果用户无法find,您可能会考虑使用user_unknown=ignore如果实际上您想忽略结果。