问题标签 [kerberos-delegation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2546 浏览

asp.net - 实现 ASP.Net 模拟/委托以从 ASP.Net 服务器连接到远程 SQL Server 不起作用

我正在尝试使用 ASP.NET 4.5/SQL Server 2016 为 Web 应用程序设置模拟/委托。目标是在 Web 应用程序和 SQL Server 上使用 Windows 身份验证。

我在 Azure 上复制了一个类似于将用于生产的设置,但我似乎无法找到导致模拟不起作用的原因。

Azure VM #1 [机器名称:test-iis-server]:运行 IIS 8.5 并充当 Active Directory 域控制器的 Windows Server 2012

Azure VM #2 [机器名称:test-sql-server]:运行 SQL Server 2016 的 Windows Server 2016

Azure VM #3 [机器名称:test-client]:用于模拟用户连接到网站的 Windows 10 机器

我创建了一个名为TEST. 可以使用在 Active Directory 中创建的用户连接到 3 台计算机。

IIS Web 服务器配置:

  • 在 web.config 文件中:

    • Authentication mode = Windows
    • Identity impersonate = True
    • validation validateIntegratedModeConfiguration = False
    • Integrated security = SSPI
  • 在 IIS 管理器中:

    • Windows authentication = Enabled( Kernel-mode authentication = Disabled, Providers = Negotiate:Kerberos)
    • ASP.NET Impersonation = Enabled
    • 应用程序池 = Integrated Managed Pipeline( Identity = Custom Identity: test\my-svc-account)
  • Active Directory Users & Computers

    • 对于每台计算机(Web 服务器、sql 服务器和用户计算机),我进入 Properties 并检查了Delegation选项卡Trust this computer for delegation to any service (Kerberos only)

SQL 服务器配置

  • 我没有在这里设置任何东西。我假设 ASP.NET 将使用登录 Web 应用程序的用户的凭据来访问 SQL Server 数据库。
  • 编辑:SQL Server 服务帐户:test\my-svc-account

结果:

  • 如果我不在 Web 应用程序中使用模拟并使用在 SQL Server 中创建的已定义用户/密码登录,我的应用程序可以正常工作,并且如果需要,我可以获得 Windows 用户凭据。

  • 使用模拟,打开 Web 应用程序页面时出现 SQL Server 连接错误:Login failed for user 'TEST\test-iis-server$'.

预期行为:

  • Web 应用程序将使用用于登录“测试客户端”机器的凭据登录 SQL Server。

我已经阅读了很多关于如何为我的解决方案实施模拟/委托的内容,但似乎无法找到问题所在。任何人都知道问题可能来自哪里以及我如何解决它?

编辑#1:

  • 根据我的阅读,我似乎需要设置 SPN。我对如何为我的双跳场景正确设置它们感到困惑。
  • 我在 Active Directory 中创建了一个用户帐户来充当服务帐户。我已将此帐户设置为受信任以进行委派。
  • 我将此帐户用作 IIS 中我的应用程序池的标识以及 SQL Server 实例的服务帐户。
0 投票
1 回答
318 浏览

sql-server - 链接服务器在同一服务器上时双跳,差异服务器上的客户端?

我试图解开一个谜。我们有两个 SQL Server 实例驻留在同一台服务器上。SQL 实例 A 链接到 SQL 实例 B。使用传递身份验证进行连接。调用服务位于不同的服务器上。没有为 Kerberos 委派、没有 SPN、没有信任委派等设置任何设置。但是,通过链接服务器连接运行分布式查询时,我们没有遇到身份验证失败。这对我来说毫无意义,除非在单个服务器上拥有两个实例会导致单跳场景(从调用客户端服务到两个实例所在的服务器)。底层 Kerberos 配置现已到位,因此 Kerberos 已成功使用,我只是想了解在进行必要更改之前连接是如何工作的。有没有人对此有任何见解?谢谢。

0 投票
1 回答
2789 浏览

sql-server - Kerberos 双跳

我们有臭名昭著的 Kerberos 双跳问题。

这是一个全新的域,是从以前使用模拟和委派的另一个提供商迁移而来的。我们已将操作系统升级到最新的 SQL Server (2017)。

WPF 应用程序(使用域凭据)-> Web 服务(IIS 10 上的 WCF 应用程序)-> SQL 2017(命名实例)

Web 服务在域帐户下运行。Web 服务已注册 spn,匿名身份验证和表单身份验证一样被禁用,ASP.NET 模拟和 Windows 身份验证已启用。提供程序是“协商和 NTLM”,“内核模式”已禁用,“使用应用程序池凭据”已启用。创建的 SPN:

我们能够通过远程计算机上的浏览器登录 Web 服务,输入域凭据并获得预期的响应(显示网页)。IIS 日志按预期显示域用户凭据。

SQL 服务器是一个命名实例,在域凭据下运行。创建的 SPN:

AD 中的 IIS 应用程序池用户帐户设置为对端口和命名实例的 SQL 服务器进行约束委派。

通过软件登录到 Web 服务(WPF 调用 WCF 服务而不调用数据库)时,会看到正常响应。

通过数据库调用通过软件登录到 Web 服务时,sql profiler 显示匿名登录。在 IIS 框中启用 Kerberos 日志记录后,收到以下错误:

我们还尝试了无约束委托,但得到了相同的结果。

SETSPN -X 不显示重复项。

预先感谢您的帮助!

0 投票
1 回答
1911 浏览

azure-active-directory - 如何在 Azure Active Directory 中使用 kerberos 身份验证实现单点登录

使用 Azure Active Directory 当我为我的 Web 应用程序应用单点登录时,我能够成功地执行基于密码的单点登录。

但是当我使用集成 Windows 身份验证(主要用于 kerberos 身份验证)时,我无法配置它。我很困扰。

谁能指导我如何为 Web 应用程序启用 kerberos 身份验证。或者请向我发送任何示例链接,如何为 Web 应用程序设置 kerberos 身份验证。

谢谢!

0 投票
1 回答
858 浏览

powershell - 切换应用程序以使用基于约束的 kerberos

我有一个旧应用程序,我们使用基于委托的 kerberos 进行设置。该应用程序的所有功能都运行良好,直到我们在一台新的 Windows 10 机器上进行了试用。

过了一会儿,我们终于发现 Credential Guard 不能很好地处理这个旧应用程序。

根据https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-considerations

Kerberos 注意事项

当你启用 Windows Defender Credential Guard 时,你不能再使用 Kerberos 无约束委派或 DES 加密。无约束委派可能允许攻击者从隔离的 LSA 进程中提取 Kerberos 密钥。请改用受限或基于资源的 Kerberos 委派。

我们必须切换我们的实现以使用基于约束的 Kerberos。我对如何做到这一点有点茫然。

我们当前的 SPN 是针对 Web 应用程序名称设置的 - (来自此链接的场景 2 - https://support.microsoft.com/en-ca/help/929650/how-to-use-spns-when-you-configure-托管的网络应用程序

该应用程序仅与 Active Directory 对话。不涉及数据库。该站点当前正在使用域帐户运行应用程序池。

当我尝试像

我收到以下 powershell 错误。

我已经将应用程序归结为一个适用于 Win7/win2012 但不适用于带有凭证保护的 win10 的示例。

更新 1 - 回答 T-Heron 的问题以下是执行结果

如果我做

更新 2-更新 1 中的 -q 不起作用的原因是 spn 设置为 http/WebsiteName.domain.com 而不是 http/WebsiteName.abdomain.com (这是我正在尝试的)

所以所有的 -q 命令现在都可以工作了。但问题依然存在

这是委托选项卡的屏幕截图。 在此处输入图像描述

更新 3 -

这是委托选项卡的新图片,我在执行 IISReset 后使用“仅使用 Kerberos”和“使用任何身份验证协议”进行了尝试,但遇到了同样的问题。(当我按下“添加”按钮时,我添加了网络服务器。在图片中,带有 webServername 的条目的红色框和带有 spn 设置的条目的橙色框(在 HTTP - 服务类型旁边)

在此处输入图像描述

0 投票
1 回答
465 浏览

https - 在通过 http/2 进行 Kerberos 协商后,MS IE 和 Edge 回退到 http/1.1

我们最近更新了 Apache (v 2.4.33) 反向代理以使用 http/2

在第一次请求后,Win 10E 1709 上的 MS IE (v 11.431.16299.0) 和 MS Edge (v 41.16299.402.0) 似乎回落到 http/1.1。两个浏览器都坚持使用 http/1.1,即使在完全刷新并清除缓存后也不会更改为 http/2。

第一个请求(没有 Kerberos 协商身份验证标头)http/2: 第一个请求 http/2 其余的 http/1.1

第二个请求(带有协商标头)以及所有其他请求都是 http/1.1: 带有身份验证标头的第二个请求

当切换到新选项卡时,浏览器直接使用 http/2 处理所有请求,因为身份验证过程是通过会话 cookie 完成的: http/2 在新标签中工作

这种行为有什么合理的解释吗?我如何建议(强制)IE/Edge 继续使用 http/2?

Kerberos 协商在这里很容易解释: https ://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/47 /48/8468.4.png

0 投票
1 回答
697 浏览

c# - 在 Web 应用程序和 API 之间设置 Kerberos 2 跃点身份验证

我正在使用 Windows Server 2018、IIS 10 和我的 Web 应用程序以 .Net Framework 4.5.1 为目标。我的 API 是使用 .Net Core 2.1 和 Visual Studio 2017 构建的。网站和 API 都使用 Windows 身份验证。

我使用此人的教程尝试设置 Kerberos 两跳身份验证(https://blogs.msdn.microsoft.com/surajdixit/2018/02/07/kerberos-configuration-manager-for-internet-information-services-server/)。

我已经采取并尝试过的步骤,

  1. 将应用程序池设置为在自定义域帐户下运行。

  2. 向域帐户添加了一个 SPN,该 SPN 指向域中的网站 DNS 地址

  3. 将应用程序池切换到经典模式

  4. 为网站打开 Windows 身份验证和模拟。

  5. 让系统管理员授予自定义域帐户委托权限。

    我目前面临的问题是,我在 IIS 中对应用程序池和网站进行了所有这些修改,当我尝试连接到网站时,它会提示输入凭据,这不应该发生,因为它应该通过我的身份验证我的 Windows 域帐户,当我输入凭据时,它会再次刷新并提示输入凭据。在本地运行时,一切正常,并且我的 Web 应用程序中的 HttpClient 成功调用了 API。

    我已经花了几个小时在这方面,并希望得到任何帮助。我没主意了。

0 投票
1 回答
532 浏览

sspi - 使用 SSPI 支持多进程的 kerberos 约束委派

我需要使用 SSPI 在 Windows 上支持我们的 C++ HTTP 服务器产品的 Kerberos 约束委派。

对于单个进程服务器,可以使用以下工作流程,并且我有一个工作原型。1) 调用 AcquireCredentialsHandle 2) 调用 AcceptSecurityContext 3) 调用 ImpersonateSecurityContext 4) 做委托 5) 调用 RevertSecurityContext

