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

Active directory Kerberos/SPNEGO:同一AD帐户的多个SPN,active-directory,kerberos,tomcat8,jaas,spnego,Active Directory,Kerberos,Tomcat8,Jaas,Spnego,在多个web服务器上部署相同的基于HTTP的应用程序(srv1,srv2,等等)。使用SPNEGO auth保护应用程序。服务器是Linux,AD不知道它们的存在,即它们没有加入域。我让整个SPNEGO在一台主机上顺利运行。现在转到后续主机 我找到的大多数指南都会告诉你 广告中的叙述 SPN 密钥表(在AD服务器上生成,然后 移动到Linux主机) 虽然我相信(2)+(3)总是需要每个服务器,但我对(1)有些不确定。我只能用一个帐户吗?我真的不想有所有这些帐户在广告中,如果我能做的只有一个 有一

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

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

  • 广告中的叙述
  • SPN
  • 密钥表(在AD服务器上生成,然后 移动到Linux主机)
  • 虽然我相信(2)+(3)总是需要每个服务器,但我对(1)有些不确定。我只能用一个帐户吗?我真的不想有所有这些帐户在广告中,如果我能做的只有一个

    有一个很好的方法可以做到:第一次调用
    ktpass
    (对于
    srv1
    )应该如您在互联网上找到的所有指南中所述,但是后续调用(对于
    srv2
    srv3
    )应该使用-setpass和-setupn选项

    但是我发现,当使用
    ktpass.exe
    工具时,帐户的
    userPrincipalName
    属性将变为上次调用
    ktpass
    时的princ参数。因此,srv的名称(例如,
    srv3
    )被编码到名称中,因此每次调用ktpass时,帐户名称基本上都会发生变化。当web服务器执行SPNEGO事件链中的最后一步时,即使用keytab作为凭据联系AD,它将在AD中查找
    userPrincipalName
    等于SPN的帐户,因此此步骤将失败。(,滚动至最后一篇文章,列出项目3)。与此相反的是,我使用的是Tomcat和JAAS,据我所知,我可以有效地忽略键表中的主体名称


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

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

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

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

    如何在类Unix操作系统上创建这个神奇的服务帐户? 习惯于

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

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


    祝你好运

    不确定您的推理——JAAS配置文件定义了系统将呈现给KDC的主体(显式)和“散列密码”(来自keytab文件)。在您的情况下,KDC是Active Directory,AD不使用主体作为帐户ID。这就是
    setspn
    命令的要点:定义帐户ID和(列表)SPN之间的1..N映射。我想,
    userPrincipalName
    LDAP字段只是冰山一角。。。AD使用其他方法根据实际ID解析主体。是的,也许我的问题是我不太理解Tomcat和AD之间的最后一步中发生了什么。更重要的是AD内部发生了什么——Tomcat只连接到端口88并执行常规Kerberos操作,就像它是麻省理工学院的Kerberos服务,而不是微软的产物一样。@SamsonScharfrichter。事实证明,这是我无法理解的。我不认为这家伙真的能得到答案。Tomcat只需从服务票证中提取用户名,并不需要广告来建立用户身份。对吗?似乎有一些地方确实不需要这一步骤。如果web服务器主机加入到域或不加入域,可能就必须这样做?我猜Kerberos协议假定票据可能是伪造的,因此服务器无法在不根据KDC检查票据的情况下“接受”票据(就像它应该根据证书撤销列表检查客户机SSL证书一样)。在同一条线上,如果客户端、服务器和KDC的系统时钟不同步,身份验证将失败(可能是使用攻击者嗅探到的旧票证的重放攻击!!)实际上我没有说这三个服务器在DNS中具有相同的名称。你链接的图片不代表Tomcat是怎样的