linux - Pam 配置文件条件执行语句

标签 linux authentication machine-learning pam biometrics

我正在开发一个项目,在 Linux 中制作一个 pam 模块,以通过个人的打字行为进行身份验证。我已经充分研究并了解了 pam 配置文件中四个控制标志的工作原理,即:必要的、必需的、充分的和可选的。我对我的项目特有的 PAM 配置文件有以下两个问题。

  1. 作为身份验证的第二个因素,我想使用 google-authenticator。 目前我的配置文件有以下代码:

    auth sufficient pam_test.so  
    auth required pam_google_authenticator.so
    

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

  • 另一个问题是,我想从 google-authenticator 模块返回到我的模块,并根据 google-authenticator 模块的 pam 状态代码做出决策。基本上,我想使用最新的训练样本进行 future 的训练(自适应算法)。因此,为了区分真阴性和假阴性,我想从 google-authenticator 模块返回?这可能吗?
  • 这是我在 stackoverflow 上的第一个问题。如果我在提问时犯了任何错误,我很抱歉。

    最佳答案

    有关这些 hijinx 的更多详细信息,请参阅 man 5 pam.d。我假设您正在使用 Linux-PAM 在 Linux 上工作。

    我假设 pam_test.so 是您编写的。因此,当密码无效时,您应该返回 PAM_AUTH_ERR。您可以使用“高级”语法根据不同的返回码指定不同的操作。 作为引用,从 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 变为成功)。 bad 和 die 操作都给出失败状态,但 die 退出堆栈。操作“ok”和“done”(以及一个整数 N)表示成功状态。 “完成”也会停止堆栈的执行。使用整数 N 会跳过许多后续模块。特殊的“默认值”意味着“模块的任何其他返回值”。

    然后你可以这样做:

    auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
    

    当密码错误时,这将停止执行验证堆栈并失败,当模块通过时成功停止执行,并在任何其他情况下沿验证堆栈移动。

    至于回到你的代码......这是一个全新的蠕虫 jar 头。你可以做到,但我想不出一种不是完全破解的方法。例如,使用 code=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 身份验证器。如果成功,它将转到下一行调用 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
    

    关于linux - Pam 配置文件条件执行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949169/

    相关文章:

    在 linux 中使用其他库创建共享库

    linux - 在 Cron 中连接失败后重新运行 Rsync

    PHP 执行 Bash 脚本仅返回黑色屏幕截图

    java - 注销在 Spring Boot 应用程序中不起作用(不支持 POST 方法)

    android-studio - Android Studio 无法登录 GitHub

    machine-learning - 自然语言处理中的二值化

    linux - Cronjob 不工作且不记录

    Firebase + flutter : get platform user used to sign in

    r - 如何找到支持向量机中的重要因素

    machine-learning - 贝叶斯优化不会提高预测准确性