python - 使用 pymssql 的 Kerberos 委派(双跳)

标签 python kerberos freetds pymssql kerberos-delegation

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

我正在运行的客户端是在 Windows 上。我需要通过反向数据库代理进行双跳连接。客户端、代理和数据库都是域的一部分。当我尝试连接 SQL Server Manager 时,我成功了。但是当我尝试连接 pymssql Python 中的模块不起作用。如果我直接从客户端连接到数据库,我就可以让 Kerberos 身份验证正常工作。但同样,当我尝试通过代理时,它失败了。

这让我相信 Kerberos 身份验证有效,但委派(双跳)无效。

根据section on FreeTDS我应该能够在 C:/freetds.conf 创建一个文件,并且它应该从那里读取连接信息。我似乎无法以任何有意义的方式验证这一点。另外,根据the freetds schema我应该能够添加一个参数启用 gssapi 委托(delegate),该参数在启用时(默认情况下关闭)允许 Kerberos 委托(delegate)。

底线: 我希望在 Windows 上为 pymssql 启用 Kerberos 委派(以便双跳正常工作)。

<小时/>

目前,我已经在 C:/freetds.conf 创建了一个文件,并尝试了几种配置它的方法。

[global]
enable gssapi delegation = on

[global]
enable gssapi delegation = true

最佳答案

这个问题很容易回答,其根源在于 FreeTDS 的一个缺点。你没有做错任何事。

如果我们看一下 FreeTDS 的 GSS-API C 代码,我们会在 lines 307 to 308 中看到

if (tds->login->gssapi_use_delegation)
  gssapi_flags |= GSS_C_DELEG_FLAG;

在设置委托(delegate)标志时读取您的配置参数。

由于您使用的是 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 克隆,自行修复并发出拉取请求。

旁注:这两个代码部分有一些我根本不喜欢的东西:

  1. SSPI 不会像 GSS-API 那样执行相互验证,但它应该执行。
  2. 上下文标志毫无意义地传递,但该 C 文件中从未使用过功能,例如 ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECTGSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG 。仅当您需要进一步的运输安全(此处未采用)时才有必要。
  3. 可能还有更多问题需要修复,但我没有对其进行代码审查。

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

关于python - 使用 pymssql 的 Kerberos 委派(双跳),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29513673/

相关文章:

sql-server - 无法为 CMS WebGUI 创建数据库链接

FreeTDS 显示来自服务器的意外 EOF

pyodbc - 使用pyodbc连接到FileMaker Server

python - 使用ARPACK求解特征值问题,但与Matlab得到的结果不一致

python tqdm 多个进度条

python - 使用opencv dnn人脸检测器检测检测到的人脸图像内的人脸界标

python - 在 Python 中使用 Selenium 查找 YouTube 视频中评论数量的 CSS 选择器应该是什么?

java - Kerberos RC4-HMAC 是否容易受到成人礼攻击?

powershell - 10 小时后长时间运行的 Exchange powershell 脚本中的 Kerberos 错误

python - Kerberos 票证在 LINUX RHEL7 上过期