但是,C++ HTTP 服务器有一个主进程和一个工作进程。两个进程在同一台机器上运行并使用相同的服务帐户,并且每个客户端请求都可以来自不同的用户。主进程可以使用 AcquireCredentialsHandle 和 AcceptSecurityContext 处理 SPNEGO 和 Kerberos 身份验证,但它不知道它需要委派哪个资源,只有工作进程知道。我可以使用哪些 SSPI 将客户端的安全上下文转发给工作人员,以便工作人员可以进行模拟/委托?

似乎一种可能的解决方案是在主人中获取客户的身份,将其转移给工人;然后在工作人员中使用 LsaLogonUser 和 ImpersonateLoggedOnUser。但是,由于 LsaLogonUser 允许无密码登录,我们的安全专家强烈反对使用它。

SSPI 也有 ExportSecurityContext 和 ImportSecurityContext,但是文档很模糊,不确定它是否可以解决我的用例。由于 ImpersonateSecurityContext 文档说它“允许服务器通过使用先前通过调用 AcceptSecurityContext (General) 或 QuerySecurityContextToken 获得的令牌来模拟客户端。”,看来我不能在 ImportSecurityContext 之后调用 ImpersonateSecurityContext。

任何建议表示赞赏。

0 投票
1 回答
2039 浏览

