【问题标题】:Kerberos/SPNEGO : multiple SPNs for the same AD accountKerberos/SPNEGO : 同一个 AD 帐户的多个 SPN
【发布时间】:2016-09-13 19:34:23
【问题描述】:

在多个 Web 服务器(srv1、srv2 等)上部署相同的基于 HTTP 的应用程序。使用 SPNEGO auth 保护应用程序。服务器是 Linux,AD 不知道它们的存在,即它们没有加入域。我已经让整个 SPNEGO 在单个主机上顺利运行。现在转到后续主机。

我发现的大多数指南都会告诉你你需要

  1. AD 中的帐户
  2. SPN
  3. 密钥表(在 AD 服务器上生成,然后 移至 Linux 主机)

虽然我相信 (2) + (3) 始终需要针对每个服务器,但我对 (1) 有点不确定。我可以只使用一个帐户吗?如果我只能使用一个,我真的不想在 AD 中拥有所有这些帐户。

This blog 有一个很好的方法来完成它:ktpass 的第一次调用(对于srv1)应该按照您在互联网上找到的所有指南中的描述,但是随后的调用(对于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 从而有效地忽略 keytab 中的主体名称。

AD 中的多个应用服务器 + 单个帐户是否可以工作?如果可以,如何工作?

【问题讨论】:

  • 不确定您的推理 - JAAS 配置文件定义了您的系统将向 KDC 呈现的主体(显式)和“散列密码”(来自 keytab 文件)。在您的情况下,KDC 是 Active Directory,并且 AD 不使用主体作为帐户 ID。这就是setspncommand 的重点:定义帐户 ID 和(列表)SPN 之间的 1..N 映射。我猜userPrincipalName LDAP 字段只是冰山一角……AD 使用其他方法来根据实际 ID 解析主体。
  • 是的,也许我的问题是我真的不明白 Tomcat 和 AD 之间的最后一步发生了什么。
  • 重要的是 inside AD 发生的事情 -- Tomcat 只是连接到端口 88 并执行常规的 Kerberos 工作,就好像它是 MIT Kerberos 服务而不是 Microsoft生物。
  • @SamsonScharfrichter。事实证明this 是我无法理解的。我不认为这家伙真的得到了答案。 Tomcat 可以只从 Service Ticket 中提取用户名,并不需要 AD 来建立用户身份。对?那里似乎有scenarios,确实不需要这一步。如果网络服务器主机加入域,也许它必须这样做?
  • 我猜 Kerberos 协议假定票证可能是伪造,因此服务器不能“接受”票证而不检查 KDC (就像它应该根据证书撤销列表检查客户端 SSL 证书)。在同一行,如果客户端、服务器和 KDC 的系统时钟不同步,身份验证将失败(可能是使用被攻击者嗅探的旧票进行重放攻击!!)

标签: active-directory kerberos tomcat8 jaas spnego


【解决方案1】:

简而言之,是的,它会起作用,我会告诉你怎么做。首先,让我们澄清您的问题或 cmets 中未正确描述的一些事情和一些陈述:

您有三台机器提供相同的 DNS 名称,这意味着您要么有一个 DNS 循环:如果 IP 或负载均衡器(难以排序)只会返回一个随机列表,service.example.com 将返回一个随机列表A 记录的一个 IP 取决于负载。对于 Kerberos,两种设置的结果是相同的。 现在,如果您需要 Kerberos 身份验证,您不能说 AD 不知道服务或服务器的存在。它会并且必须知道,否则它无法为您的客户创建服务票证并将其传递给服务器。此外,Tomcat will not contact KDC 接受安全上下文,因为服务票证是使用帐户的长期密钥加密的。

方法如下:你已经想通了,一个SPN可以绑定到一台机器上,不允许多个绑定。当您将机器名称绑定到机器帐户(srv1$ 等)时就是这种情况。您需要一个服务帐户。服务帐户是没有密码过期的普通帐户,例如my-service@EXAMPLE.COM。对于此帐户,您将绑定您的 CNAME 或 A 记录。让您的 Tomcat 身份验证器接受此服务帐户的所有安全上下文,它将起作用。

如何在类 Unix 操作系统上创建这个神奇的服务帐户? 使用mskutil 来

  1. 创建服务帐号,
  2. 为该服务帐户创建一个 keytab,
  3. 将您的 SPN 绑定到该服务帐户并更新密钥表。

之后,您将拥有一个适合您使用的密钥表。使用 LDAP 查询(例如,使用 Softerra 的 LDAP 浏览器或其他)验证该帐户是否存在,SPN (servicePrincipalName) 已绑定到该帐户,您就完成了。

重要提示:如果您的任何客户使用 MIT Kerberos 或 Heimdal,您必须将 rdns = false 设置为您的 krb5.conf。

神速!

【讨论】:

  • 其实我没说三台服务器在DNS中同名。您链接的图片并不代表Tomcat是如何做到的。它将联系AD。为什么我不知道。最后重新。您说的服务帐户:“对于此帐户,您将绑定您的 CNAME 或 A 记录”。据我了解,某些浏览器(例如 Firefox)会从 A 记录(总是!)构造服务名称,因此必须使用 A 记录,因为这样可以确保跨浏览器的兼容性。
  • @peterh 是什么让您认为 Tomcat 会联系 AD?除非您在 Wireshark 中看到它,否则它仍然是错误的。
  • @Michael-O 在这里是正确的。应用程序服务器从不联系 AD 进行 Kerberos 身份验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多