首页 文章

Pam配置文件条件执行语句

提问于
浏览
2

我正在开发一个项目,在linux中创建一个pam模块,通过个人的输入行为进行身份验证 . 我已经充分研究并了解pam配置文件中四个控制标志的工作原理 . 必要的,必要的,充足的和可选的 . 我有两个关于特定于我的项目的PAM配置文件的问题 .

  • 作为第二个身份验证因素,我想使用google-authenticator . 目前我的配置文件包含以下代码:
auth sufficient pam_test.so  
auth required pam_google_authenticator.so

如果我的模块在输入的密码正确但输入行为不匹配时无法进行身份验证,则会正确调用google-authenticator模块 . 但是,如果输入的密码本身不正确,也会调用它 . 对于第二种情况,我想终止整个链 . 有办法吗?我可以有条件地(基于不同的pam错误状态代码)调用google-authenticator模块吗?

  • 另一个问题是,我想从google-authenticator模块返回我的模块,并根据google-authenticator模块的pam状态代码做出决定 . 基本上,我想使用最新的训练样本进行未来训练(自适应算法) . 因此,为了区分真正的否定和假阴性,我想从google-authenticator模块回来?这可能吗?

这是我关于stackoverflow的第一个问题 . 如果我在提问时犯了任何错误,我很抱歉 .

1 回答

  • 3

    有关这些hijinx的更多详细信息,请参见 man 5 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和done(以及整数N)表示成功状态 . 'done'也会停止执行堆栈 . 使用整数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身份验证器状态 . 这实际上是"require pam_google_authenticator.so but also call my module with the appropriate flag" . 如果您希望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
    

相关问题