使用LOGON32_LOGON_NETWORK_CLEARTEXT进行令牌委派

时间:2014-11-20 20:32:50

标签: token winlogon

使用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:

  

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

此格式中使用的凭据是否仍然可用于嗅探器(我们使用Windows集成安全性,有时使用SSL但不总是)。

请告知。

1 个答案:

答案 0 :(得分: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,并且两种协议都不会在线路上发送凭据,因此这不是问题。我不能肯定地说如果远程服务器要求进行基本身份验证会发生什么,但我认为它更有可能失败而不是你的凭据会被发送。

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

相关问题