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
答案 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
。
这个是你看到的问题。您现在有两个选择:
旁注:根本没有关于两个代码部分的东西:
ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT
和GSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG
。只有在您需要进一步的运输安全时才有必要。我强烈建议在这里提出一些问题。