Руководство по подключению LDAP
В этом руководстве описано взаимодействие с LDAP-сервером, например Microsoft Active Directory, с узла Ansible. В отличие от узлов Windows, встроенных механизмов взаимодействия с LDAP-сервером и аутентификации на нём нет, поэтому для работы плагинов, запускаемых на узле Ansible, требуется дополнительная настройка.
Примечание
В этом руководстве рассматривается взаимодействие с LDAP с узла Ansible. Оно не относится к модулям, запускаемым на удалённых узлах Windows. Сведения о настройке аутентификации модулей см. в разделе Аутентификация AD в модулях.
Требования
Для работы кода подключения LDAP требуются библиотеки sansldap и pyspnego. Их можно установить с помощью pip:
$ python3 -m pip install --user \
'pyspnego >= 0.8.0'
sansldap
Примечание
В этом руководстве предполагается, что python3 — это та же версия Python, которую использует Ansible. Сведения о версии и расположении Python см. в ansible --version.
Также доступны необязательные зависимости, обеспечивающие дополнительные возможности.
Возможность | Пакет |
|---|---|
Аутентификация Kerberos | pyspnego[kerberos] >= 0.8.0 |
Поиск серверов | dnspython |
Расшифровка LAPS | dpapi-ng |
Чтобы установить все необязательные компоненты, выполните:
$ python3 -m pip install --user \
dnspython \
dpapi-ng \
'pyspnego[kerberos] >= 0.8.0'
Для компонентов аутентификации Kerberos требуются системные библиотеки Kerberos. Для систем на основе RPM это:
$ dnf install gcc python3-devel krb5-libs krb5-devel
В других дистрибутивах Linux требуются те же пакеты, что перечислены выше, но они, вероятно, называются иначе, чем в dnf.
Модуль действия microsoft.ad.debug_ldap_client можно использовать для отладки конфигурации узла Ansible и его возможностей LDAP. В частности, он показывает:
- установленные пакеты Python, связанные с LDAP, или сообщения об ошибках импорта, если пакеты не установлены
- сведения о хосте Kerberos и кэше учётных данных, если установлены дополнительные компоненты Kerberos
- сведения о поиске SRV, если установлены
dnspythonи дополнительные компоненты Kerberos
Чтобы использовать этот модуль, просто выполните
$ ansible localhost -m microsoft.ad.debug_ldap_client
Параметры подключения
Для подключения к Microsoft Active Directory или LDAP-серверу требуются такие сведения, как имя узла контроллера домена, порт, использование LDAPS или StartTLS и данные для аутентификации. Часть этих сведений можно получить из среды узла Ansible, но их также можно указать вручную с помощью параметров плагина. К ним относятся:
Параметр | Значение по умолчанию | Назначение |
|---|---|---|
server | Поиск сервера через Kerberos | Имя узла LDAP-сервера |
port | 389 или 686, если tls_mode=ldaps | Порт LDAP |
tls_mode | LDAPS, если port=686, иначе None | Параметры TLS: LDAP, LDAP + StartTLS, LDAPS |
auth_protocol | Negotiate | Протокол аутентификации |
username | None | При наличии пытается использовать кэш Kerberos |
password | None | При наличии пытается использовать кэш Kerberos |
Сведения о поиске сервера описаны ниже. По умолчанию используется порт 389, если не указан tls_mode: ldaps. Если порт явно задан как 686, по умолчанию используется режим TLS ldaps; в противном случае используется 389. По умолчанию используется протокол аутентификации negotiate, при этом предпринимается попытка использовать неявные учётные данные, если они доступны.
Поиск сервера
Если параметр server не задан явно, плагин попытается найти LDAP-сервер на основе текущей конфигурации среды. Это возможно только при соблюдении следующих условий:
- установлен пакет Python
dnspython - установлен пакет Python
pyspnego[kerberos]для Kerberos - в базовой библиотеке Kerberos задано значение
default_realmв файле MIT krb5.conf
Если ни одно из перечисленных выше условий не выполнено, подключение завершится с ошибкой, и необходимо указать сервер явно. Если выполнены все требования, поиск сервера происходит следующим образом:
- получается
default_realmиз локальной конфигурации Kerberos - для записи
_ldap._tcp.dc._msdcs.{{ default_realm }}выполняется поиск DNS SRV - записи DNS сортируются по приоритету и весу, после чего выбирается первая запись
- для поиска используются имя узла и порт из выбранной записи SRV
Примечание
Если явно указан порт, он имеет приоритет над портом, возвращённым записью SRV.
Аутентификация
Важная составляющая подключения LDAP — способ аутентификации пользователя на сервере. Поддерживаются следующие механизмы аутентификации:
Аутентификация | Поддержка шифрования | Неявные учётные данные |
|---|---|---|
simple | Нет — требуется TLS | Да — отображается как анонимная |
certificate | Да | Нет |
negotiate | Да | Да — с Kerberos |
kerberos | Да | Да |
ntlm | Да | Нет |
Если не указано иное, по умолчанию используется протокол аутентификации negotiate, который основан на библиотеке pyspnego. Дополнительные сведения об установке этой зависимости см. в разделе требования.
Любой протокол, не поддерживающий шифрование, необходимо использовать с LDAPS или StartTLS либо явно отключить проверку шифрования с помощью параметра encrypt: false. Отключать шифрование не рекомендуется: учётные данные будут передаваться без защиты, а любые передаваемые данные сможет просматривать кто угодно. Кроме того, целевой сервер должен разрешать незашифрованные подключения, иначе он может отклонить их.
Поддержка неявных учётных данных означает, что протокол аутентификации может выполнять аутентификацию без явно заданных username и password. В настоящее время неявные учётные данные поддерживают только simple и negotiate/kerberos. Дополнительные сведения см. в разделе, посвящённом каждому протоколу.
Простая аутентификация
Простая аутентификация — это самый базовый поддерживаемый протокол аутентификации. При этом имя пользователя и пароль отправляются серверу в открытом виде, как при базовой аутентификации HTTP. В Microsoft AD в качестве имени пользователя требуется sAMAccountName или userPrincipalName учётной записи, тогда как в других реализациях LDAP требуется distinguishedName LDAP. Если имя пользователя и пароль не указаны, можно выполнить анонимное связывание, однако сервер, скорее всего, отклонит любые операции поиска, если запрос не аутентифицирован с использованием учётных данных реального пользователя. Простая аутентификация запрещена при подключении, не защищённом TLS. Её можно разрешить для таких подключений, отключив проверку шифрования, но делать это не рекомендуется.
Предупреждение
Следует избегать простой аутентификации, если не используется TLS через LDAPS или StartTLS. Если не использовать LDAPS, учётные данные, применяемые при аутентификации, а также последующие данные будут передаваться без защиты от перехвата или изменения.
Аутентификация по сертификату
При аутентификации по сертификату для проверки подлинности пользователя на узле используется аутентификация клиента TLS в рамках рукопожатия TLS. Поскольку она является частью рукопожатия TLS, её можно использовать только при подключении LDAPS или с StartTLS. Для аутентификации используются сертификат пользователя и ключ сертификата. Для указания клиентского сертификата и ключа, используемых при аутентификации, доступны три параметра:
-
certificate— сертификат и, при необходимости, включённый в него ключ -
certificate_key— ключ сертификата, если он не включён вcertificate -
certificate_password— пароль для расшифровки ключа сертификата
Значения certificate и certificate_key могут быть путями к файлам сертификата и ключа либо строками, содержащими сертификат/ключ в кодировке PEM. Путь к файлу certificate может указывать на сертификат в кодировке PEM, DER или PKCS12/PFX с необязательным включённым ключом, а путь к файлу certificate_key — на ключ в кодировке PEM или DER. Если ключ в содержимом PEM, DER или PKCS12/PFX зашифрован, параметр certificate_password позволяет указать пароль для его расшифровки.
Примечание
Возможность задать эти параметры зависит от плагина. Указанные здесь ключи соответствуют именам параметров и не обязательно являются переменными Ansible, которые плагин может устанавливать и считывать автоматически.
Negotiate
Аутентификация Negotiate — протокол аутентификации, используемый по умолчанию при подключении LDAP. Это сочетание kerberos и ntlm, при котором клиент выбирает, какой из протоколов использовать. Если доступен kerberos, ему отдаётся предпочтение; в противном случае используется ntlm. Пакет Python pyspnego предоставляет negotiate только с поддержкой ntlm; поддержка kerberos обеспечивается дополнительным компонентом pyspnego[kerberos]. Дополнительные сведения об установке этой зависимости см. в разделе требования.
Kerberos
Kerberos — современный протокол аутентификации, поддерживаемый серверами Microsoft AD и рекомендуемый для аутентификации. Он доступен, только если установлен дополнительный пакет pyspnego[kerberos] и узел настроен должным образом. Обычно эта настройка выполняется с помощью файла /etc/krb5.conf в системе. В этом руководстве не рассматривается настройка Kerberos на узле, поскольку она зависит от среды.
Проверить, правильно ли настроен Kerberos на узле, можно с помощью следующих команд:
$ python -c "import krb5" $ kinit username@DOMAIN.REALM $ kvno ldap/dc.domain.realm
Примечание
Команда kvno предназначена специально для MIT krb5 и недоступна на узлах, использующих Heimdal krb5, например macOS.
Команда python проверяет, установлены ли необходимые библиотеки Python. Команда kinit получает билет Kerberos для указанного пользователя, а команда kvno пытается получить билет службы для запрошенного имени субъекта-службы (SPN). Если обе команды выполняются успешно, велика вероятность, что аутентификация Kerberos будет работать при подключении LDAP.
С помощью команды kinit можно настроить кэш учётных данных для аутентификации Ansible. Если получить учётные данные с помощью kinit, можно пройти аутентификацию на LDAP-сервере, не задавая в Ansible имя пользователя и пароль явно. Kerberos также можно использовать с явно заданными учётными данными.
NTLM
NTLM — простой протокол аутентификации, который можно использовать отдельно или как резервный вариант negotiate, если kerberos недоступен. В отличие от поддержки kerberos, он обычно не поддерживает неявные учётные данные, поэтому для его использования, как правило, требуется явно указать имя пользователя и пароль. Дополнительная настройка узла не требуется: протокол должен работать после установки pyspnego.
Предупреждение
Хотя NTLM поддерживает шифрование, по современным стандартам оно считается слабым. Рекомендуется использовать NTLM только с подключением LDAPS или StartTLS, при котором более надёжное шифрование и проверка сервера, обеспечиваемые TLS, позволяют снизить риски, связанные с недостатками NTLM.
Проверка сертификата
При использовании LDAPS или LDAP через StartTLS выполняется рукопожатие TLS, в ходе которого клиент по умолчанию пытается проверить сертификат, предоставленный сервером. Если цепочке сертификатов нельзя доверять или имя узла не совпадает с запрошенным, подключение завершится с ошибкой, в которой будет указана причина. Расположение хранилища доверенных сертификатов по умолчанию зависит от конфигурации Python и библиотеки SSL, с которой он связан. Обычно это системное хранилище доверенных сертификатов, но при необходимости для проверки сертификата LDAPS можно использовать следующий код Python. Не забудьте заменить hostname на имя узла LDAP-сервера, который нужно проверить.
import socket
import ssl
hostname = 'dc.domain.com'
port = 636
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Параметр подключения ca_cert позволяет указать конкретный пакет сертификатов CA для проверки. Это полезно, если пакет сертификатов CA не входит в системное хранилище, а находится в другом месте файловой системы. Значением может быть:
- путь к файлу с пакетом сертификатов в кодировке PEM или DER
- путь к каталогу с несколькими сертификатами CA в формате PEM, организованными в соответствии с требованиями OpenSSL, описанными в разделе CApath
- строка с сертификатами в кодировке PEM
Проверку сертификата также можно отключить с помощью параметра подключения cert_validation. По умолчанию используется значение always, но его можно изменить на ignore, чтобы отключить все проверки, или на ignore_hostname, чтобы отключить только проверку имени узла. Это может быть полезно в тестовых средах с самоподписанными сертификатами, но не должно использоваться в рабочей среде.
Предупреждение
Отключение проверки сертификата лишает TLS многих преимуществ. Убедиться, что целевой сервер действительно является тем, за кого себя выдаёт, будет невозможно.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/microsoft/ad/docsite/guide_ldap_connection.html