在具有Java 8的RHEL 7.5上运行。Kerberos5版本1.15.1。
自2000年11月21日以来,所有版本都看到这种设置的奇怪行为。
请注意,我无法发布直接日志或配置,因为我的公司阻止了此操作。
复制步骤
1)将Gerrit配置为使用kerberos
gerrit.config
[container]
javaHome = <path to JRE>
javaOptions = -Djava.security.auth.login.config=<path to jaas.conf>
[auth]
type = LDAP
[ldap]
authentication = GSSAPI
server = ldap://<AD Realm>
<.. other AD related stuff..>
jaas.conf
KerberosLogin {
com.sun.security.auth.module.Krb5LoginModule
required
useTicketCache=true
doNotPrompt=true
renewTGT=true;
};
直接来自文档。
2)初始化密钥表以在缓存中创建票证。 3)尝试登录。它失败,并显示“在Kerberos数据库中找不到服务器(7)”。
如果将jaas.conf更改为尝试直接使用密钥表,也会失败。
您可以使用用户名/密码直接访问LDAP,但是由于公司的限制,我们不能在设备上保留未加密的密码,因此这不是长期可行的解决方案。
我们已经捕获了到达AD Realm的流量的数据包,无论使用keytab还是缓存,我们都可以看到相同的行为。
1)对于kinit,我们看到一个对AD的请求,其中SPN字段从密钥表设置为SPN。当然,这很好。 2)对于Gerrit发出的任何请求,我们都会看到对AD的两个请求,第一个请求具有来自缓存/密钥表的正确SPN,第二个尝试将SPN的值设置为“ ldap /”。第二个请求是导致错误的原因,因为在AD中无法识别SPN。注意,我们尝试了使用各种SPN(HTTP /设备,主机/设备,HTTP /设备@等)的键表。每次都会发生同样的事情。
这很可能是一个非常简单的错误,在我们的配置中是错误的,但是我们已经为此努力了数周。
答案 0 :(得分:0)
第二个请求很可能出现,因为您在Gerrit的配置中指定了 LDAP服务器ldap://<AD Realm>
。此时,HTTP GSSAPI身份验证可能已经非常成功,但是现在该应用程序需要先针对LDAP服务器进行身份验证,然后才能检索有关用户的信息。这独立于HTTP身份验证本身进行。
通常无法识别SPN,因为Active Directory通常不使用<AD Realm>
来选择域控制器-而是必须指定各个服务器名称,例如ldap://dc01.ad.example.com
。 (Real AD客户端会通过DNS SRV记录自动选择服务器,但是普通LDAP客户端通常不支持该服务器。)
还请注意,密钥表基本上是处于静止状态的未加密密码。