【问题标题】:Kerberos, delegation and how to do this correctly?Kerberos,委托以及如何正确执行此操作?
【发布时间】:2009-10-22 11:53:37
【问题描述】:

我有两个独立的自制应用程序需要相互通信。一个是前端应用程序(实际上是asp.net),另一个是会计应用程序的后端接口。后端接口不是专门为此前端创建的 - 它是许多其他应用程序用来与我们的产品集成的通用接口。

为了方便用户,我们希望在前端应用程序中提供 Windows 身份验证。然而,这意味着我们需要将凭据传递给必须检查它们的后端应用程序。

我们不希望将我们的前端设置为后端的“受信任”应用程序,它可以将自己验证为任何用户。如果前端被黑客入侵,那么它也会危及后端系统。

据我了解,使用 Windows 身份验证的一种方法是 Kerberos 委派。但是,这需要为要被委派的用户和进行委派的机器(带有我们前端的服务器)显式启用。默认情况下,这些选项在 Active Directory 中是禁用的,我怀疑许多系统管理员会保留为所有用户启用这些选项。

另外,我不确定这是否是 Kerberos 委派的目的。我不需要我们的前端来模拟正在连接的用户。我只需要证明这个用户已经对我进行了身份验证。

你会怎么做?

【问题讨论】:

  • 什么是后端认证?您表示前端是 Windows 集成的(因此是一个 Intranet 应用程序),但后端应用程序也是 WIA 吗?
  • Kerberos 为此 - 例如,我们 LAN 上的用户连接到网络服务器,该网络服务器又连接到 SQL Server 使用用户凭据。这允许我们根据用户拥有每个表/字段的权限。这里的困难在于,两个系统都需要了解 Kerberos 委托——获取各种令牌的网站和根据相同权限验证它们的后端。我不相信这会直接实现,但您可以在 UI 和后端之间设置委托感知代理。

标签: kerberos delegation


【解决方案1】:

我不清楚你的用例能做什么,不能做什么,但我可以回答这个问题Kerberos 委派的目的是什么。

首先让我们谈谈 Kerberos 在委派之前做了什么。理解这部分很重要,因为它很微妙。

Kerberos 验证网络上两个端点之间通信的 BOTH 端的身份,这些端点可以是交互式用户或计算机上运行的服务。

这是强身份验证,因此它不会允许任何形式的中间人攻击。如果设置正确,端点可以保证它们不会受到损害。到服务名称的级别(如果您连接到一台机器上的 II,它与连接到同一台机器上的 SQL Server 是不同的)。它大量使用现代加密技术并需要使用安全证书。身份验证协议的细节很复杂,现在不值得一提,但它涉及两个身份验证端点和身份验证服务器之间的大约 20 个不同的确认步骤(在 Windows 中,域控制器是身份验证服务器)。

那么委托到底是什么?

Delegation 是 Microsoft 对 Kerberos 标准的扩展,它 允许受信任的来源继续对另一个来源进行身份验证 终点。

这使您可以充当“中间人”——但是必须明确设置许多设置、安装证书等才能使其正常工作。这远非简单。 (编辑:这是关于细节的另一个 SO 答案 - https://stackoverflow.com/a/954154/215752

因此,例如,您可以让某人对网站进行身份验证,然后让 .NET 代码以同一用户身份连接到 SQL Server,以使用该用户的权限读取数据。


现在回答你的问题,因为我不确定你想做什么,我提出三个选择:

1) 您希望以与在网站上进行身份验证的用户相同的用户身份连接到后端系统。

  • 在这种情况下,Kerberos 委派是完美的——它完全符合您的要求。

2) 您希望以不同于在网站上进行身份验证的用户(例如服务帐户)的身份连接到后端系统。

  • 在这种情况下,您不需要委派。 Kerberos 连接到网站,Kerberos(作为不同的用户)连接到后端都可以很好地工作。

3) 您想在某些时候以 SAME 用户身份连接到后端系统,而在其他时间以 DIFFERENT 用户身份连接后端系统。 (例如,您需要验证这是后端系统的合法用户,但希望在其他时候作为系统帐户执行受信任的操作。这是(根据我的经验)最常见的用例。)

  • 在这种情况下,您可以同时使用两者。授权需要验证用户身份的连接,然后在您需要系统访问后端时恢复到服务帐户身份。 (我之前的一个问题详细介绍了如何在 .NET 平台上恢复为系统标识,请参阅How to "un-impersonate" (un-delegate?) in Kerberos。)

【讨论】:

  • 这应该是公认的答案,在具体回答 OP 之前与许多情况相关的良好概述。
【解决方案2】:

这里有一篇文章描述了 Kerberos 的工作原理以及如何设置它。

ASP.NET passing along Windows Authentication credentials

【讨论】:

  • 嗯,是的,那是我的帖子。 :) 这是下一个。问题是不同的。您的回答让我怀疑我是否以正确的方式使用 Kerberos。
  • opps 抱歉太早了。我觉得奇怪的是,像这样的两个问题会如此接近。
【解决方案3】:

实际上,Kerberos 委托就是专门为这个用例设计的。但这里的挑战是在旧系统上使用您不想更改的 AD 设置来制作它。

一种可能的破解方法是让前端仅发送用户和身份验证时间,但后端可以查询 Active Directory 事件日志以确定该用户是否已通过前端身份验证。这需要您使用 WIndows 事件日志 API。还需要使用 AD 中的事件日志设置来记录服务票证的问题。 (我记得这是默认设置) -

【讨论】:

  • 我想说这很容易被滥用,而且系统越忙,就越有可能发生错误批准。它还假设所有时钟都完全同步(希望是真的,但不能保证)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2014-08-06
  • 1970-01-01
  • 2014-05-21
  • 2010-11-16
相关资源
最近更新 更多