Как привязать к серверу AD в PHP с учетными данными из доверенного домена?

У нас есть несколько серверов AD с установленным доверием лесов между ними, поэтому пользователи Windows из разных доменов могут получить доступ к ограниченным ресурсам. Предположим, у нас есть domainA.com и domainB.com, поэтому любой пользователь из домена domainB.com может войти в ресурс на domainA.com. В целях безопасности анонимный доступ к серверам LDAP отключен администраторами.

Теперь нам нужно перечислить всех пользователей со всех серверов LDAP в нашем PHP-коде с помощью клиента OpenLDAP. Ниже приведен код PHP для получения информации обо всех пользователях из domainB.com.

define('USER', 'user@domainA.com'); // User from domainA.com here
$ldap = ldap_connect('domainB.com') or die('Bad connection');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_bind($ldap, USER, PASS) or die('Cannot bind');

Мой скрипт умирает с сообщением "Cannot bind" с ошибкой ldap "49 Invalid credentials". Дополнительная информация от AD:
80090308: LdapErr: DSID-0C0903A9, комментарий: ошибка AcceptSecurityContext, данные 52e, v1db1

Я думаю, что проблема в простом механизме аутентификации, потому что, когда я использую аутентификацию согласования GSS в клиенте администратора Ldap с теми же учетными данными для user@domainA.com, все в порядке.

Что я могу сделать для успешного связывания на domainB.com с учетными данными от user@domainA.com?

АутентификацияUPD1 с помощью SASL DIGEST-MD5

ldap_sasl_bind ( $ldap, '', $pass, 'DIGEST-MD5', null, 'user@domainA.com');

Логи из AD:

Компьютер попытался проверить учетные данные для учетной записи.

Пакет аутентификации: WDigest
Вход в систему: пользователь
Рабочая станция источника: DOMAINA
Код ошибки: 0xc000006a

Аккаунт не смог войти в систему.

Предмет:
    Идентификатор безопасности:        NULL SID
    Имя пользователя:       -
    Домен аккаунта:       -
    Идентификатор входа:       0x0

Тип входа:         3

Учетная запись, для которой не удалось войти:
    Идентификатор безопасности:        NULL SID
    Имя учетной записи:       user@domainA.com
    Домен учетной записи: domainA.com

Информация об отказе:
    Причина ошибки: ошибка во время входа в систему.
    Статус:         0xc000006d
    Дополнительный статус:         0xc000006d

Обрабатывать информацию:
    Идентификатор вызывающего процесса:       0x0
    Имя вызывающего процесса:       -

Информация о сети:
    Название рабочей станции:       -
    Адрес исходной сети: 
    Порт источника:        

Подробная информация об аутентификации:
    Процесс входа в систему:      WDIGEST
    Пакет аутентификации: WDigest
    Транзитные услуги:       -
    Имя пакета (только NTLM):   -
    Длина ключа: 0

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

Поля Subject указывают учетную запись в локальной системе, которая запросила вход в систему. Обычно это служба, такая как служба сервера, или локальный процесс, такой как Winlogon.exe или Services.exe.

Поле типа входа указывает тип входа в систему, который был запрошен. Наиболее распространенными типами являются 2 (интерактивный) и 3 (сетевой).

Поля Информация о процессе указывают, какая учетная запись и процесс в системе запросили вход в систему.

Поля Информация о сети указывают, откуда возник запрос на удаленный вход. Имя рабочей станции не всегда доступно и может быть оставлено пустым в некоторых случаях.

Поля информации аутентификации предоставляют подробную информацию об этом конкретном запросе на вход.
    - Транзитные сервисы указывают, какие промежуточные сервисы участвовали в этом запросе на вход.
    - Имя пакета указывает, какой суб-протокол использовался среди протоколов NTLM.

2 ответа

Я сталкивался с этой проблемой при настройке Moodle, который использует библиотеки PHP LDAP и OpenLDAP для подключения к серверам AD. Решение было довольно простым и одним из двух (который на самом деле сводился к одному):

  1. Используйте имя пользователя с незаданной областью (т. Е. После имени пользователя нет ни @ @ example.com)
  2. Используйте ДОМЕН \ имя пользователя

По сути, единственное, что сводилось к получению, - это получение правильного, ожидаемого синтаксиса имени пользователя. Я думаю, что это зависит от конкретной конфигурации AD, потому что я видел четыре типа имен пользователей, которые работают на разных серверах AD: полное DN, ограниченное имя пользователя (т.е. выглядит как адрес электронной почты), DOMAIN\username и простое имя пользователя.

Когда вы указываете пользователя в ldap_bindМожете ли вы попытаться поставить свой DN пользователя следующим образом:

$bind = ldap_bind($resource, 'cn=jpb,cn=users,dc=dom,dc=fr', '***'); 

Другое дело, что в вашем "лесу Active-Directory" у вас есть один или несколько контроллеров домена, которые поддерживают каталог под названием "Global Catalog" (GC). GC содержит все объекты всех каталогов вашего леса.


Отредактировано Вы можете попробовать связать с SASL

$ldap = ldap_connect('domainB.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_sasl_bind ( $conn, NULL,"password",'DIGEST-MD5',NULL,'user@domainA.com',NULL);
Другие вопросы по тегам