Kerberos 身份验证失败并强制更改密码

Jos*_* R. 7 kerberos

我已将 PAM 身份验证配置为使用 Kerberos,并且可以使用我的委托人的 Kerberos 凭据正确进行身份验证。

当我尝试使用过期密码创建主体时遇到了麻烦:

kadmin: addprinc +needchange test_principal
Run Code Online (Sandbox Code Playgroud)

当我尝试登录时(从 VT 或图形迎宾器),在正确输入密码后,我收到了密码已过期的预期消息,系统提示我创建一个新密码。完成此操作后,身份验证失败并出现以下错误kdc.log

krb5kdc[...](info): TGS_REQ (4 etypes {18 17 16 23}) 192.168.0.200: NO PREAUTH: authtime 0, test_principal@MY.REALM for host/server.my.realm@MY.REALM, Generic error (see e-text)
Run Code Online (Sandbox Code Playgroud)

以及以下(并不奇怪)错误/var/log/auth.log

pam_krb5(gdm3:auth): (user test_principal) credential verfication failed: KDC returned error string: NO PREAUTH
Run Code Online (Sandbox Code Playgroud)

一些笔记

  • 列出主体的属性(通过getprincin kadmin.local)显示 0 次失败的登录尝试
  • 如果我创建没有+needchange标志的帐户,我就可以正确进行身份验证。
  • 如果在用户成功通过身份验证后添加+needchange标志(通过modprincin kadmin.local),我会得到预期的行为;即提示用户更改密码,然后验证成功。
  • 此主体没有等效条目,/etc/passwd但由 LDAP 条目备份。
  • 正如其他地方所建议的,我尝试像这样创建我的主体:

    kadmin: addprinc -requires_preauth +needchange test_principal
    
    Run Code Online (Sandbox Code Playgroud)

    这没有任何区别。

我的用例

我正在从旧的 NIS 系统迁移,我想为我的用户提供连续性。我想让他们输入旧密码,但随后被迫更改它们以符合我打算通过 Kerberos 强制执行的更严格的密码策略规则。

我在 Debian Wheezy 上运行 MIT Kerberos V。

Jos*_* R. 2

我找到了答案,这是一个非常奇怪的答案!

我使用getprinc其中的命令来获取问题主体和在没有创建且正确验证的kadmin主体的属性。+needchange

不同之处在于,正确身份验证的主体具有REQUIRES_PRE_AUTH属性集,而问题主体没有该属性,因此解决方案是通过以下方式创建主体:

kadmin: addprinc +needchange +requires_preauth test_principal
Run Code Online (Sandbox Code Playgroud)