我正在开发一个项目,在linux中创建一个pam模块,通过个人的输入行为进行身份验证。我已经充分研究并了解pam配置文件中四个控制标志的工作原理。必要的,必要的,充足的和可选的。关于我的项目特定的PAM配置文件,我有以下2个问题。
作为第二个身份验证因素,我想使用google-authenticator。 目前我的配置文件包含以下代码:
auth sufficient pam_test.so
auth required pam_google_authenticator.so
如果我的模块在输入的密码正确但输入行为不匹配时无法进行身份验证,则会正确调用google-authenticator模块。但是,如果输入的密码本身不正确,也会调用它。对于第二种情况,我想终止整个链。有办法吗?我可以有条件地(基于不同的pam错误状态代码)调用google-authenticator模块吗?
这是我关于stackoverflow的第一个问题。如果我在提问时犯了任何错误,我很抱歉。
答案 0 :(得分:3)
有关这些hijinx的更多详细信息,请参阅man 5 pam.d
。我假设您正在使用Linux-PAM在Linux上工作。
我假设pam_test.so是你写的东西。因此,当密码无效时,您应该返回PAM_AUTH_ERR。您可以根据不同的返回代码使用" advanced"指定不同的操作。句法。 作为参考,来自pam.d的(我的)手册页,"简单"行动有以下"高级"语法:
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堆栈移动。
至于回到你的代码......这是一堆全新的蠕虫病毒。你可以做到,但我不能想到一种不完全黑客的方式。例如,通过使用代码= N来跳转并使用控制流跳转并使用特殊参数调用模块,然后根据参数成功或失败。为了完整性,(和完整的HACK)类似于:
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 authenticator。如果成功,则会转到调用pam_test.so wasvalid
的下一行,否则会转到pam_test.so wasinvalid
。只进行了两次后续pam_test.so调用中的一次。在此代码段之后,返回代码成功或失败,具体取决于Google身份验证器状态。这实际上是#34;需要pam_google_authenticator.so,但也请使用相应的标记"来调用我的模块。如果你想让auth以这个为结束,无论如何,你都可以使用:
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 wasinvalid