Spec-Zone.ru › Ansible

Руководство по подключению 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API