【问题标题】:Token delegation using LOGON32_LOGON_NETWORK_CLEARTEXT使用 LOGON32_LOGON_NETWORK_CLEARTEXT 的令牌委托
【发布时间】:2015-01-18 20:53:20
【问题描述】:

使用LOGON32_LOGON_NETWORK_CLEARTEXT 有多安全?

我们有以下场景:

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

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

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

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

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

但似乎如果我们使用this old thread 中所述的 LOGON32_LOGON_NETWORK_CLEARTEXT,则委托有效。但它的使用安全性如何?根据 MSDN:

"此登录类型在身份验证中保留名称和密码 包,它允许服务器连接到其他网络 冒充客户端时的服务器。服务器可以接受明文 来自客户端的凭据,调用 LogonUser,验证用户是否可以 通过网络访问系统,并且仍然与其他人通信 服务器。”

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

请指教。

【问题讨论】:

    标签: token winlogon


    【解决方案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 会话关联的纯文本凭据将被销毁(我还没有找到这方面的参考资料,但他们不会这样做对我来说没有意义)。因此,在令牌的生命周期内,存在用户凭据的副本,并用于对远程服务器进行身份验证。但是您的应用程序已经在内存中拥有明文凭据(在变量 usernamedomainpassword 中),因此这不会真正带来额外的安全风险。

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

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

    【讨论】:

    • 我的担忧基本上有两个:当服务器 A 连接到服务器 B 时,是否可以嗅探凭据,如原始问题中所述,以及进程转储是否可能以任何方式显示它们。网络嗅探让我更加困扰。我很失望 MS 没有提供有关此令牌的其他信息(或者至少我找不到有关此令牌的任何信息)。
    • 有线协议的安全性是一个正交问题。如果服务器需要明文密码,那么如果您想进行身份验证,则无需做太多事情。但即便如此,您也可以使用 TLS 加密整个通道。如果您无法控制服务器,您至少可以与供应商讨论其要求。如果您可以否决发送您的凭据会很好,但我想不出一个令人担忧的现实场景 - 如果您不信任服务器,为什么要对其进行身份验证?
    猜你喜欢
    • 2013-01-06
    • 2020-06-07
    • 1970-01-01
    • 2017-05-13
    • 2020-12-07
    • 2023-03-29
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多