使用LOGON32_LOGON_NETWORK_CLEARTEXT的令牌代表团

问题描述:

使用LOGON32_LOGON_NETWORK_CLEARTEXT的安全性如何?使用LOGON32_LOGON_NETWORK_CLEARTEXT的令牌代表团

我们有以下情形:

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

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

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

试图使用DuplicateToken将令牌“升级”为交互式失败。这种尝试是基于这篇文章上它指出:

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

但是,如果我们使用LOGON32_LOGON_NETWORK_CLEARTEXT,如this old thread中所述,代理工作。但它的使用有多安全?根据MSDN:

“这种登录类型保留在认证 包,它允许服务器进行连接到其他网络 服务器,同时模拟客户端用户名和密码的服务器可以接受来自明文 凭据。一个客户端,调用LogonUser,验证用户可以通过网络访问系统,并且仍然与其他 服务器进行通信。“

在这种格式中使用的证书是否可用于嗅探器(我们使用Windows集成安全性,有时使用SSL但不总是)。

请指教。

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

理想/最安全用例是如果你的代码看起来是这样的伪代码:当您关闭它的句柄(我还没有找到这个参考

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,且两种协议都不会在线路上发送凭据,因此这不是问题。我无法确定如果远程服务器要求进行基本身份验证会发生什么情况,但我认为它很可能会失败,而不是您的凭据将被发送。

如果您需要将令牌保持更长时间,则文档确实会声明凭证以明文(某处)存储。我拿了一个测试过程的转储,并且无法在转储文件中找到它们,所以我不知道这是否意味着它们存储在内核内存或内存中。如果我必须长期保留这个标记,我会有点担心。

+0

我的疑虑基本上是两个:无论如何,当服务器A连接到服务器B(如原始问题中所述)时,是否可以嗅探凭证,以及流程转储是否可能会透露它们。网络嗅探困扰我更多。我非常失望,MS没有提供有关此令牌的其他信息(或者至少我找不到有关此令牌的任何信息)。 – ewolfman 2015-04-23 17:19:22

+0

有线协议的安全性是一个正交的问题。如果服务器需要明文密码,那么如果要进行身份验证,则不需要执行任何操作。但即使这样做,您也可以使用TLS加密整个频道。如果您无法控制服务器,您至少可以与供应商讨论其需求。如果您可以否决发送您的凭证,那将会很好,但是我不能想到这是一个值得关注的现实情况 - 如果您不信任服务器,您为什么要对其进行身份验证? – bmm6o 2015-07-16 16:42:57