使用pymssql的Kerberos委派(双跃点)



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

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

  1. 引发错误并等待修复
  2. 从GitHub克隆,修复自己并发出拉取请求

旁注:对于这两个代码部分,有几点我根本不喜欢:

  1. SSPI不像GSS-API那样执行相互身份验证,但应该执行
  2. 上下文标志被无意义地传递,但在该C文件中从未使用过特性,例如ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECTGSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG。只有当您需要进一步的运输安全时才有必要,而这里没有使用
  3. 可能还有更多的东西需要修复,但我没有对其进行代码审查

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

最新更新