pymssql
模块声称支持Kerberos身份验证(和委派),但我似乎无法启用它。
我正在运行的客户端在Windows上。我需要通过反向数据库代理进行双跳连接。客户端、代理和数据库都是域的一部分。当我尝试连接SQL Server管理器时,我成功了。但当我尝试用Python连接pymssql
模块时,它不起作用。如果我直接从客户端连接到数据库,我就可以使用Kerberos身份验证。但是,当我尝试通过代理时,它再次失败。
这让我相信Kerberos身份验证是有效的,但委派(双跳)则不然。
根据关于FreeTDS的章节,我应该能够在C:/freetds.conf
创建一个文件,并且它应该从那里读取连接信息。我似乎无法以任何有意义的方式证实这一点。此外,根据freetds模式,我应该能够添加一个参数enable gssapi delegation
,该参数在启用时(默认为关闭)允许Kerberos委派。
底线:我希望在windows上为pymssql启用Kerberos委派(这样双跳就可以工作了)。
目前,我已经在C:/freetds.conf
创建了一个文件,并尝试了几种方法来配置它
[global]
enable gssapi delegation = on
和
[global]
enable gssapi delegation = true
这很容易回答,并且源于FreeTDS中的一个缺点。你没有做错什么。
如果我们看一下FreeTDS的GSS-API C代码,我们可以在307到308行中看到
if (tds->login->gssapi_use_delegation)
gssapi_flags |= GSS_C_DELEG_FLAG;
在委派标志中读取您的配置参数。
由于您使用的是Windows,并且Windows使用它自己的GSS-API风格,即SSPI,我们来看看C代码:第273到278行执行
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
。只有当您需要进一步的运输安全时才有必要,而这里没有使用 - 可能还有更多的东西需要修复,但我没有对其进行代码审查
我强烈建议在这里也提出一些问题。