我的本地计算机使用 Windows 7 Pro,属于由 AD 服务器管理的领域 LR。我连接到该领域的网络后登录我的计算机。我可以使用 MIT Kerberos for Windows 版本 4.0.1 查看 TGT。
我想访问外部领域 FR 上的资源。LR 和 FR 之间没有 Kerberos 信任,但它们允许彼此之间的 TCP 通信。我使用其 KDC(Red Hat IdM / FreeIPA)为 FR 请求 TGT,并在受到质询时成功输入我的密码。同样,我可以使用 MIT Kerberos for Windows ver. 4.0.1 查看 TGT。现在我可以通过 SSH 访问 FR 中的资源,而无需输入密码,尽管它来自 LR。
问题是,当我获得 FR 的 TGT 时,LR 主体的 TGT 消失了。MIT Kerberos 中只有 FR TGT 可见。如果我锁定计算机,然后使用密码解锁,那么 FR TGT 就消失了,取而代之的是新的 LR TGT。
看来适用于 Windows 的 MIT Kerberos 一次只能存储一个 TGT。每个 TGT 完全适用于其领域,无论出于何种目的。如何配置 MIT Kerberos 以允许我同时拥有两个 TGT,每个领域一个?是否可以使用多个客户端实例“划分”,每个实例指向不同的 KRB5_CONFIG 和本地密钥表?如果我不能,是否有其他 Windows 客户端 Kerberos 5 实现,即使在没有跨领域信任的情况下也可以实现?
附言:我不想要信托。得不到信托。
更新:我之前省略了一些细节,因为我认为这可能会混淆问题。但根据布拉德的回答,这可能是有道理的。我预计最多本地软件将使用 Windows 内置的 Kerberos 实现并始终使用 LR 密钥表。
但是,像我这样的高级用户在 Cygwin 下使用 heimdal 通过 SSH 进入 FR。我预计通过 Cygwin DLL 的任何内容都会使用 heimdal,并且永远不会看到 LR TGT(实际上不会,至少默认情况下不会)。我明确地 kinit 并继续。
对于我必须支持的非高级用户来说,棘手的部分在于他们不使用 Cygwin 但使用 PuTTY。PuTTY 确实允许您指定要使用的 GSSAPI 实现的库路径和 DLL。例如,我正在配置 SSH 会话以使用 MIT Kerberos DLL 而不是内置的 Windows DLL。我希望有一个 DLL 要么从不尝试查找 LR TGT(如 heimdal),要么允许来自多个领域的多个 TGT。它不必像 MIT Kerberos 那样具有 GUI 窗口,但它有帮助。
答案1
好吧,我不会说 Windows 无法做到这一点,但我会说该限制是基于会话的。 那么问题就是,对于每个会话,Windows 都会缓存一张票。当您锁定计算机然后将其解锁时,将启动另一个会话,并从 KDC 请求一个新密钥。当您注销然后再次登录计算机时,也会发生同样的事情。这种方法实际上也是确定服务器会话的用户权限的方式,这意味着密钥/票证可以被缓存,以便您启动的每个服务器资源或会话都不必要求您输入密码,但我从未听说/读过/研究过它可以缓存多个。
现在,根据您在问题中展示的知识,您可能已经知道了这一点,所以我会说,基于 Windows 存储您在发出 TGT 时获得的密钥并且是基于会话的事实,我认为这在 Windows 上是不可能的。MIT Kerberos for Windows 可能有一种方法可以在一个用户下启动两个会话,但即便如此,我也不确定您访问的资源如何知道要使用哪个票证/密钥对。这有道理吗?
请参阅此处了解 Windows 如何存储 TGT/密钥对的描述。
顺便说一句,这个问题问得非常好。
答案2
好的,我想出了一个可行的解决方案,但需要进一步完善,因此可能无法在所有环境中发挥作用。
适用于:
- 麻省理工学院 Kerberos适用于 Windows 4.0.1,带有 Windows 支持工具 (KSETUP.EXE、KTPASS.EXE)
- 油灰0.63
- Windows 7 SP1
我在 MIT Kerberos 源代码中发现了Windows 版自述文件特别有趣的是凭证缓存. 它支持默认值API:,但我惊讶地发现我的注册表使用密苏里州圣路易斯市警察局:反而。
我尝试了不同的价值观帐号名称下HKEY_CURRENT_USER\Software\MIT\Kerberos5
。我试过了记忆:一开始,这导致了一些有趣的行为。打开 PuTTY 会话时,我的 MIT Kerberos 票证管理器窗口将恢复并转到前台,要求我输入凭据。哇!以前从来没有发生过这种情况,但是可惜的是,PuTTY 会拒绝它。对我有用的值是FILE:C:\Some\Full\File\Path
。我不太确定如何保护对指定文件的访问,所以我将把它留给读者作为练习。我得到了相同的窗口到前台行为,只有 PuTTY 这次喜欢它。票证管理器窗口最终也显示了 LR 和 FR 票证。事实证明,这些票证是可转发的,并且可以在多次 Windows 锁定/解锁后继续存在。笔记:确保在注册表编辑之间完全退出并重新启动票证管理器。我还没有尝试过帐号名称的API:然而。
我不知道这是否有区别,但我也尝试过内核设置在此之前,它无法正常工作。起初,无参数的 KSETUP 只会向我显示有关 LR 的信息。我在本地工作站上添加了一些有关 FR 的信息。
ksetup /AddKdc FOREIGN.REALM KDC.FOREIGN.REALM
ksetup /AddRealmFlags FOREIGN.REALM TcpSupported Delegate NcSupported
答案3
对我来说,这看起来有点像 Windows 版 Kerberos 中确实存在一个错误。
我发现了以下内容:
如果我使用 KfW 4.0.1 窗口中的“获取票证”选项,它就可以正常工作(TM);我可以点击“获取票证”按钮,并获得额外的门票与我登录时获得的原始门票相同。
如果我点击 KfW 窗口中的“设为默认”选项,那么从那时起,每次我点击“获取票据”,新票据都会代替无论票证是默认票证,而不是将另一个条目添加到已知票证列表中。此时检查注册表将显示ccname
已添加条目(如 Toddius 的答案中所示)。移除令人惊讶的是,该条目将恢复以前允许多张票的行为。
答案4
根据 Toddius 的回答,我的一个同事也遇到了类似的情况(Windows 7 Enterprise 64 位,已加入 AD 域,还运行适用于 Windows 4.0.1 的 MIT Kerberos):他的 Kerberos 票证管理器副本只允许他拥有一个主体/一个 TGT。每当他使用“获取票证”按钮获取其他主体的 TGT 时,前一个主体就会消失。
我回顾了自述并且大多数注册表项都按预期设置,除了为了帐号名称路径 处的键HKEY_CURRENT_USER\Software\MIT\Kerberos5
。该键被设置为值MSLSA:
。我们的修复方法是将其更改为API:
。更具体地说,步骤如下:
- 退出 Kerberos 票证管理器以及所有其他应用程序(因为您将重新启动)。
- 在注册表路径中
HKEY_CURRENT_USER\Software\MIT\Kerberos5
,更改帐号名称键为API:
(API,然后是冒号)。 - 退出 regedit,然后重新启动。
- 重新登录后,运行 Kerberos 票证管理器,并使用获取票证按钮获取非 AD 主体的 TGT。
通过上述步骤,一切顺利,我的同事现在可以同时看到多个主体/TGT。
顺便说一句,MIT Kerberos for Windows 引入了自己的一套命令行程序(如 klist),这些程序支持多个凭据缓存。在我的 64 位系统上,当我在"C:\Program Files\MIT\Kerberos\bin\klist.exe" -A"
获得多个 TGT 后运行时,我会在 MSLSA 缓存中看到我的 Active Directory 主体,然后我会为每个附加主体提供一个 API 缓存。
PS 这是我在此网站上的第一篇文章,因此无法将其作为评论添加到 Toddius 的回答中。抱歉!