我已经使用 mod_auth_kerb 设置了 Apache HTTPD 2.4,在 Active Directory 上创建了一个服务帐户,为我的 http 主机名添加了一个 SPN,在 Linux 计算机上创建了一个 keytab 文件,并且让从 IE 登录到 AD 域的用户能够顺利使用 SSO。一切都很好!
但是,大约每周一次,用户无法登录网站,而是收到 http basic auth 提示,无法接受他们的凭据。查看 httpd 服务器日志,我们会看到类似以下条目:
[auth_kerb:error] [pid 8040] [client 192.168.100.100:54460] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, Key version number for principal in key table is incorrect)
似乎发生了以下情况:AD 上的 KVNO(Kerberos 密钥版本号)已增加,因此密钥表无效。我们可以通过执行以下操作来查看:
$ kinit '[email protected]'
Password for [email protected]
$ kvno HTTP/sso.example.com
HTTP/[email protected]: kvno = 12
$ klist -k krb5-keytab
Keytab name: FILE:krb5-keytab
KVNO Principal
---- ---------------------------------------------
11 HTTP/[email protected]
AD 报告的 KVNO 不知何故已增加,并且比 Apache 使用的 keytab 中的 KVNO 高 1,这导致 Kerberos SSO 失败
如果我们重新创建 keytab,内容如下:
$ kinit '[email protected]'
Password for [email protected]
$ KEYTAB=krb5-keytab
$ SN="HTTP/[email protected]"
$ KVNO=`kvno $SN | awk -F'kvno = ' '{print $2}'`
$ echo "KVNO for $SN is $KVNO"
KVNO for HTTP/[email protected] is 12
$ rm $KEYTAB
$ ktutil
addent -password -p HTTP/[email protected] -k 12 -e arcfour-hmac
wkt krb5-keytab
$ chown apache.apache $KEYTAB
$ chmod 440 $KEYTAB
$ chcon -u system_u -t httpd_config_t $KEYTAB
$ service httpd restart
然后 Kerberos SSO 将重新开始工作,一切都会好起来!大约一周后,突然它又会失败,因为 KVNO 悄无声息地、神秘地将 AD 上的值提高了一个……
那么,我需要做什么,是在 AD 上还是在 Linux 上创建 kerberos keytab 文件,以便 KVNO 不会每 1-2 周随机增加一次,从而破坏所有用户访问网站的能力?
答案1
Active Directory 根据 RFC 4120 增加 KVNO。Microsoft 在文档 MS-KILE 第 3.1.5.8 节中记录了其对它的实现。
Active Directory 本质上忽略了 KVNO。(除了只读 DC - 如果 RODC 受到损害,它所持有的密钥就不能在另一个 DC 上重复使用。)所以我的观点是 AD 通常不关心您的 KVNO 是什么 - 即使它仍然维护 KVNO - 它只关心您的票证是否有效且未过期。(不过,我不知道您的 Linux 客户端是否严格检查 KVNO。它显然会这样做。)
Active Directory 将尝试使用该主体的最新密钥进行解密/验证,如果此密钥不起作用,它将尝试使用前一个密钥(只要前一个密钥仍在其有效期内),如果此密钥不起作用,则请求将失败。无论客户端发送什么 KVNO。但请记住,并非所有域控制器都会拥有您的 KVNO-1(即前一个 KVNO),只有最后签发您的票证的域控制器才会拥有。
当客户端计算机更改密码或续订票证或票证过期时,KVNO 会增加。默认情况下,Active Directory 使用 7 天作为票证续订的最大时间,这与您对“它的效果可以维持一周左右。”
当 Active Directory 从域成员计算机收到有效的密码更改或票证轮换时,没有任何机制可以阻止 Active Directory 增加 KVNO。因此,我的观点是 Active Directory 不会“神秘地”更新 KVNO - 它这样做有特定原因。
在我看来,您的 Linux 计算机仍在尝试使用其票证(现已过期),该票证的最长有效期已达到 7 天。(或者 Active Directory 已配置为更短的期限。)
查看/etc/krb5.conf
并验证最大票证有效期是否在 Active Directory(默认域组策略中的 Kerberos 策略)中指定的最大票证有效期之内。您必须在 AD 指定的时间间隔内更新您的票证(并且您的 KVNO 必须增加)。
答案2
你可能遇到了这个错误 https://bugzilla.samba.org/show_bug.cgi?id=6750
有几个 samba 配置更改可以解决这个问题。我设置
kerberos method = secrets and keytab