1

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

我正在运行的客户端在 Windows 上。我需要通过反向数据库代理连接双跳。客户端、代理和数据库都是域的一部分。当我尝试连接 SQL Server Manager 时,我成功了。但是当我尝试连接pymssqlPython 中的模块时,它不起作用。如果我直接从客户端连接到数据库,我可以让 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
4

1 回答 1

3

这很容易回答,并且根源于 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. 可能还有更多需要修复的东西,但我没有对其进行代码审查。

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

于 2015-04-12T17:39:03.677 回答