active-directory - Kerberos/SPNEGO : multiple SPNs for the same AD account

标签 active-directory kerberos tomcat8 jaas spnego

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

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

  • AD中的一个帐户
  • SPN
  • key 表(在 AD 服务器上生成,然后
    移至 Linux 主机)

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

    This blog有一个很好的秘诀:第一次调用 ktpass (对于 srv1 )应如您在 Internet 上找到的所有指南中所述,但是后续调用(对于 srv2srv3 等)应使用 -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)您的CNAMEA记录。让您的 Tomcat 身份验证器接受此服务帐户的所有安全上下文,它将起作用。

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

  • 创建服务帐户,
  • 为该服务帐户创建一个 key 表,
  • 将您的 SPN 绑定(bind)到该服务帐户并更新 key 表。

  • 之后,您将拥有一个适合您使用的 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/

    相关文章:

    java - LDAP 的 Java 客户端

    hadoop - 将 SPNEGO 凭证转发到安全集群

    java - 信息 : WebSocket connection closed, 代码:尝试运行 websocket 示例时出现 1006

    java - tomcat-embed-core 8.5.4 上缺少 AbstractServletInputStream

    java - 如何在 Amazon Web Services EC2 中安装 Tomcat

    java - 如何使用 UnboundID LDAP SDK 连接到本地主机?

    java - Apereo CAS 使用 NTLM 而不是 Kerberos

    c# - 访问 token 中不包含 Azure AD v2 角色

    apache-spark - 使用 Kerberized Dataproc 集群时,8088 上的资源管理器 UI 无法正常工作

    java - 使用Apache DS/Apache Directory Studio的Hadoop安全性