【问题标题】:Gerrit 2.15.12 - Kerberos + GSSAPI + Active Directory - possible bug in sending SPNGerrit 2.15.12 - Kerberos + GSSAPI + Active Directory - 发送 SPN 时可能存在错误
【发布时间】:2019-03-29 08:46:58
【问题描述】:

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

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

【问题讨论】:

    标签: java active-directory kerberos gerrit


    【解决方案1】:

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

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

    还要注意,keytab 本质上是一个未加密的静态密码。

    【讨论】:

    • 感谢您回复我。但是,如果我指定 ldap:// 我会遇到完全相同的问题。它尝试发送 ldap/ 的 SPN。此外,设置 ldap:// 适用于来自 Gerrit 的简单 ldap 请求,而不使用 GSSAPI。至于 keytab,我从来没有说过这是一个明智的政策......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多