Kerberos / SPNEGO:同一AD帐户的多个SPN

时间:2016-09-13 19:34:24

标签: active-directory kerberos tomcat8 jaas spnego

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

我找到的大多数指南都会告诉你需要

  1. AD中的帐户
  2. SPN
  3. 密钥表(在AD服务器上生成然后 移到Linux主机上)
  4. 虽然我认为(2)+(3)总是需要每服务器,但我有点不确定(1)。我只能使用一个帐户吗?如果我只能使用一个帐户,我真的不希望在AD中拥有所有这些帐户。

    This blog有一个很好的方法可以完成它:ktpasssrv1)的第一次调用应该如您在互联网上找到的所有指南中所述但是后续调用(srv2srv3等)应该使用-setpass和-setupn选项。

    但是,我发现当使用ktpass.exe工具时,帐户的userPrincipalName属性会更改为上次调用ktpass时的princ参数所给出的值。所以srv的名称,例如srv3被编码到名称中,因此帐户的名称基本上会随着每次调用ktpass而改变。当Web服务器执行SPNEGO事件链中的最后一步(即使用密钥表作为凭据联系AD)时,它将在AD中查找一个帐户,其userPrincipalName等于SPN,因此此步骤将失败。 (source,滚动到上一篇文章,列出项目3)。与此相反,我正在使用Tomcat,从而使用JAAS,据我所知,我可以hardcode the principal name to use in my jaas.conf file从而有效地忽略keytab中的主体名称。

    AD中的多个应用服务器+单个帐户是否可以正常工作?如果可以,该怎么办?

1 个答案:

答案 0 :(得分:1)

简而言之,是的,它会奏效,我会告诉你如何。首先,让我们澄清你的问题或评论中没有正确描述的一些事情和一些陈述:

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

以下是方法:您已经发现一个SPN可以绑定到一台计算机,不允许多个绑定。将机器名称绑定到计算机帐户(srv1$等)时就是这种情况。您需要服务帐户。服务帐户是没有密码到期的常规帐户,例如my-service@EXAMPLE.COM。对于此帐户,您将绑定CNAMEA记录。你有Tomcat身份验证器接受这个服务帐户的所有安全上下文,它会工作。

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

  1. 创建服务帐户
  2. 为该服务帐户创建密钥表
  3. 将您的SPN绑定到该服务帐户并更新密钥表。
  4. 之后,您将拥有一个适合您使用的密钥表。使用LDAP查询(例如,使用Softerra的LDAP浏览器或其他方式)验证该帐户是否存在,SPN(servicePrincipalName)是否已绑定到该帐户并且您已完成。

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

    一帆风顺!