使用 Kerberos 身份验证模拟用户时建立 ODBC 连接
Posted
技术标签:
【中文标题】使用 Kerberos 身份验证模拟用户时建立 ODBC 连接【英文标题】:Making an ODBC connection when impersonating an user using Kerberos authentication 【发布时间】:2014-07-01 17:54:12 【问题描述】:我的客户端应用程序/浏览器使用 Kerberos 对我的服务器进行身份验证。服务器运行 Apache/Tomcat,它与我在服务器上运行的服务通信。我的服务可以将工作分配给另一台机器上的另一个服务,因此我们需要设置约束委派。我在服务器上的服务(在服务器机器或另一台机器上)需要使用 ODBC 与 SQL Server 数据库通信。我想冒充最终用户(在 AD 中)。从在线阅读到模拟最终用户,似乎我需要做的就是在模拟最终用户的线程上对 ODBC 驱动程序进行 SQLDriverConnect 调用。
如果用户已经通过身份验证并且我可以在我的服务中获得一些令牌(TGT?),我需要在我的服务线程中调用什么 API 来模拟最终用户?我认为 ImpersonateLoggedOnUser 和 ImpersonateSecurityContext 是可能的选项,但我真的不知道哪些适用于我的情况,以及我在这里需要什么具体的票证/令牌。
另外,我看到当用户已经通过身份验证时,SetThreadToken 也可以是一个选项。是吗?
我的服务是 C++,环境是 Windows(7 或 Server)。
【问题讨论】:
【参考方案1】:在不验证此流程的情况下,您应该尝试以下操作:
先决条件:如果您想诉诸约束委派,您将需要 Java 8。没有其他选择。来自 Java 6 的不受约束的作品。
客户端 SPNEGO/Kerberos => Tomcat/Server 1 (extract delegated credential with JGSS) => Tomcat/Server 1 使用委托凭证获取下一层的服务票证 => C++ 支持的服务器 1(使用 SSPI 提取委托凭证)=> 模拟,等等
请注意,您不能从 Java 调用 ODBC,而只能从 C/C++ 调用,因此如果您希望两者都在同一台计算机上,请获取主机/服务票证并继续使用 C++ 和 ODBC。
【讨论】:
以上是关于使用 Kerberos 身份验证模拟用户时建立 ODBC 连接的主要内容,如果未能解决你的问题,请参考以下文章