![PAM 认为 Kerberos 密码已过期](https://linux22.com/image/782129/PAM%20%E8%AE%A4%E4%B8%BA%20Kerberos%20%E5%AF%86%E7%A0%81%E5%B7%B2%E8%BF%87%E6%9C%9F.png)
多年来,我一直在一个小型网络中运行 Kerberos / LDAP 身份验证。Kerberos 保存在 LDAP 中,然后复制到另一个站点。第二个站点的计算机向副本进行身份验证,旧站点向原始服务器进行身份验证。最近,我添加了几个新用户帐户。
在原有的网站上,一切都运行顺利。新用户可以毫无问题地登录系统。
在第二个站点上使用副本kinit user
也可以正常工作。但是,login user
声称密码已过期,必须立即更改。更改密码后,用户可以正常登录。
检查副本 KDC 上的设置kadmin.local
一切正常:
kadmin.local: getprinc user
Principal: [email protected]
Expiration date: [never]
Last password change: Di Nov 22 21:06:35 CET 2022
Password expiration date: [never]
Maximum ticket life: 0 days 10:00:00
Maximum renewable life: 7 days 00:00:00
Last modified: Di Nov 22 21:06:35 CET 2022 ([email protected])
Last successful authentication: Di Nov 22 21:19:27 CET 2022
Last failed authentication: So Nov 13 09:05:17 CET 2022
Failed password attempts: 0
Number of keys: 8
[ ... ]
Attributes: REQUIRES_PRE_AUTH
Policy: [none]
因此,密码和主体都不会过期。因此kinit
工作如预期:
root@client:~# kinit user
Password for [email protected]:
root@client:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]
Valid starting Expires Service principal
22.11.2022 21:25:17 23.11.2022 07:25:17 krbtgt/[email protected]
renew until 23.11.2022 21:25:11
然而,login
声称密码已过期,必须更改:
root@ganesha:~# login user
Password:
Sie müssen Ihr Passwort sofort ändern (Passwortablauf).
Current Kerberos password:
Enter new Kerberos password:
Retype new Kerberos password:
Linux client 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Letzte Anmeldung: Dienstag, den 22. November 2022, 20:59:02 CET auf pts/5
user@client:~$
在此登录之后,主体的Last password change
和Last modified
已更新。Last successful authentication
不会改变。成功后kinit
也不会改变。但成功login
或kinit
原始客户端上确实会改变。这可能是另一个问题,但它同样发生在旧用户身上,这两个站点都可以完美运行。使用时getprinc
我无法发现新旧用户之间的任何差异。
以下login
PAM 设置应该有效,auth
即account
Debian 安装的默认设置:
auth optional pam_faildelay.so delay=3000000
auth requisite pam_nologin.so
auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000
auth [success=1 default=ignore] pam_unix.so nullok try_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_group.so
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
account required pam_krb5.so minimum_uid=1000
我设置了一个新的 Bullseye 客户端,它通过 VPN 使用原始的 Kerberos 和 LDAP。它显示了相同的行为。我做了一些 PAM 调试:
Jan 23 21:32:44 psyche login[2861]: pam_krb5(login:auth): user user authenticated as [email protected]
Jan 23 21:32:44 psyche login[2861]: pam_unix(login:account): expired password for user user (password aged)
Jan 23 21:32:53 psyche login[2861]: pam_krb5(login:chauthtok): user user changed Kerberos password
Jan 23 21:32:53 psyche login[2861]: pam_unix(login:session): session opened for user user(uid=10##) by admin(uid=0)
在所有系统上都能正常工作的旧用户没有条目(login:account)
,因此当然不需要更改密码。所以,这似乎与复制无关。更奇怪的是,有些系统login
对这些用户来说工作正常。我检查了一下,/etc/pam.d/common-account
两个系统上的情况都一样。
我很感激任何关于检查什么的想法。
感谢您的帮助。
答案1
实际原因与 Kerberos 无关。失败的帐户已shadowMax
在 LDAP 中设置。虽然我一开始并不知道这个设置,但即使shadowLastChange
plusshadowMax
仍落后于当前日期,凭据也会被报告为已过期。设置shadowMax
为 -1 或完全删除该值可以解决问题。
这并不能完全解释为什么另一个站点的设置似乎完全忽略了该值,但这是另一个故事。