如何避免频繁的KVNO增加,当使用Apache HTTPD与mod_auth_kerb谈话?

我已经用mod_auth_kerb设置了Apache HTTPD 2.4,在Active Directory上创build了一个服务帐户,为我的http主机名添加了一个SPN,在linux机器上创build了一个keytab文件,并且SSO开始很好地为从IElogin到AD域的用户。 这一切都很好!

但是,每周左右,用户不是login到网站,而是得到一个http基本authentication提示,不接受他们的凭证。 查看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密钥版本号)已经增加,所以他们的keytab是无效的。 我们可以通过这样做来看到:

 $ 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中的高一个,导致Kerberos SSO失败

如果我们重新创build密钥表,像这样:

 $ 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上创buildKerberos keytab文件,以便KVNO不会每隔1-2周随机增加一次,从而打破我们所有用户访问网站的能力?

Active Directory根据RFC 4120递增KVNO。Microsoft在文档MS-KILE第3.1.5.8节中logging了它的实现。

Active Directory基本上忽略KVNO。 (除了只读DC – 如果一个RODC被攻破,它所拥有的密钥不能再用于另一个DC)。所以我的观点是AD一般不关心你的KVNO是什么 – 即使它仍然保持KVNOs – 它只关心,如果你的票有效,没有过期。 (不pipe你的Linux客户端是否严格检查KVNOs,我不知道,显然是这样。)

活动目录将尝试使用该主体的最近密钥进行解密/validation,如果这样做不起作用,它将尝试使用前一个密钥(只要前一个密钥仍在其生命周期内, ),如果这不起作用,将失败的请求。 不pipe客户端发送什么KVNO。但请记住,并非所有的域控制器都只有最后一次发布您的票证的域控制器的KVNO-1(即之前的KVNO)。

KVNO在客户端计算机更改其密码或更新其票证或其票证到期时递增。 默认情况下,活动目录使用7天可以更新票证的最长时间,这与您的描述“工作一周左右”是一致的。

当从域成员计算机收到有效的密码更改或票证轮换时,没有任何机制可以阻止Active Directory增加KVNO。 所以我的意思是活动目录不会“神秘”地更新KVNO – 这是出于具体的原因。

在我看来,你的Linux机器在7天的最大使用期限后仍然试图使用它(现在已过期)的票证。 (或者Active Directory已经configuration了更短的内容。)

查看/etc/krb5.conf并确认最大票证生命周期在Active Directory中指定的最大票证生命周期内(默认域组策略中的Kerberos策略)。必须更新票证(和您的KVNO必须增加)在由AD指定的时间间隔内。

你可能会碰到这个错误https://bugzilla.samba.org/show_bug.cgi?id=6750

有几个sambaconfiguration更改将解决它。 我设置

 kerberos method = secrets and keytab