首页 > 解决方案 > Gerrit 2.15.12 - Kerberos + GSSAPI + Active Directory - 发送 SPN 时可能存在错误

问题描述

在带有 Java 8 的 RHEL 7.5 上运行。Kerberos 5 版本 1.15.1。

自 2.11.10 以来,我们在所有版本中都看到了这种设置的奇怪行为。

请注意,我无法发布直接日志或配置,因为我的公司阻止了此操作。

重现步骤

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) kinit keytab 以在缓存中创建票证。3) 尝试登录。它失败并显示“在 Kerberos 数据库中找不到服务器 (7)”。

如果您更改 jaas.conf 以尝试直接使用 keytab,它也会失败。

您可以使用用户名/密码直接访问 LDAP,但由于公司限制,我们不能在设备上拥有未加密的静态密码,因此这不是一个可行的长期解决方案。

我们已经对到 AD 领域的流量进行了数据包捕获,无论我们使用 keytab 还是缓存,我们都会看到相同的行为。

1) 对于 kinit,我们看到一个对 AD 的请求,其中 SPN 字段设置为 keytab 中的 SPN。当然,这很好用。2) 对于来自 Gerrit 的任何请求,我们看到两个对 AD 的请求,第一个具有来自缓存/keytab 的正确 SPN,第二个尝试发送 SPN 为“ldap/”,无论 SPN 设置什么值。第二个请求是导致错误的原因,因为 SPN 在 AD 中无法识别。请注意,我们已经尝试了具有各种 SPN(HTTP/设备、主机/设备、HTTP/设备@ 等)的密钥表。每次都会发生同样的事情。

这很可能是我们的配置中非常简单的错误,但我们已经为此努力了好几个星期了。

标签: javaactive-directorykerberosgerrit

解决方案


第二个请求很可能出现,因为您在 Gerrit 的配置中指定了 LDAP 服务器。ldap://<AD Realm>此时,HTTP GSSAPI 身份验证很可能已经成功,但现在应用程序需要针对 LDAP 服务器对自身进行身份验证,然后才能检索有关用户的信息。这与 HTTP 身份验证本身无关。

无法识别 SPN 是正常的,因为 Active Directory 通常不<AD Realm>用于选择域控制器,而是必须指定各个服务器名称,例如ldap://dc01.ad.example.com. (真正的 AD 客户端通过 DNS SRV 记录自动选择服务器,但普通的 LDAP 客户端通常不支持。)

另请注意,密钥表本质上是一个未加密的静态密码。


推荐阅读