对于我的 PAM 配置的 auth 部分等,login
请mdm
调用common-auth
.我已将common-auth
以下内容调用为子堆栈(如auth substack krb5ldap-cache-auth
):
auth optional pam_echo.so Trying UNIX
# Try UNIX, empty passwords OK
auth sufficient pam_unix.so nullok
auth optional pam_echo.so Checking UID
# If the uid < 500 and UNIX didn't work, then die.
auth requisite pam_succeed_if.so uid >= 500 quiet_success
auth optional pam_echo.so Trying Kerberos
# Try Kerberos, using the same password
# If the password is correct (success), then skip next lines
# If the password is wrong (auth_err), then die
# If Kerberos can't connect (?), then ignore
auth [success=2 auth_err=die default=ignore] pam_krb5.so debug use_first_pass
# Try the cache, using the same password
# Last chance.
auth optional pam_echo.so Trying cache
auth [success=done default=die] pam_ccreds.so action=validate use_first_pass
# Kerberos validated our password.
auth optional pam_echo.so Kerberos validated
# Store the password hash.
auth optional pam_ccreds.so action=store use_first_pass
# See if we can mount user drives, since we have a Kerberos token.
auth optional pam_mount.so
auth optional pam_echo.so Done.
(pam_echo.so
仅用于调试。)
这似乎对于成功的身份验证工作得很好。子堆栈机制很方便,因为我可以使用“sufficient”和“done”来终止子堆栈,而不终止较大的堆栈。
但是对于失败的身份验证,较大的堆栈会在它应该死亡时继续(例如,mdm
将无用地调用pam_gnome_keyring.so
,login
将无用地调用)。pam_group.so
有没有一种方法可以调用子堆栈,以便如果子堆栈失败,堆栈就会死亡?我尝试过auth requisite substack krb5ldap-cache-auth
,但这只是糟糕的 PAM 语法。
答案1
来自 PAM 管理员指南:
substack
包括指定为该控件的参数的配置文件中给定类型的所有行。这与
include
子堆栈中的完成和模具操作的评估不同,不会导致跳过整个模块堆栈的其余部分,而只会跳过子堆栈。
读你的问题,在我看来你正在寻找include
而不是substack
。因此你可能应该更换...
auth substack krb5ldap-cache-auth
和...
auth include krb5ldap-cache-auth
然而,在 Debian 系统上,您可能必须使用它:
@include krb5ldap-cache-auth
另外,在 RedHat 系统和衍生系统上,您甚至可能必须使用pam_stack
,它通常被认为已被弃用(我相信由于处理问题包括递归):
auth requisite pam_stack.so service=krb5ldap-cache-auth
在这些情况下,如果有任何事件触发中的done
或die
操作krb5ldap-cache-auth
,PAM 将结束整个堆栈,而不仅仅是子堆栈。