我正在开发一个项目,在linux中创build一个pam模块,以便通过个人的input行为进行身份validation。 我已经充分研究了pamconfiguration文件中四个控制标志的工作原理, 必要的,必要的,充足的和可选的。 我有关于我的项目特定的PAMconfiguration文件的以下2个问题。
作为身份validation的第二个因素,我想使用google-authenticator。 目前我的configuration文件有以下代码:
auth sufficient pam_test.so auth required pam_google_authenticator.so
如果input的密码正确但input行为不匹配,我的模块无法进行身份validation,则会正确调用google-authenticator模块。 但是,如果input的密码不正确,它也会被调用。 对于第二种情况,我想终止整个链。 有没有办法做到这一点? 我可以有条件地(基于不同的pam错误状态码)调用google-authenticator模块吗?
这是我在stackoverflow上的第一个问题。 如果我在提问时犯了错误,我很抱歉。
有关这些hijinx的更多细节,请参阅man 5 pam.d
pam.d。 我假设你正在使用Linux-PAM进行Linux操作。
我假设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和完成的操作(和一个整数N)表示成功状态。 “完成”也停止堆栈的执行。 使用整数N跳过下面的许多模块。 特殊的“默认”是指“来自模块的任何其他返回值”。
你可以这样做:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
当密码错误时,这将停止auth堆栈的执行失败,当模块通过时成功停止执行,并在任何其他场景中沿着auth堆栈移动。
至于回到你的代码…这是一个全新的蠕虫罐。 你可以做到这一点,但我想不出一个完全的破解方式。 例如,通过使用代码= N来跳转,通过使用代码= 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的身份验证状态。 这实际上是“需要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