Kerberos,委托以及如何正确地执行此操作?

时间:2009-10-22 11:53:38

标签: kerberos delegation

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

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

我们不希望将我们的前端设置为后端的“可信”应用程序,后端可以作为任何用户进行身份验证。如果前端被黑客攻击,那么它也会破坏后端系统。

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

另外,我不确定这是Kerberos代表团的意思。我不需要我们的前端来冒充连接的用户。我只需要证明这个用户已经对我进行了身份验证。

你会怎么做?

3 个答案:

答案 0 :(得分:8)

我不清楚你的用例是什么和不能用,但我可以回答 Kerberos代表团的意图。

首先让我们谈谈Kerberos在授权之前所做的事情。重要的是要理解这部分,因为它很微妙。

  

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

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

那么代表什么呢?

  

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

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

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


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

1)您希望作为SAME用户连接到后端系统,作为在网站上进行身份验证的用户。

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

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

  • 在这种情况下,您不需要委托。网站的Kerberos和后端的Kerberos(作为不同的用户)将非常有用。

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

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

答案 1 :(得分:0)

这是一篇描述Kerberos如何工作以及如何设置的帖子。

ASP.NET passing along Windows Authentication credentials

答案 2 :(得分:0)

实际上,Kerberos委派专门针对此用例而设计。但是,这里的挑战是在遗留系统上制作这个,并且使用AD的设置,你不想改变它。

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