使用pymssql的Kerberos委派(双跳)

时间:2015-04-08 11:44:33

标签: python kerberos freetds pymssql kerberos-delegation

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

1 个答案:

答案 0 :(得分:2)

这很容易回答,并且根植于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 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克隆,修复自己并发出拉取请求。
  3. 旁注:根本没有关于两个代码部分的东西:

    1. SSPI不会像GSS-API那样执行相互身份验证,但应该这样做。
    2. 上下文标志无意义地传递,但该C文件中从未使用过功能,例如ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECTGSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG。只有在您需要进一步的运输安全时才有必要。
    3. 可能还有更多内容要修复,但我没有对其进行代码审核。
    4. 我强烈建议在这里提出一些问题。