使用 pymssql 的 Kerberos 委派(双跳)

Posted

技术标签:

【中文标题】使用 pymssql 的 Kerberos 委派(双跳)【英文标题】:Kerberos Delegation (Double-Hop) with pymssql 【发布时间】:2015-04-08 11:44:32 【问题描述】:

pymssql 模块声称支持 Kerberos 身份验证(和委托),但我似乎无法启用它。

我正在运行的客户端是在 Windows 上。我需要通过反向数据库代理连接双跳。客户端、代理和数据库都是域的一部分。当我尝试连接 SQL Server Manager 时,我成功了。但是当我尝试连接 Python 中的 pymssql 模块时,它不起作用。如果我直接从客户端连接到数据库,我可以让 Kerberos 身份验证工作。但同样,当我尝试通过代理时它失败了。

这让我相信 Kerberos 身份验证有效,但委派(双跳)无效。

根据section on FreeTDS,我应该能够在C:/freetds.conf 创建一个文件,它应该从那里读取连接信息。我似乎无法以任何有意义的方式验证这一点。此外,根据the freetds schema,我应该能够添加一个参数enable gssapi delegation,启用时(默认关闭)允许 Kerberos 委派。

底线: 我希望在 Windows 上为 pymssql 启用 Kerberos 委派(以便双跳工作)。


目前我在C:/freetds.conf创建了一个文件,并尝试了几种配置方法。

[global]
enable gssapi delegation = on

[global]
enable gssapi delegation = true

【问题讨论】:

您是否有更改来评估我的答案? 机会,是的。我一直在寻找替代解决方案。我找到了一些,不幸的是我不能使用 Pymssql。我会接受你的回答,并奖励赏金。因为如果我无论如何都试图让它工作,那么你为我省去了一个长期的头痛,但徒劳无功。感谢您的努力,希望有更好的答案。 (更好的是我的意思是让我可以使用 pymssql) 你能在Windows下编译那个软件吗?补丁非常简单。 自定义编译超出了我所寻找的范围。我需要这个解决方案便于携带。 【参考方案1】:

这很容易回答,并且根源于 FreeTDS 的一个缺点。你没有做错任何事。

如果我们看一下 FreeTDS 的 GSS-API C 代码,我们会看到 lines 307 to 308

if (tds->login->gssapi_use_delegation)
  gssapi_flags |= GSS_C_DELEG_FLAG;

在委托标志中读取您的配置参数已设置。

由于您在 Windows 上并且 Windows 使用其自己的 GSS-API 风格,即 SSPI,我们来看看 C 代码:lines 273 to 278do

status = sec_fn->InitializeSecurityContext(&auth->cred, NULL, auth->sname,
  ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT 
    | ISC_REQ_CONNECTION | ISC_REQ_ALLOCATE_MEMORY,
  0, SECURITY_NETWORK_DREP,NULL, 0, &auth->cred_ctx, &desc, &attrs, &ts);

如您所见,上下文标志不在变量中,而是直接传递。既不评估配置参数,也不传递ISC_REQ_DELEGATE

就是您看到的问题。你现在有两个选择:

    提出错误并等待修复。 从 GitHub 克隆,修复自己并发出拉取请求。

旁注:有几处我根本不喜欢这两个代码部分:

    SSPI 不像 GSS-API 那样执行相互身份验证,但应该这样做。 上下文标志被毫无意义地传递,但功能从未在该 C 文件中使用,例如 ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECTGSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG。仅当您需要此处未采用的进一步运输安全性时才需要。 可能还有更多问题需要修复,但我没有对其进行代码审查。

我也强烈建议在这里提出一些问题。

【讨论】:

以上是关于使用 pymssql 的 Kerberos 委派(双跳)的主要内容,如果未能解决你的问题,请参考以下文章

OWIN Cookie 身份验证 - 使用 Kerberos 委派模拟 SQL Server

Kerberos 委派和特定于端口的 SPN

Kerberos 约束委派与 Linux 上 Java 中的协议转换

无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务

允许在没有Active Directory信任的情况下进行winhttp委派

使用 ADFS 为 WAP 和后端系统提供 Kerberos 令牌