我想在身份验证失败时运行一个脚本。但是,使用以下 conf 文件,即使提供了正确的凭据,身份验证也总是失败。
auth [success=1 new_authtok_reqd=ok ignore=ignore default=bad] pam_unix.so
auth optional pam_exec.so /usr/bin/log_failure
password required pam_unix.so md5
身份验证通过将“success=1”更改为“success=ok”来实现,但显然失败脚本将始终运行。
我尝试查看 _pam_dispatch_aux 的源代码,当没有规则可跳转时,它似乎不会返回第一个规则的返回值。如果我添加另一个规则以便有可跳转的内容,则一切正常。
auth [success=1 new_authtok_reqd=ok ignore=ignore default=bad] pam_unix.so
auth optional pam_exec.so /usr/bin/log_failure
auth optional pam_exec.so /usr/bin/noop
password required pam_unix.so md5
我是否在配置文件中做错了什么,尝试了一些不应该起作用的事情,或者存在错误?
答案1
一切如预期般顺利。
success=n
不影响模块堆栈的返回。结果是,成功的身份验证将pam_unix.so
返回失败(因为没有返回success
或ok
)done
,而失败的身份验证将返回失败(正如预期的那样,因为pam_exec.so
在这种情况下返回成功会非常糟糕)。
请尝试以下操作:
auth sufficient pam_unix.so
auth optional pam_exec.so /usr/bin/log_failure
password required pam_unix.so md5
sufficient
意思是“如果成功则在此停止,否则继续”。这应该会产生预期的效果。
如果 /usr/bin/log_failure 是一个脚本,我内心的安全狂热分子会更倾向于尝试这个……
auth sufficient pam_unix.so
auth [default=ignore] pam_exec.so /usr/bin/log_failure
password required pam_unix.so md5
这会阻止 log_failure 返回的成功允许登录。