17

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

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

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

4

2 回答 2

2

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

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

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

如果你运行 HTTPd 作为你的反向代理,它可能会为你处理所有的魔法mod_auth_gssapi

在 Windows 上,安全 API 和 SSPI 有点麻烦。而主要的转换是免费的 Windows。您将需要LsaLogonUserwith KERB_S4U_LOGON,模拟该句柄,然后要求 SSPI 获取一个 cred 句柄...

于 2019-07-08T19:47:33.407 回答
2

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

于 2019-07-18T06:36:48.953 回答