Подключение к Active Directory удаленно

Вопрос или проблема

Этот пост кажется частью программирования и частью администрирования, поэтому я не уверен, куда его отнести. Ни SO, ни SU не совсем подходят. Пожалуйста, перенаправьте, если это необходимо.

Старая ситуация:

Существующий веб-сайт на PHP, внутри домена, подключающийся к Active Directory для аутентификации и идентификации, когда пользователи входят в приложение.

Новая ситуация:

Перемещение веб-сайта на виртуальную машину в Azure. Active Directory не перемещается. Необходимо подключиться к AD удаленно.
Они не хотят переходить на Azure AD только ради этого.

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

Исходя из этой информации, я предположил, что это будет простой проект, но я не нашел ничего подобного и не получил заметок о данном плагине.

Похоже, что они не использовали VPN, но, возможно, мне придется вернуться к этому, если я не смогу заставить это работать иным образом.

Обратите внимание, что речь идет не о удаленном рабочем столе или удаленном администрировании AD, а о удаленной аутентификации пользователей.

ОБНОВЛЕНИЕ:
Аутентификация в настоящее время выглядит так, где Bind возвращает булево значение:

    // Аутентификация через LDAP
    $linkLdapConnection = ldap_connect($this->objConfiguration->sDomainName);
    if (!$linkLdapConnection) {
        $this->aReadOnlyVars['sSecurityError'] = "Ошибка подключения к домену.";
        return false;
    }

    $bLdapBind = @ldap_bind($linkLdapConnection, $sUserLogin . "@" . $this->objConfiguration->sDomainName, $sUserPassword);

Хотя хосты, присоединенные к домену, используют множество протоколов для связи с Active Directory (все из них на основе TCP/IP, к счастью), в своей основе у вас есть два стандартных: Kerberos для безопасной аутентификации и LDAP для доступа к каталогу пользователей.


Если ваша единственная цель – проверка паролей (как в примере кода, который вы опубликовали), вам на самом деле не нужно использовать какое-либо программное обеспечение, специфичное для AD – модуля ‘ldap’, который является частью PHP, будет вполне достаточно.

Тем не менее, когда дело касается общего LDAP, в первой строке кода –

$linkLdapConnection = ldap_connect($this->objConfiguration->sDomainName);

– скорее всего, будет недостаточно указать только имя домена; вместо этого вам нужно будет указать полный URL конкретного сервера, такой как ldaps://ad.example.com или ldaps://dc01.ad.example.com. Используйте DNS SRV записи, чтобы их найти:

// $res = dns_get_record("_ldap._tcp.gc._msdcs.$domain", DNS_SRV); // Глобальный каталог новый
// $res = dns_get_record("_gc._tcp.$domain", DNS_SRV); // Глобальный каталог старый
$res = dns_get_record("_ldap._tcp.$domain", DNS_SRV); // обычный LDAP
$urls = array_map(fn($r) => "ldap://{$r["target"]}:{$r["port"]}", $res);

LDAP работает через TCP-порты 389 или 636, что касается конфигурации брандмауэра. (Функции, специфичные для Windows AD, также могут использовать UDP-порт 389 для “пинга DC”, но общий клиент LDAP этого не делает.)

Поскольку вы отправляете обычные пароли на сервер, вы определенно хотите использовать LDAP с TLS – либо указав URL ldaps://, либо вызвав ldap_start_tls(). Первое использует TCP-порт 636 и является более надежным, в то время как второе вместо этого будет использовать порт 389 и потребует Kerberos вместо обычных паролей (хороший выбор при использовании “учетной записи службы”, но не вариант для проверки паролей пользователей).

(Это также означает, что контроллер домена должен иметь действительный TLS сертификат. Не все домены имеют его, поскольку Windows сам по себе предпочитает использовать защиту Kerberos и не нуждается в TLS.)

Ответ или решение

Подключение к Active Directory удаленно: подробное руководство

Введение

С учетом растущих потребностей в удаленной аутентификации и идентификации, соединение с Active Directory (AD) из облачной среды, такой как Azure, требует внимательного подхода к реализации. В данном руководстве будет рассмотрен процесс интеграции вашего веб-приложения на PHP с Active Directory, находящейся в локальной сети, с акцентом на аспекты безопасного подключения и использования протоколов LDAP.

Этапы подключения

  1. Выбор протокола и сервера:
    Традиционно Active Directory использует несколько протоколов для аутентификации и доступа к данным. Ваша задача состоит в том, чтобы правильно настроить LDAP-соединение. Убедитесь, что вы используете полный адрес сервера Active Directory, например, ldaps://ad.example.com или ldaps://dc01.ad.example.com. Использование протокола LDAPS (LDAP через SSL) обеспечивает шифрование данных, включая учетные данные пользователя.

    $linkLdapConnection = ldap_connect('ldaps://ad.example.com');
  2. Получение информации о сервере LDAP:
    Для нахождения доступных серверов AD в вашем домене можно использовать DNS SRV записи. Пример кода для получения таких записей:

    $res = dns_get_record("_ldap._tcp.gc._msdcs.$domain", DNS_SRV);
    $urls = array_map(fn($r) => "ldap://{$r['target']}:{$r['port']}", $res);
  3. Настройка безопасного соединения:
    Используйте ldap_start_tls(), если вы выбираете стандартный LDAP по порту 389. Это необходимо для обеспечения шифрования, если вы не используете ldaps://. Также убедитесь, что ваш контроллер домена имеет действующий сертификат TLS.

  4. Аутентификация пользователя:
    После успешного подключения необходимо произвести аутентификацию пользователя. Используйте функцию ldap_bind(), передав полные учетные данные:

    $bLdapBind = @ldap_bind($linkLdapConnection, $sUserLogin . '@' . $this->objConfiguration->sDomainName, $sUserPassword);
    if (!$bLdapBind) {
       $this->aReadOnlyVars['sSecurityError'] = "Ошибка аутентификации.";
       return false;
    }

    Если аутентификация прошла успешно, вы можете продолжить работу с Active Directory.

  5. Тестирование и отладка:
    Убедитесь, что ваше приложение корректно обрабатывает ошибки и предоставляет пользователям полезные сообщения. Важно использовать логирование для диагностики возможных проблем при подключении и аутентификации.

Альтернативные способы подключения

Если у вас не получается установить соединение через LDAP напрямую, рассмотрите использование VPN. Хотя это может усложнить инфраструктуру, VPN обеспечивает безопасную передачу данных между вашим приложением и локальным контроллером домена.

Заключение

Подключение к Active Directory удаленно требует тщательной настройки и понимания принципов работы протоколов аутентификации. Используя вышеописанные методы и рекомендации, вы сможете успешно интегрировать ваше веб-приложение с AD в Azure, поддерживая высокие стандарты безопасности.

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

Оцените материал
Добавить комментарий

Капча загружается...