2015-04-08 3 views
1

Модуль pymssql утверждает, что поддерживает аутентификацию Kerberos (и делегирование), и все же я не могу включить его.Делегация Kerberos (Double-Hop) с pymssql

Клиент, с которым я работаю, находится в Windows. Мне нужно подключиться с двойным переходом через обратный прокси-сервер базы данных. Клиент, прокси и база данных являются частью домена. И когда я пытаюсь подключиться к SQL Server Manager, я успешный. Но когда я пытаюсь подключиться к модулю pymssql в Python, он не работает. Если я подключаюсь непосредственно от клиента к базе данных, я могу заставить Kerberos Authentication работать. Но опять же, когда я пытаюсь пройти через прокси, это терпит неудачу.

Это заставляет меня полагать, что аутентификация Kerberos работает, но что делегирование (двойной переход) не выполняется.

Согласно section on FreeTDS, я должен быть в состоянии создать файл на C:/freetds.conf, и он должен прочитать информацию о подключении оттуда. Кажется, я не могу проверить это каким-либо значимым образом. Кроме того, в соответствии с the freetds schema я должен иметь возможность добавить параметр enable gssapi delegation, который при включении (по умолчанию отключен) разрешает делегирование Kerberos.

Bottom Line: Я ищу, чтобы включить делегирование Kerberos (так что двойной прыжок будет работать) для pymssql на окнах.


На данный момент я создал файл в C:/freetds.conf и попробовал несколько способов настройки его.

[global] 
enable gssapi delegation = on 

и

[global] 
enable gssapi delegation = true 
+0

У вас есть изменение, чтобы оценить мой ответ? –

+0

Шанс, да. Я искал альтернативные решения. Я нашел некоторых, и, к сожалению, я не могу использовать Pymssql. Я приму ваш ответ и награду щедростью. Потому что ты спас мне одну чертовски длинную головную боль, если я попытаюсь заставить ее работать в любом случае, в бесполезности. Спасибо за ваши усилия, я хочу, чтобы был лучший ответ. –

+0

(лучше я имею в виду, что я хотел бы работать с pymssql) –

ответ

2

Это довольно легко ответить и коренится в недостаток в FreeTDS. Ты ничего не сделал.

Если мы посмотрим на GSS-API кода С FreeTDS, мы видим в lines 307 to 308

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

, что ваш параметр конфигурации считывается в флаг делегации установлен.

Поскольку вы на Windows, и Windows, использует свой собственный аромат GSS-API, а именно ССПИ, мы посмотрим на этот код 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, исправить себя и выдать запрос на растяжение.

Side Примечание: есть несколько вещей, я не люблю об обеих частях коды на всех:

  1. ССПЕЙТЕ не выполняет взаимную авторизацию в GSS-API делает, но должна.
  2. Контекстные флаги передаются бессмысленно, но функции никогда не используются в этом файле C, например, ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT и GSS_C_REPLAY_FLAG | GSS_C_INTEG_FLAG. Это необходимо только в том случае, если вам требуется дополнительная транспортная безопасность, которая здесь не используется.
  3. Есть, вероятно, больше материала для исправления, но я не стал его просматривать.

Я настоятельно рекомендую также поднять некоторые проблемы.

Смежные вопросы