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

support kerberos constrained delegation using SSPI for multiprocess

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

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

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

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

SSPI 也有 ExportSecurityContext 和 ImportSecurityContext,但是文档非常模糊,不确定它是否可以解决我的用例。由于 ImpersonateSecurityContext 文档说 "allows a server to impersonate a client by using a token previously obtained by a call to AcceptSecurityContext (General) or QuerySecurityContextToken.",我似乎无法在 ImpersonateSecurityContext 之后调用 ImpersonateSecurityContext。

如有任何建议,我们将不胜感激。

您需要做的是在父进程中获取令牌句柄并将其复制到子进程中。

你这样做:

在父进程中像往常一样调用 ImpersonateSecurityContext。这将设置您的身份。然后调用 QuerySecurityContextToken 获取该身份令牌的句柄。一旦你有句柄调用 DuplicateHandle,但目标进程是子进程的句柄。返回的 lpTargetHandletarget 进程(子进程)中本地引用的句柄。您将了解如何将此值传输到目标进程。

一旦子进程具有句柄值,您就可以调用 ImpersonateLoggedOnUser 传递句柄值。此时本地身份应该是有问题的用户,任何出站调用都将在创建新上下文时使用它。

请记住,子进程将需要 SeImpersonatePrivilege。