Назад | Перейти на главную страницу

Active Directory: автозаполнение Thunderbird LDAP не работает с аутентификацией Kerberos

Эта проблема:

Я пытаюсь настроить Автозаполнение почты LDAP - встроенный функционал Mozilla Thunderbird 17.0.5 @ Windows 7 x64 в доменной среде 2008R2. ОС - это свежая, готовая к установке на VBox. Похоже на то Я не могу заставить его работать с аутентификацией Kerberos (родной SSPI).

Я правильно настроил параметры LDAP - мне удалось это проверить, используя «простой» режим аутентификации в Thunderbird (в котором приложение просит пользователя вручную ввести учетные данные домена). В этом режиме работает автозаполнение TB.

Однако всякий раз, когда я переключаюсь на аутентификацию Kerberos, я не получаю результатов автозаполнения. VBox показывает некоторую сетевую активность после каждой буквы, которую я ввожу в поле адреса, но результат не возвращается.

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

Вопрос:

Насколько я понимаю, это может быть проблема Thunderbird или проблема домена / Kerberos.

Судя по результатам Google, эта функциональность Thunderbird не очень популярна, но большая часть того, что я прочитал, похоже, доказывает, что она должна работать в любой среде домена, настроенной по умолчанию. Поскольку контроллеры домена были настроены бывшим сотрудником, возможно, что некоторые функции домена были перенастроены или отключены. Я никогда не трогал встроенный Kerberos.

Кто-нибудь может мне посоветовать, что мне искать?

Отладка:

Я попытался отладить клиент Thunderbird и получил журнал, который публикую внизу. Журнал не показывает ошибок, и хотя я почти ничего не знаю о внутренней работе Kerberos, насколько я понимаю, клиент пытается пройти аутентификацию (InitializeSecurityContext: succeeded), но, кажется, никогда не получает ответа. Однако TB тоже не возвращает ошибок.

Более того, кажется, что журнал почти такой же, независимо от того, правильно ли я настроил Bind DN название (username@mydomain.com правильный) или несколько совершенно случайных букв.

Если я запустил Thunderbird после klist purge, похоже, система правильно получает новые билеты (krbtgt\domain.mydomain.com и LDAP\dc02.domain.mydomain.com).

Журнал Tunderbird:

0[e0f140]:   nsAuthSSPI::Init
0[e0f140]:   InitSSPI
0[e0f140]: Using SPN of [ldap/mydomain.com]
0[e0f140]: AcquireCredentialsHandle() succeeded.
0[e0f140]: entering nsAuthSSPI::GetNextToken()
0[e0f140]: InitializeSecurityContext: continue.
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: entering nsAuthSSPI::GetNextToken()
1428[e13ac0]: InitializeSecurityContext: succeeded.
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: pending operation added; total pending operations now = 1
0[e0f140]:   nsAuthSSPI::Init
0[e0f140]: Using SPN of [ldap/mydomain.com]
0[e0f140]: AcquireCredentialsHandle() succeeded.
0[e0f140]: entering nsAuthSSPI::GetNextToken()
0[e0f140]: InitializeSecurityContext: continue.
0[e0f140]: pending operation added; total pending operations now = 2
1428[e13ac0]: pending operation removed; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: entering nsAuthSSPI::GetNextToken()
1428[e13ac0]: InitializeSecurityContext: succeeded.
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsams*)(userPrincipalName=balsams*)(sn=balsams*)(cn=balsams*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsam*)(userPrincipalName=balsam*)(sn=balsam*)(cn=balsam*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsa*)(userPrincipalName=balsa*)(sn=balsa*)(cn=balsa*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bals*)(userPrincipalName=bals*)(sn=bals*)(cn=bals*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bal*)(userPrincipalName=bal*)(sn=bal*)(cn=bal*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bals*)(userPrincipalName=bals*)(sn=bals*)(cn=bals*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsa*)(userPrincipalName=balsa*)(sn=balsa*)(cn=balsa*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsam*)(userPrincipalName=balsam*)(sn=balsam*)(cn=balsam*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: unbinding
0[e0f140]: unbound
0[e0f140]: unbinding
0[e0f140]: unbound

Оно работает! В конце концов, ответ был довольно простым, хотя я нашел его вслепую:

В Bind DN поле должно быть пустым!

Как только вы установите для свойства Bind DN значение пустое, оно заработает!

Обратите внимание, что есть еще некоторые дополнительные препятствия:

  • Вы не можете использовать свое доменное имя (например, mydomain.com) как адрес сервера LDAP. Вам нужно специально использовать одно имя DC (т. Е. dc03.mydomain.com). Поскольку файл конфигурации TB представляет собой код javscript, я попытаюсь добавить несколько контроллеров домена в некоторый массив и рандомизировать ldap_2.servers.MyCompany.uri на каждом старте.
  • Встроенные запросы LDAP для сопоставления контактов не подходят для Active Directory. Вы можете использовать следующие переменные для настройки строк фильтра:
    • ldap_2.servers.MyCompany.autoComplete.filterTemplate это запрос на совпадение с автозаполнением, например. (|(mail=%v*)(userPrincipalName=%v*)(sn=%v*)(cn=%v*)), то %v обозначает все буквы, которые вы уже набрали в адресном поле,
    • ldap_2.servers.MyCompany.autoComplete.nameFormat "красивое имя" для адреса электронной почты (например, имя и фамилия), вы должны указать имена полей LDAP в квадратных скобках, например: [givenName] [sn]
    • ldap_2.servers.MyCompany.autoComplete.commentFormat - дополнительный столбец в раскрывающемся списке автозаполнения, может использоваться для некоторой дополнительной информации, такой как организационная единица - если вы храните ее в своем AD LDAP.