1

我需要使用 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。

任何建议表示赞赏。

4

1 回答 1

3

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

你这样做:

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

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

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

于 2018-08-10T23:26:19.367 回答