c# - 在模拟另一个用户时请求 Kerberos 票证时,安全包中没有凭据

上下文:在 IIS 和 IIS 重写规则之上用 C# 构建的自定义反向代理/API 网关,利用 OWIN 中间件。

目标:我希望代理首先对传入请求进行身份验证(这在 IIS 中很容易配置)。有了可用的身份,OWIN 中间件应该根据经过身份验证的用户声明一些事情。然而,之后,请求应该被发送到后端 API,这也是 windows 认证的。

我尝试的解决方案:在进一步发送请求之前,OWIN 中间件应该模拟经过身份验证的身份,请求 Kerberos 票证并将其放入 Authorization 标头(as Negotiate XXXXX.....)。

这是使用 C# 标准库的代码:

这是我尝试的另一种实现,使用NSSPI

两种实现都抛出异常,归结为以下 Win32 错误:

安全包中没有可用的凭据

重要信息:

  • 代理托管在 IIS 中,在服务帐户下运行(假设srv_ApiGateway
  • useAppPoolCredentials在 IIS 中设置为True(否则 IIS 甚至无法使用 Kerberos 对初始请求进行身份验证)
  • 服务帐户 ( srv_ApiGateway) 在 AD 中设置为委派给Trust this user for delegation to any service (Kerberos only)
  • 在这两种实现中,删除模拟并在服务帐户工作时简单地请求票证(仅供参考)
  • 代理和后端 API 都有适当的 SPN(直接请求使用 Kerberos 正确验证)。
  • WindowsIdentity.GetCurrent().ImpersonationLevelusing回报内ImpersonationLevel.Impersonation(这应该是可能的Delegation

是否有人对可能导致此问题的原因以及如何解决此双跳反向代理用例有任何建议?任何帮助表示赞赏:)

0 投票
0 回答
540 浏览

kerberos - 使用 Java 和 Kerberos 以不同用户身份创建进程

我正在开发一个 Java 服务器应用程序(在 Windows 下作为服务运行)并希望实现以下场景:

  • 用户向服务器发出 POST 请求。用户通过 Kerberos(SPNEGO、企业环境中的 SSO)进行身份验证。
  • 该服务创建一个新的 Java 进程。该进程必须作为经过身份验证的用户而不是服务用户(模拟/委托)运行。
  • 新进程应在用户的安全上下文中执行。它必须与需要 Kerberos 身份验证的其他远程系统通信(例如文件共享、其他 Web 服务……)。

工作概念验证:

  • 用于 Kerberos 身份验证的带有Waffle的Spring Boot 应用程序。
  • 为经过身份验证的用户创建一个新进程。我使用JNA和 Windows 原生函数CreateProcessAsUser
  • 该进程被创建为经过身份验证的用户。我可以使用 Process Explorer 实用程序来验证这一点。

缺少什么并且不起作用

  • 进程无法请求其他 Kerberos 票证(例如通过调用 InitializeSecurityContext())
  • 该进程无法访问网络共享。
  • 该进程无法与需要 Kerberos 身份验证的其他 Web 服务进行通信。

我的问题:

  • 我错过了什么或我的代码可能有什么问题?
  • 甚至有可能实现我想要实现的目标吗?

服务器 - 身份验证(缩短,从 Waffle 中提取):

服务器 - CreateProcessAsUser: