Как привязать к серверу 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. Решение было довольно простым и одним из двух (который на самом деле сводился к одному):
- Используйте имя пользователя с незаданной областью (т. Е. После имени пользователя нет ни @ @ example.com)
- Используйте ДОМЕН \ имя пользователя
По сути, единственное, что сводилось к получению, - это получение правильного, ожидаемого синтаксиса имени пользователя. Я думаю, что это зависит от конкретной конфигурации 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);