4

使用LOGON32_LOGON_NETWORK_CLEARTEXT有多安全?

我们有以下场景:

Web 服务器 A 正在使用 Win32 LogonUser。然后它需要在服务器 B 上调用 asmx 方法。

如果使用的登录类型是 LOGON32_LOGON_INTERACTIVE,则效果很好。然而,客户拒绝这样做,因为它需要交互式访问。

如果我们使用 LOGON32_LOGON_NETWORK 这不允许令牌委托给远程服务器,我们会得到 401(正如预期的那样,根据 MSDN)。

尝试使用 DuplicateToken 将令牌“升级”为交互式失败。此尝试基于本文,其中指出:

“当您请求交互式登录时,LogonUser 返回一个主令牌,允许您在模拟时创建进程。当您请求网络登录时,LogonUser 返回一个模拟令牌,可用于访问本地资源,但不能用于创建进程。如果需要,您可以通过调用 Win32 DuplicateToken 函数将模拟令牌转换为主令牌。”

但似乎如果我们使用这个旧线程中所述的 LOGON32_LOGON_NETWORK_CLEARTEXT ,委托就可以工作。但它的使用安全性如何?根据 MSDN:

“这种登录类型保留了身份验证包中的名称和密码,允许服务器在模拟客户端的同时与其他网络服务器建立连接。服务器可以接受来自客户端的明文凭据,调用 LogonUser,验证用户是否可以访问系统跨网络,并且仍然与其他服务器通信。”

以这种格式使用的凭据是否对嗅探器可见(我们使用的是 Windows 集成安全性,有时使用 SSL,但并非总是如此)。

请指教。

4

1 回答 1

1

我有同样的问题,虽然我还没有找到明确的答案,但我已经在字里行间做了一些调查和阅读,这是我的结论(欢迎更正):

理想/最安全的用例是如果您的代码看起来像这样的伪代码:

success = LogonUser(username, domain, password,
    LOGON32_LOGON_NETWORK_CLEARTEXT, provider, out token)
if (success) {
    StartImpersonation(token)
    remoteConnection = AuthenticateToRemoteServer()
    StopImpersonation()
    CloseHandle(token)

    // continue to use remoteConnection
}

当您关闭其句柄时,与 LogonUser 会话关联的纯文本凭据将被销毁(我还没有找到这方面的参考资料,但他们不会这样做对我来说没有意义)。因此,在令牌的整个生命周期内,都有一份用户凭据的副本,它用于对远程服务器进行身份验证。但是您的应用程序已经在内存中以明文形式(在变量和中)拥有凭据username,因此这并不会真正带来额外的安全风险。domainpassword

任何使用 Windows 身份验证的远程服务器的身份验证都将使用 NTML 或 Kerberos,并且这两种协议都不会通过网络发送凭据,所以这不是问题。我不能确定如果远程服务器要求进行基本身份验证会发生什么,但我认为它更有可能失败,而不是发送您的凭据。

如果您需要将令牌保留更长时间,文档确实声明凭据以明文(某处)存储。我转储了一个测试进程,但无法在转储文件中找到它们,所以我不知道这是否意味着它们存储在内核内存中或什么。如果我不得不长时间保留这个令牌,我会有点担心。

于 2015-02-11T23:49:28.797 回答