java - 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/设备@ 等)的密钥表。每次都会发生同样的事情。
这很可能是我们的配置中非常简单的错误,但我们已经为此努力了好几个星期了。
解决方案
第二个请求很可能出现,因为您在 Gerrit 的配置中指定了 LDAP 服务器。ldap://<AD Realm>
此时,HTTP GSSAPI 身份验证很可能已经成功,但现在应用程序需要针对 LDAP 服务器对自身进行身份验证,然后才能检索有关用户的信息。这与 HTTP 身份验证本身无关。
无法识别 SPN 是正常的,因为 Active Directory 通常不<AD Realm>
用于选择域控制器,而是必须指定各个服务器名称,例如ldap://dc01.ad.example.com
. (真正的 AD 客户端通过 DNS SRV 记录自动选择服务器,但普通的 LDAP 客户端通常不支持。)
另请注意,密钥表本质上是一个未加密的静态密码。
推荐阅读
- r - 正则表达式,匹配年份列为范围
- javascript - 使用打字稿装饰器的错误处理无法按预期工作
- spring-webflux - Webflux 链接多个 Mono
- database - Flask SQLAlchemy 2 ForeignKey 列回到同一个表
- python-3.x - 使用列表推导与 for 循环递增变量时获得不同的结果
- python - 如何使 x 轴上的单词在 matplotlib 中从右到左出现?
- angular - Angular Ionic Side Drawer 不渲染
- java - Javafx 中屏幕之间的参数
- python - 如何从多订单模型中获取项目模型的总和?
- alphametic-question - 调查文本中的随机forloop?