ldap_sasl_bind_s (gssapi) - что должно быть предусмотрено в структуре бирвальных данных

StackOverflow https://stackoverflow.com/questions/3144910

  •  01-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать ldap_sasl_bind_s Способ от Microsoft LDAP C SDK, с Gssapi. как механизм аутентификации. ldap_sasl_bind_s ожидает учетных данных как BERVAL структура, которая непрозрачная.

Учитывая имя пользователя (или DN) и пароль, как мне добраться до BERVAL структура что я должен перейти к ldap_sasl_bind_s?

Примеры, которые я нашел до сих пор

  • от других LDAP C SDKS - не тот из Microsoft
  • использовать ldap_sasl_bind_s Когда желательна простая аутентификация - но мне нужно использовать GSSAPI
  • использовать ldap_sasl_interactive_bind_s Когда другие механизмы аутентификации SASL желательны. Тем не менее, нет ldap_sasl_interactive_bind_s в Microsoft SDK.

В качестве бокового примечания цель состоит в том, чтобы иметь возможность привязать SASL к различным серверам LDAP; На данный момент: Activedirectory и OpenLDAP.

Любые указатели будут очень оценены.

Это было полезно?

Решение

Мне удалось выполнить LDAP SASL BIND OVER GSSAPI, используя ldap_sasl_bind_s. Отказ Для тех, кто заинтересован, вот некоторые указатели.

Для абстрактного описания действий клиент и сервер должны выполнять во время аутентификации GSSAPI SASL, «Механизм аутентификации и безопасности (SASL)« Kerberos V5 («GSSAPI»). RFC следует прочитать; В частности, «Клиентская сторона аутентификации протокола Exchange» представляет интерес, поскольку он дает указание последовательности действий, которые нам необходимо выполнить для успешного привязки к серверу LDAP по Kerberos.

Учетные данные ldap_sasl_bind_s Ожидается - их форма и их значение - зависят от фактического механизма аутентификации, который в нашем случае является Kerberos.

В Microsoft SDK Kerberos доступен через SSPI - это примерно в результате реализации Microsoft GSSAPI; Методы, которые имеют отношение к нашему конкретному случаю: AcquireCredentialsHandle, InitializeSecurityContext, DecryptMessage, EncryptMessage

LDAP SASL BING ELVE OVER KERBEROS имеет 3 этапа.

Фаза 1

Вызов AcquireCredentialsHandle а также InitializeSecurityContext.
Важные замечания здесь:

  • перейти к AcquireCredentialsHandle указатель на SEC_WINNT_AUTH_IDENTITY структура, содержащая фактические учетные данные (realm, имя пользователя, пароль) или NULL Если учетные данные текущего потока должны использоваться
  • Направленное имя должно быть SPN, сопоставленным на учетную запись, под которой работает сервер LDAP
  • при звонке InitializeSecurityContext, взаимная аутентификация должна быть запрошена.

Если все важные аргументы верны - действительные учетные данные, действительные SPN, NULL Входной токен - InitializeSecurityContext Звонок должен вернуться SEC_I_CONTINUE_NEEDED и правильно заполнить выходной токен. Содержание этого выходного токена должно идти в BERVAL структура ldap_sasl_bind_s ожидает как клиентские учетные данные.

Вызов ldap_sasl_bind_s с выходом токена от InitializeSecurityContext как клиентские полномочия. Если все аргументы правильные - пустые DN, GSSAPI в качестве имени механизма - фактический вызов должен вернуться LDAP_SUCCESS и последняя ошибка LDAP для сеанса LDAP должна быть LDAP_SASL_BIND_IN_PROGRESS.

В качестве бокового примечания самая последняя ошибка LDAP для сеанса LDAP может быть обнаружена при вызове ldap_get_option на сеансе, с LDAP_OPT_ERROR_NUMBER как опция.

Фаза 2

После успешного звонка ldap_sasl_bind_s, последний аргумент указывает на BERVAL Структура, содержащая учетные данные сервера. Содержание этого BERVAL Структура теперь должна использоваться в качестве входного токена для второго вызова InitializeSecurityContext.

Этот второй звонок InitializeSecurityContext должен вернуться SEC_OK и пустой выходной токен.

Этот пустой выходной токен должен использоваться в качестве учетных данных клиента для другого вызова ldap_sasl_bind_s. Отказ Этот второй звонок ldap_sasl_bind_s должен вернуться LDAP_SUCCESS, с самым последним ошибкой LDAP для сеанса LDAP LDAP_SASL_BIND_IN_PROGRESS.

Фаза 3

После второго успешного звонка ldap_sasl_bind_s, последний аргумент указывает на BERVAL Структура, содержащая данные сервера. Данные сервера должны быть даны в качестве ввода в DecryptMessage. Отказ Как указано в ранее упомянутых RFC, дешифрованные данные должны быть длиной 4 байта.

Клиент должен создать свой ответ в соответствии с информацией в том же RFC.
Примечание: В моем случае я опущел идентификатор авторизации, упомянутый в RFC. К моему пониманию, пустой идентификатор авторизации приводит к тому, что идентификатор аутентификации используется для авторизации.

Ответ, который построен клиент должен быть передан в качестве ввода в EncryptMessage. Отказ Вывод EncryptMessage Затем вызов должен быть передан в качестве клиентских учетных данных для третьего и окончательного вызова ldap_sasl_bind_s.

Примечание: Документация MSDN для использования EncryptMessage Под Керберосом кажется неполным. Поиск кода Google должен помочь с рабочим примером. Кроме того, для рабочего примера потока, описанного выше, исходный код Samba можно проконсультироваться.

Другие советы

Я нашел проблему.

Согласно этой теме ( https://groups.google.com/group/microsoft.public.actactive.directory.interfaces/browse_Thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1.) есть ошибка с LDAP_SASL_BIND_S, возвращая пустые учетные данные сервера в Windows XP. Я проверил свое приложение под сервером Windows 2008, а учетные данные вернуются правильно.

Статья от солнце а также MSDN. Отказ Вероятно, если вы можете попробовать создать образец программы, вы можете получить ответы

Еще один

Псевдокод

struct berval   cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top