我正在编写自定义 pam 规则来限制/定义用户如何通过串行控制台登录我的 Linux 主机。
如果用户客人登录后,我希望他的密码由 验证pam_unix.so
,而对于任何其他用户,我希望我的自定义身份验证程序执行相同的任务并且身份验证的最终决定权即我根本不希望调用任何后续的 pam 模块。
这是我的最小工作/etc/pam.d/login
文件。
# On success skip the next rule
auth [success=1 default=ignore] pam_succeed_if.so user in guest
auth [success=done default=ignore] pam_exec.so expose_authtok /usr/bin/custom-pam.sh
auth [success=1 default=ignore] pam_unix.so nullok
auth requisite pam_deny.so
auth required pam_permit.so
当我以访客身份登录时,上述配置按预期工作(并且/var/log/journal
也确认了这一点),但对其他用户来说失败了。
如果/usr/bin/custom-pam.sh
以 0 退出,我预计后续模块的处理会停止。据我了解,success=done
应该立即返回,但事实并非如此。
答案1
您尝试过 PAMsufficient
控件吗?每pam.conf(5)
sufficient
if such a module succeeds and no prior required module has failed
the PAM framework returns success to the application or to the
superior PAM stack immediately without calling any further modules
in the stack. A failure of a sufficient module is ignored and
processing of the PAM module stack continues unaffected.
这应该会停止您的自定义行的处理:
auth sufficient pam_exec.so expose_authtok /usr/bin/custom-pam.sh
除非失败,这可以通过后续的 nope-denying-you-here 行来处理。