首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pam配置文件语句的有条件执行

问Pam配置文件语句的有条件执行
EN

Stack Overflow用户
提问于 2015-03-09 18:23:54
回答 1查看 2.9K关注 0票数 2

我正在做一个项目,在linux中制作一个pam模块,通过个人的输入行为进行身份验证。我已经对pam配置文件中的四个控制标志的工作进行了充分的研究并有了一些想法。必需的、必需的、充分的和可选的。我对特定于我的项目的PAM配置文件有以下两个问题。

  1. 作为认证的第二个因素,我想使用google认证器。当前,我的配置文件有以下代码: 充分的pam_test.so需要pam_google_authenticator.so

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

  1. 另一个问题是,我想回到我的模块,从谷歌认证模块,并作出决定,基于谷歌认证模块的pam状态代码。基本上,我想使用最新的训练样本为未来的训练(自适应算法)。因此,为了区分真阴性和假阴性,我想从谷歌认证模块中回来吗?这个是可能的吗?

这是我关于堆栈溢出的第一个问题。如果我问错了问题,我很抱歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 18:10:26

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

我假设pam_test.so是你写的东西。因此,当密码无效时,您应该返回PAM_AUTH_ERR。您可以使用“高级”语法根据不同的返回代码指定不同的操作。作为参考,在pam.d的(my)手册页面中,“简单”操作具有以下“高级”语法:

代码语言:javascript
复制
   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跳过以下许多模块。特殊的“默认”表示“来自模块的任何其他返回值”。

然后你可以:

代码语言:javascript
复制
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so

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

至于回到你的密码..。那是一罐全新的虫子。你能做到的,但我想不出一种不是完全黑的方法。例如,使用code=N跳过控制流,然后使用特殊的args调用模块,然后根据参数成功或失败。为了完整,(和一个完整的黑客)类似的东西:

代码语言:javascript
复制
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,但也使用适当的标志调用我的模块”。如果您希望以这种方式结束,则可以使用:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28949169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档