我正在做一个项目,在linux中制作一个pam模块,通过个人的输入行为进行身份验证。我已经对pam配置文件中的四个控制标志的工作进行了充分的研究并有了一些想法。必需的、必需的、充分的和可选的。我对特定于我的项目的PAM配置文件有以下两个问题。
如果输入的密码正确,但键入行为不匹配时,如果我的模块无法进行身份验证,则将正确调用google-身份验证器模块。但是,如果输入的密码本身不正确,也会调用它。对于第二种情况,我想终止整个链。是否有办法这样做?我能有条件地(基于不同的pam错误状态代码)调用google认证模块吗?
这是我关于堆栈溢出的第一个问题。如果我问错了问题,我很抱歉。
发布于 2015-03-10 18:10:26
有关这些hijinx的详细信息,请参阅man 5 pam.d。我假设您正在使用Linux,使用Linux-PAM。
我假设pam_test.so是你写的东西。因此,当密码无效时,您应该返回PAM_AUTH_ERR。您可以使用“高级”语法根据不同的返回代码指定不同的操作。作为参考,在pam.d的(my)手册页面中,“简单”操作具有以下“高级”语法:
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]这些是表单retval=action,其中retval是PAM_*返回代码,删除了PAM_并转换为小写(因此PAM_SUCCESS成功了)。坏操作和死操作都会给出失败状态,但是死掉退出堆栈。操作ok和done (以及整数N)表示成功状态。“完成”也会停止堆栈的执行。使用整数N跳过以下许多模块。特殊的“默认”表示“来自模块的任何其他返回值”。
然后你可以:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so这将在密码错误时停止执行失败的auth堆栈,在模块通过时停止执行并成功执行,并在任何其他情况下沿auth堆栈移动。
至于回到你的密码..。那是一罐全新的虫子。你能做到的,但我想不出一种不是完全黑的方法。例如,使用code=N跳过控制流,然后使用特殊的args调用模块,然后根据参数成功或失败。为了完整,(和一个完整的黑客)类似的东西:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=1] pam_test.so wasvalid
auth [default=bad] pam_test.so wasinvalid它具有以下属性:如果密码无效或满足pam_test.so条件,则不再进行进一步的身份验证处理,并分别以失败或成功结束。如果pam_test因其他原因失败,它会调用google身份验证器。如果成功,它将转到调用pam_test.so wasvalid的下一行,否则将转到pam_test.so wasinvalid。只执行两个后续pam_test.so调用中的一个。在这个片段之后,返回代码是成功还是失败,这取决于google身份验证器的状态。这实际上是“需要pam_google_authenticator.so,但也使用适当的标志调用我的模块”。如果您希望以这种方式结束,则可以使用:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=done] pam_test.so wasvalid
auth [default=die] pam_test.so wasinvalidhttps://stackoverflow.com/questions/28949169
复制相似问题