使用 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_DETECT
和 GSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG
。仅当您需要此处未采用的进一步运输安全性时才需要。
可能还有更多问题需要修复,但我没有对其进行代码审查。
我也强烈建议在这里提出一些问题。
【讨论】:
以上是关于使用 pymssql 的 Kerberos 委派(双跳)的主要内容,如果未能解决你的问题,请参考以下文章
OWIN Cookie 身份验证 - 使用 Kerberos 委派模拟 SQL Server
Kerberos 约束委派与 Linux 上 Java 中的协议转换
无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务