Gerrit 2.15.12-Kerberos + GSSAPI + Active Directory-发送SPN时可能出现的错误

时间:2019-03-29 08:46:58

标签: java active-directory kerberos gerrit

在具有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 /设备@等)的键表。每次都会发生同样的事情。

这很可能是一个非常简单的错误,在我们的配置中是错误的,但是我们已经为此努力了数周。

1 个答案:

答案 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客户端通常不支持该服务器。)

还请注意,密钥表基本上是处于静止状态的未加密密码。