在多个 Web 服务器(srv1
、srv2
等)上部署相同的基于 HTTP 的应用程序。使用 SPNEGO auth 保护应用程序。服务器是 Linux,AD 不知道它们的存在,即它们没有加入域。我已经让整个 SPNEGO 在单个主机上顺利运行。现在转到后续主机。
我发现的大多数指南都会告诉你你需要
移至 Linux 主机)
虽然我相信 (2) + (3) 总是需要每个服务器,但我对 (1) 有点不确定。我可以只使用一个帐户吗?如果我只能使用一个,我真的不想在 AD 中拥有所有这些帐户。
This blog有一个很好的秘诀:第一次调用
ktpass
(对于 srv1
)应如您在 Internet 上找到的所有指南中所述,但是后续调用(对于 srv2
、 srv3
等)应使用 -setpass 和 -setupn 选项。但是我发现当一个人使用
ktpass.exe
工具帐户的userPrincipalName
属性更改为最后一次调用 ktpass
时的 princ 参数给出的值.所以 srv 的名称,例如srv3
被编码到名称中,因此帐户的名称基本上会随着每次调用 ktpass 而改变。当 Web 服务器执行 SPNEGO 事件链中的最后一步,即使用 keytab 作为凭据联系 AD 时,它将在 AD 中查找具有 userPrincipalName
的帐户。等于 SPN,因此此步骤将失败。 ( source ,滚动到最后一篇文章,列出第 3 项)。与此相反的是,我使用的是 Tomcat,因此使用的是 JAAS,据我所知,我可以 hardcode the principal name to use in my jaas.conf
file从而有效地忽略 key 表中的主体名称。AD 中的多个应用程序服务器 + 单个帐户可以工作吗?如果可以,如何工作?
最佳答案
简而言之,是的,它会起作用,我会告诉你如何。首先,让我们澄清您的问题或评论中未正确描述的一些事情和一些陈述:
您有三台机器提供相同的 DNS 名称,这意味着您要么有一个 DNS 循环:如果 IP 或负载均衡器(难以排序)将只有一个 IP,service.example.com 将返回一个随机列表A 记录取决于负载。对于 Kerberos,两种设置的结果是相同的。
现在,如果您需要 Kerberos 身份验证,您不能说 AD 不知道服务或服务器的存在。它会和必须否则它无法为您的客户创建服务票证,然后将其传递给服务器。此外,Tomcat will not contact KDC 接受安全上下文,因为服务票证是使用帐户的长期 key 加密的。
方法如下:你已经想通了,一个SPN可以绑定(bind)到一台机器上,不允许多个绑定(bind)。当您将机器名称绑定(bind)到机器帐户(srv1$
等)时就是这种情况。您需要一个 服务帐号 .服务帐户是没有密码过期的普通帐户,例如,my-service@EXAMPLE.COM
.对于此帐户,您将绑定(bind)您的CNAME
或 A
记录。让您的 Tomcat 身份验证器接受此服务帐户的所有安全上下文,它将起作用。
如何在类 Unix 操作系统上创建这个神奇的服务帐户?
使用 mskutil
到
之后,您将拥有一个适合您使用的 key 表。使用 LDAP 查询(例如,使用 Softerra 的 LDAP 浏览器或其他)验证该帐户是否存在,SPN (
servicePrincipalName
) 已绑定(bind)到该帐户,您就完成了。重要提示:如果您的任何客户使用 MIT Kerberos 或 Heimdal,您 必须设置
rdns = false
你的 krb5.conf
.神速!
关于active-directory - Kerberos/SPNEGO : multiple SPNs for the same AD account,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39477704/