【发布时间】:2016-09-13 19:34:23
【问题描述】:
在多个 Web 服务器(srv1、srv2 等)上部署相同的基于 HTTP 的应用程序。使用 SPNEGO auth 保护应用程序。服务器是 Linux,AD 不知道它们的存在,即它们没有加入域。我已经让整个 SPNEGO 在单个主机上顺利运行。现在转到后续主机。
我发现的大多数指南都会告诉你你需要
- AD 中的帐户
- SPN
- 密钥表(在 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 映射。我猜userPrincipalNameLDAP 字段只是冰山一角……AD 使用其他方法来根据实际 ID 解析主体。 -
是的,也许我的问题是我真的不明白 Tomcat 和 AD 之间的最后一步发生了什么。
-
重要的是 inside AD 发生的事情 -- Tomcat 只是连接到端口 88 并执行常规的 Kerberos 工作,就好像它是 MIT Kerberos 服务而不是 Microsoft生物。
-
我猜 Kerberos 协议假定票证可能是伪造,因此服务器不能“接受”票证而不检查 KDC (就像它应该根据证书撤销列表检查客户端 SSL 证书)。在同一行,如果客户端、服务器和 KDC 的系统时钟不同步,身份验证将失败(可能是使用被攻击者嗅探的旧票进行重放攻击!!)
标签: active-directory kerberos tomcat8 jaas spnego