使用 SSPI 支持多进程的 kerberos 约束委派
Posted
技术标签:
【中文标题】使用 SSPI 支持多进程的 kerberos 约束委派【英文标题】:support kerberos constrained delegation using SSPI for multiprocess 【发布时间】:2018-08-07 20:37:50 【问题描述】:我需要在 Windows 上使用 SSPI 支持我们的 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。
欢迎提出任何建议。
【问题讨论】:
【参考方案1】:您需要做的是在父进程中获取令牌的句柄并将其复制到子进程中。
你这样做:
像往常一样在父进程中调用ImpersonateSecurityContext
。这将设置您的身份。然后调用QuerySecurityContextToken
以获取该身份令牌的句柄。一旦你有句柄调用DuplicateHandle
,但目标进程是子进程的句柄。返回的lpTargetHandle
是target 进程(子进程)中本地引用的句柄。您将了解如何将此值传输到目标进程。
一旦子进程有了句柄值,您就可以调用ImpersonateLoggedOnUser
传递句柄值。此时,本地身份应该是相关用户,任何出站呼叫都将在创建新上下文时使用该身份。
请记住,子进程将需要 SeImpersonatePrivilege。
【讨论】:
非常感谢您的建议!我会试一试的。 更新:我有一个使用史蒂夫提到的工作流程的工作原型。谢谢史蒂夫! 我投了几次票。但是,由于我是新用户(刚刚注册了这个问题),我收到一条消息说它已记录但不会被计算在内:-( 我们有一项新要求,即支持使用 ODBC 和 JDBC 的 SQL 服务器的 Kerberos 约束委派。这意味着在子进程中,我们需要将 ODBC/JDBC 连接调用放在 ImpersonateLoggedOnUser/RevertToSelf 之间。 Windows 上的 ODBC 是否使用 SSPI?如果是,则 ODBC 应该可以正常工作。但是 JDBC 使用 JGSS,默认情况下无法访问 LSA。 Microsoft 有一个使用“协议转换”的 JDBC 约束委派示例程序。如果我们想在 Windows 进程上支持 JDBC 的约束委派,这是唯一的选择吗? 这里是 Microsoft JDBC 约束委派示例程序的链接:github.com/Microsoft/mssql-jdbc/blob/…以上是关于使用 SSPI 支持多进程的 kerberos 约束委派的主要内容,如果未能解决你的问题,请参考以下文章