【问题标题】:Storing Kerberos authentication for later impersonation存储 Kerberos 身份验证以供以后模拟
【发布时间】:2011-12-15 14:18:38
【问题描述】:

是否可以存储 Kerberos 票证以便以后使用它来模拟用户?

我有这样一个场景,用户直接调用外部系统来处理一些数据。外部系统依赖于在 AD 中正确模拟/验证用户。

现在调用系统必须更改,以便在用户和外部系统之间建立一个队列,并且队列中的工作由 Windows 服务从该队列移交给外部系统。 此服务需要模拟用户,以便外部系统正确处理用户权限。

鉴于我无法更改外部系统并且无法将用户名和密码存储在队列中,我是否可以在用户将新工作项添加到队列时保存 Kerberos 票证,然后当服务模拟用户时它将数据移交给外部系统。我将如何在 C# 中做到这一点?

【问题讨论】:

  • 您的服务使用哪种队列?一个系统消息队列,一个 MSMQ ?因为如果您使用的队列是基于 RPC 的,您的服务可以模拟最终用户。

标签: c# .net authentication active-directory kerberos


【解决方案1】:
  • 编辑:这是我能得到的最接近您的实际问题的答案:您可以在模拟下启动一个单独的线程,从那里发出请求,不管需要多长时间?在幕后,这将满足需要(当然,除非服务进程终止)。

正如一位微软人员曾经告诉我们的那样,“安全性是在您部署应用程序时阻止它工作的东西”。 (他的意思是使用现实的安全设置进行测试)。

票的有效期可能为 10 小时,但这是从出票开始算起的时间。到用户提出请求时,它可能只剩下一小部分。

我建议您以不同的方式简单地解决根本问题。

您现在需要排队的原因是什么?仅仅因为外部服务在高峰时段阻塞?

  • 您能否加强或横向扩展硬件?通常是最便宜的方式。
  • 您实际上是否拥有完全独立的权限,或者用户是否拥有有限数量的角色?如果是角色,您可以记录用户所在的角色,并使用专门创建的用户名来访问外部服务,每个角色一个。
  • 外部服务是你的吗?您能否添加一个不依赖于 Windows 模拟的“假装是 Bob”选项?
  • 您能否在模拟下启动一个单独的线程,从那里发出请求,不管需要多长时间?然后邮寄给用户? (是的,这将在幕后按照您的要求进行)
  • 最后,您可以将用户置于浏览器“配给队列”中。 IE。给他们一个数字,然后让浏览器每 10 秒刷新一次(或使用 Ajax)来告诉他们队列中有多少人在他们前面。轮到他们时,冒充提出实际请求。 (这要求他们在队列中等待时保持浏览器窗口打开,并且还要求您跟踪未完成的请求和活动浏览器与消失的浏览器)。讨厌,但会起作用。

在不知道实际问题的情况下,很难给出建议,除了说不要这样做——太多的陷阱。

【讨论】:

  • 由于多个要求/限制而选择了队列(服务不可用 24/7 但需要将项目添加到队列中,队列必须是可靠的(包括在重新启动后仍然存在),外部服务阻塞,客户端需要为外部服务添加工作,但可以在工作开始或完成之前注销)外部服务不受我控制,因此不能添加“伪装成 Bob”选项。虽然票证的有效期可能较短,但仍可以在最长 10 小时以上续订。 TL;DR:队列是必需的,任何解决方案都必须在重新启动后继续存在
  • @GaussZ:在重启后幸存下来的解决方案是一个可怕的安全漏洞。想想看。这很难做到是有原因的——因为这不是一个好主意。我知道你对我的其他建议说 TL;DR,但也许你应该花点时间。建议 1 或 2 是您最好的选择。
  • 当然它不应该是一个全能的安全漏洞。这就是为什么 Kerberos 令牌方法受到青睐的原因。如果有人能够破坏服务器并使用存储在队列中的 Kerberos 令牌,那么他已经能够破坏 Web 服务并使用发送给它们的令牌。我也想使用另一种方法,并感谢您的建议,但由于限制就是它们(特别是无法修改外部系统),这个想法确实让我觉得是最好的选择。
【解决方案2】:

也许可以保存它,但我认为这张票将是短暂的。不幸的是,除非您在网络上正确设置了委派,否则您肯定会遇到Kerberos double-hop issue 的身份验证失败的服务。这将要求您在 Active Directory 上设置一些 SPN(服务主体名称),以告知服务器相互信任。

我从未尝试将 Kerberos 票证保存任何时间,因此即使在与委派和 SPN 发生冲突之后,它也可能无法正常工作。

这里有一篇关于设置IIS7 to handle double hop Kerberos tickets 的快速帖子和另一篇关于handling it from the networks point of view 的文章。

我希望我能提供更多帮助,并发布代码而不是文章 - 但当您进行调查时,您会发现这是 Kerberos 身份验证的祸根。祝你好运!

【讨论】:

  • 感谢您的评论,但应该注意双跳问题。唯一缺少的部分是在代码中获取 Kerberos 票证并将其存储以供以后重新模拟。
  • 你想存储多久?一分钟,几个小时?如果我没记错的话,票证的有效期为 5 分钟。
  • Kerberos 票证的默认生命周期应为 10 小时。它也可以通过更新 afaik 来延长。你从哪里得到 5 分钟的限制?
  • 对不起,那是默认的时间偏差......我认为你可以复制传入请求的令牌(你还没有说他们如何发送请求)并存储它重复的令牌以及请求的详细信息。然后基于该令牌创建一个新的 WindowsIdentity,以便在调用外部系统时进行模拟。
【解决方案3】:

此解决方案有一个很大的警告,但目前您可以使用LsaLogonUser 函数和受约束的委托来获取用于模拟的令牌,而不是存储令牌/票证工作已准备好出列。

这就是协议转换的实现方式,其中非 Windows 凭据(例如在公共网站上)可以映射到被模拟访问内部资源的域用户。

需要注意的是,这显然是一个巨大的潜在安全漏洞,运行调用LsaLogonUser 的进程的帐户必须被授予SeTcbPrivilege(“作为操作系统的一部分”)。

如果有一种存储票的方法,那显然会好很多,但是当我看到这个问题时,我首先想到的是@Ben提到的到期时间问题。

编辑: A couple of excellent articles 谈协议转换和约束委派,广泛涵盖所涉及的风险。

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2017-07-13
    相关资源
    最近更新 更多