如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌

Posted

技术标签:

【中文标题】如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌【英文标题】:How to transform NTLM credentials to Kerberos token in Node.js 【发布时间】:2019-11-18 01:15:21 【问题描述】:

我想使用 Node.js 构建一个服务器,它充当某种代理。连接到我的服务器的客户端使用 NTLMv2 进行身份验证(无法更改此设置),但我的服务器将连接到的上游服务器需要 Kerberos 令牌。

所以,我的问题很简单:如何使用 Node.js 将 NTLMv2 提供的信息转换为 Kerberos 令牌?在 npm 上,到目前为止,我已经找到了用于 NTLMv2 身份验证的模块,但我可能需要与 Windows 对话以将用户的 NTLMv2 数据转换为该用户的令牌。

任何提示,如何解决这个问题?

【问题讨论】:

不太确定这怎么可能,因为我不熟悉 ntlmv2/kerberos。但是对于每个代理请求,您真的需要将客户端的身份验证信息传递/转换到 kerberos 吗?也许您的节点服务器可以在启动时作为 kerberos 服务器的客户端进行身份验证并重用连接? Node.js 服务器作为 Windows 服务运行,可能为多个用户提供服务,所以很遗憾,这不是一个选项。 【参考方案1】:

绝对不是! NTLM 和 Kerberos 的运作方式完全不同。首先,我强烈建议尽快摆脱 NTLM。

如果您可以访问 C 接口,您可以轻松地解决您的问题。我还假设您在 CentOS 或 FreeBSD 等类 Unix 操作系统上使用 MIT Kerberos。

NTLM 将为您提供下级登录名。您首先需要通过 LDAP 将 NetBios 域转换为 DNS 域(使用 libopenldap),然后您可以为您的客户端构建 Kerberos 主体或企业主体。然后在您的 KDC 中创建一个服务帐户,并在该帐户上为目标服务启用协议转换和约束委派。现在代表该用户主体请求 TGT 并为用户请求服务票证,瞧,您可以访问您的 Kerberos 后端。 这是一篇不错的读物:https://k5wiki.kerberos.org/wiki/Projects/Services4User

如果您将 HTTPd 作为反向代理运行,它可能会使用 mod_auth_gssapi 为您处理所有魔法。

在 Windows 上,安全 API 和 SSPI 有点麻烦。虽然 Windows 中免费提供了主要的转换。您将需要 LsaLogonUserKERB_S4U_LOGON,模拟该句柄,然后要求 SSPI 获取凭据句柄...

【讨论】:

感谢您的回答。有些部分描述得非常简单,您是否可以用更多细节来扩展您的答案,以便对于大多数这些术语都是新的人来说更容易理解? IOW:您能否添加更多信息,说明为什么需要这样做和那样,以及如何执行这些操作的更多细节? 究竟是哪个...? 基本上都是? 这需要一段时间。我建议做一些研究。您将需要编写本机代码将其映射到 JS 空间。 除了@Michael-O ' 答案是一个很好的流程图,它显示了为什么 ntlm 不能转换为 kerberos dzone.com/articles/… => Kerberos。简而言之。 kerberos 服务器将票据提供给客户端,客户端将票据发送给服务器进行身份验证。【参考方案2】:

如果您的 KDC 允许约束委派,您可以设置中间服务器以允许模拟。这样,它可以以一种机制(在您的情况下为 NTLM)与客户端建立安全上下文,并以另一种机制(Kerberos)代表客户端与后端服务器通信。谷歌“约束委派”和“协议转换”以获取更多信息。希望这会有所帮助。

【讨论】:

你在重复我写的,为什么? 对不起,我看到你的“绝对不是”第一行,然后开始写我的答案。我没有意识到您实际上提供了解决方案。

以上是关于如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在node js中将promise转换为回调?

如何在 node.js 中将位字符串转换为 base64?

在node.js和GraphicsMagick中将tiff转换为jpeg

如何在 Node JS 中将原始 PCM 流转换为 Discord 机器人的 opus 或 wav 流?

在 Node.js 中将 Buffer 转换为 ReadableStream

如何在 node.js 中将函数与 Promise 同步