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

时间:2018-08-07 20:37:50

标签: sspi kerberos-delegation

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

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

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

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

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

任何建议都值得赞赏。

1 个答案:

答案 0 :(得分:2)

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

您可以这样做:

在父流程中,通常会调用ImpersonateSecurityContext。这将设置您的身份。然后调用QuerySecurityContextToken获取该标识令牌的句柄。一旦有了句柄调用DuplicateHandle,但是目标进程是子进程的句柄。返回的lpTargetHandle target 进程(子进程)中本地引用的句柄。您将了解如何需要将此值转移到目标进程。

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

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