LDAP-аутентификация OpenSearch настраивается через backend Security plugin в файле config.yml. Для production-среды нужны защищенное соединение LDAPS или StartTLS, отдельная сервисная учетная запись bind, ограниченные базы поиска пользователей и групп, а также точные LDAP-фильтры.
Ниже приведен адаптируемый шаблон для каталога с пользователями в ou=People и группами в ou=Groups. Перед применением замените все значения в угловых скобках, проверьте названия параметров для установленной версии OpenSearch Security и протестируйте LDAP-запросы отдельно от OpenSearch.
Аутентификация подтверждает личность пользователя. Авторизация назначает ему права. За поиск учетных записей и групп отвечает LDAP backend в config.yml, а за связь групп с ролями OpenSearch обычно отвечает roles_mapping.yml. Построчное объяснение параметров собрано в разборе config.yml для LDAP-аутентификации OpenSearch.
Готовый шаблон config.yml для LDAP в OpenSearch Security
Пример ниже рассчитан на LDAP-каталог с TLS на порту 636, атрибутом входа uid и группами типа groupOfNames. В Active Directory потребуется заменить атрибуты поиска, базы DN и фильтры.
authc:
ldap:
http_enabled: true
transport_enabled: true
order: 0
http_authenticator:
type: basic
challenge: true
authentication_backend:
type: ldap
config:
enable_ssl: true
enable_start_tls: false
enable_ssl_client_auth: false
verify_hostnames: true
hosts:
- <ldap.example.com>:636
- <ldap-backup.example.com>:636
bind_dn: <uid=opensearch-bind,ou=Service,dc=example,dc=com>
password: <LDAP_BIND_PASSWORD>
userbase: <ou=People,dc=example,dc=com>
usersearch: (&(objectClass=inetOrgPerson)(uid={0}))
username_attribute: uid
rolebase: <ou=Groups,dc=example,dc=com>
rolesearch: (&(objectClass=groupOfNames)(member={0}))
userroleattribute: null
rolename: cn
resolve_nested_roles: falseНазвания блоков в отдельных выпусках Security plugin могут отличаться. В одной версии используется authc с доменом ldap, в другой встречаются дополнительные параметры транспортной аутентификации или отдельный блок для групп. Ошибка в названии ключа может привести к игнорированию настройки или отказу при загрузке конфигурации.
Минимальный состав LDAP-конфигурации
Блок authc описывает домены аутентификации. Для LDAP-сценария нужны следующие элементы:
orderзадает порядок проверки домена. Меньшее число означает более высокий приоритет.http_enabledвключает домен для REST API OpenSearch.transport_enabledнужен, если домен участвует в аутентификации межузловых или транспортных запросов. Настройка зависит от способа работы кластера.http_authenticatorзадает способ передачи учетных данных.basicподходит для HTTP Basic Auth.challengeопределяет, должен ли OpenSearch отправлять клиенту запрос на ввод учетных данных.authentication_backend.typeсо значениемldapподключает LDAP backend.hosts,bind_dnиpasswordзадают соединение и сервисную учетную запись.userbase,usersearchиusername_attributeограничивают поиск LDAP-пользователя.rolebase,rolesearchиrolenameопределяют поиск групп и имя группы, передаваемое в backend roles.
Параметры userbase и rolebase задают разные ветки каталога. Такое разделение сокращает область поиска и уменьшает риск совпадения с техническими или отключенными учетными записями.
Какие значения заменить перед применением
| Плейсхолдер или параметр | Что указать | Риск ошибки |
|---|---|---|
ldap.example.com:636 | DNS-имя и порт LDAP-контроллера | Timeout, отказ TLS или обращение к неправильному серверу |
bind_dn | DN сервисной учетной записи для поиска | LDAP bind завершается ошибкой 401 или Invalid Credentials |
password | Секрет bind-пользователя | Утечка учетных данных через Git, резервные копии или логи |
userbase | OU с разрешенными пользователями | Поиск по лишним веткам и вход нерелевантных аккаунтов |
usersearch | Фильтр с атрибутом логина | Пользователь не находится или находится несколько записей |
username_attribute | uid, sAMAccountName или другой атрибут | Логин не совпадает с полем каталога |
rolebase | OU с группами OpenSearch | Группы не определяются |
rolesearch | Фильтр по member, uniqueMember или другой схеме | Пользователь входит, но получает пустой набор ролей |
rolename | Атрибут имени группы, обычно cn | Имя backend role не совпадает с mapping |
Пароль нельзя коммитить в открытом виде. Храните его в защищенном файле с правами, ограниченными пользователем OpenSearch, в Docker Secret, Kubernetes Secret или подключенном secret store. Возможность подстановки секрета и точный синтаксис зависят от способа установки и версии Security plugin.
Подготовка LDAP и OpenSearch перед настройкой
Сначала соберите параметры каталога и проверьте связность с каждого узла OpenSearch. Конфигурация, которая работает с одного администратора, может не работать с узла кластера из-за DNS, firewall, маршрутизации или различий в truststore.
Проверьте версию OpenSearch Security
Версию OpenSearch можно получить через доступный REST API кластера или посмотреть в пакетном менеджере, контейнерном образе и списке установленных плагинов. Для plugin-пакетов полезно зафиксировать точную версию, например opensearch-security, а не только основной номер OpenSearch.
Проверьте перед изменением:
- версию OpenSearch на всех узлах;
- версию Security plugin;
- формат текущего
config.yml; - поддержку используемых параметров LDAP;
- способ загрузки конфигурации в конкретной установке.
Не переносите шаблон между релизами без сверки схемы. Часть параметров может быть переименована, перенесена в другой блок или зависеть от выбранного authenticator.
Определите структуру пользователей и групп
Зафиксируйте в рабочей документации следующие значения:
- корневой DN, например
dc=example,dc=com; - базу пользователей, например
ou=People,dc=example,dc=com; - базу групп, например
ou=Groups,dc=example,dc=com; - атрибут входа:
uidдля OpenLDAP илиsAMAccountNameдля Active Directory; - тип групп:
groupOfNames,posixGroup,groupили другой objectClass; - атрибут участника:
member,uniqueMember,memberUidилиmemberOf; - правила вложенных групп и их фактическую поддержку.
Для groupOfNames участник обычно хранится полным DN в атрибуте member. Для posixGroup часто используется короткое имя в memberUid. Active Directory обычно применяет объект класса group и атрибут member, а логин пользователя хранится в sAMAccountName.
Защищенное соединение OpenSearch с LDAP по TLS
В production передавайте bind-данные и LDAP-запросы по TLS. Открытый LDAP на порту 389 допустим для изолированной лаборатории, если это прямо предусмотрено архитектурой и сеть доверенная. Для рабочих учетных записей используйте LDAPS на 636 или StartTLS на 389.
LDAPS или StartTLS: что выбрать
| Режим | Порядок соединения | Типичные параметры |
|---|---|---|
| LDAPS | TLS устанавливается сразу после подключения | enable_ssl: true, enable_start_tls: false, порт 636 |
| StartTLS | Сначала открывается LDAP-соединение, затем отправляется команда перехода в TLS | enable_ssl: false, enable_start_tls: true, обычно порт 389 |
Выбирайте режим, который поддерживает сервер каталога и проверенная версия Security plugin. Одновременное включение enable_ssl и enable_start_tls обычно ошибочно: это два разных способа установления TLS.
Параметр verify_hostnames: true оставляйте включенным. Имя хоста в hosts должно совпадать с SAN сертификата LDAP-сервера. Подключение по IP может завершиться ошибкой проверки имени, если IP отсутствует в сертификате.
Сертификат и доверие к LDAP-серверу
OpenSearch должен доверять корневому или промежуточному CA, которым подписан сертификат LDAP-сервера. Импортируйте CA в truststore Java, который видит процесс OpenSearch, либо задайте truststore способом, предусмотренным вашей установкой.
Проверяйте цепочку с каждого узла:
openssl s_client -connect ldap.example.com:636 \
-servername ldap.example.com \
-showcerts В выводе проверьте цепочку сертификатов, срок действия, имя в SAN и итог проверки. Для StartTLS используйте режим, поддерживаемый вашей версией OpenSSL и LDAP-сервером, например:
openssl s_client -connect ldap.example.com:389 \
-starttls ldap \
-servername ldap.example.comНе отключайте проверку сертификата ради быстрого запуска. Такой обход скрывает ошибки доверия и оставляет учетные данные уязвимыми для атаки посредника.
Bind-пользователь и хранение секрета
Bind-пользователю нужны права на чтение только тех веток, где OpenSearch ищет пользователей и группы. Ему обычно не требуется право изменять записи, создавать пользователей или просматривать весь каталог.
Создайте отдельную учетную запись, например uid=opensearch-bind,ou=Service,dc=example,dc=com. Запретите интерактивный вход, задайте отдельный срок ротации секрета и отслеживайте неудачные bind-операции.
В конфигурациях Data Prepper уже используется подход со ссылкой на secret store вместо хранения plaintext credentials. Тот же принцип применяйте к bind-паролю OpenSearch. Секрет не должен попадать в публичный Git, вывод CI/CD, Docker-образ или диагностический архив.
Ограничение поиска пользователей и групп в каталоге
Широкий поиск от корневого DN создает лишние LDAP-запросы и повышает вероятность совпадений. Используйте отдельные userbase и rolebase, задавайте objectClass и фильтр логина.
userbase и usersearch: поиск только нужных учетных записей
Для OpenLDAP пример фильтра может выглядеть так:
userbase: ou=People,dc=example,dc=com
usersearch: (&(objectClass=inetOrgPerson)(uid={0}))
username_attribute: uidЗначение {0} заменяется введенным логином. Фильтр требует одновременно подходящий objectClass и точное совпадение атрибута uid.
Для Active Directory базовая часть может выглядеть так:
userbase: OU=Users,DC=example,DC=com
usersearch: (&(objectClass=user)(sAMAccountName={0}))
username_attribute: sAMAccountNameЕсли доступ разрешен только членам специальной группы, добавьте ограничение с учетом схемы каталога. Фильтр должен проверяться через ldapsearch, потому что синтаксически корректный YAML не подтверждает корректность LDAP-логики.
rolebase и rolesearch: получение только нужных групп
Для групп groupOfNames, где в member хранится DN пользователя, используется пример:
rolebase: ou=Groups,dc=example,dc=com
rolesearch: (&(objectClass=groupOfNames)(member={0}))
rolename: cn
userroleattribute: null
resolve_nested_roles: falseВ этом варианте {0} обычно получает DN найденного пользователя, а rolename: cn передает в backend roles короткое имя группы. Если каталог хранит полные DN в ролях, mapping должен использовать именно этот формат.
Для схемы с атрибутом пользователя memberOf часто требуется получить группы из записи пользователя:
userroleattribute: memberOf
rolename: cnТочный вариант зависит от реализации LDAP backend. Не смешивайте rolesearch по группам и userroleattribute без проверки результата: при неверной комбинации вход пройдет, но список backend roles окажется пустым.
Вложенные группы увеличивают число запросов и зависят от возможностей каталога. Оставляйте resolve_nested_roles: false, пока не подтвердите необходимость вложенности и корректность результата на тестовой группе.
Фильтры LDAP для OpenLDAP и Active Directory
| Каталог | Логин | Группа | Типичный атрибут участника |
|---|---|---|---|
| OpenLDAP | uid | groupOfNames | member с полным DN |
| OpenLDAP | uid | posixGroup | memberUid с коротким uid |
| Active Directory | sAMAccountName | group | member с DN объекта |
| Active Directory | sAMAccountName | вложенные группы | memberOf или LDAP_MATCHING_RULE_IN_CHAIN |
Проверка записи пользователя:
ldapsearch -H ldaps://ldap.example.com:636 \
-D 'uid=opensearch-bind,ou=Service,dc=example,dc=com' \
-W \
-b 'ou=People,dc=example,dc=com' \
'(&(objectClass=inetOrgPerson)(uid=alice))' dn uid memberOfПроверка группы по DN пользователя:
ldapsearch -H ldaps://ldap.example.com:636 \
-D 'uid=opensearch-bind,ou=Service,dc=example,dc=com' \
-W \
-b 'ou=Groups,dc=example,dc=com' \
'(&(objectClass=groupOfNames)(member=uid=alice,ou=People,dc=example,dc=com))' cn memberДля Active Directory замените базу, bind DN, objectClass и атрибуты на значения своей схемы. Не копируйте фильтр OpenLDAP без изменений.
Сопоставление LDAP-групп с ролями OpenSearch
Успешный LDAP bind не выдает пользователю права автоматически. Security plugin получает группы, формирует backend_roles, а затем проверяет их в roles_mapping.yml.
Как LDAP-группа превращается в backend role
Предположим, LDAP возвращает группу ldap-opensearch-readers через атрибут cn. В mapping нужно указать ровно это имя. Несовпадение регистра, короткого имени и полного DN приводит к отсутствию роли.
Проверяйте:
- какое значение возвращает LDAP для
cn; - используется ли короткое имя или полный DN;
- совпадает ли регистр в mapping;
- не содержит ли значение лишних пробелов;
- получает ли пользователь группу через прямое или вложенное членство.
Пример roles_mapping.yml для трех групп
all_access:
reserved: false
backend_roles:
- ldap-opensearch-admins
opensearch_operators:
reserved: false
backend_roles:
- ldap-opensearch-operators
opensearch_readers:
reserved: false
backend_roles:
- ldap-opensearch-readersВ этом примере all_access назначается только группе администраторов. Для операторов и читателей создайте отдельные роли в roles.yml с минимальным набором разрешений. Названия ролей могут отличаться от имен LDAP-групп, но mapping должен оставаться однозначным.
Практическая схема настройки ролей через группы LDAP разобрана в руководстве по ролям OpenSearch через LDAP.
Минимальные права для LDAP-пользователей в OpenSearch
Модель least privilege разделяет права на трех уровнях: cluster permissions, index permissions и tenant permissions. Каждая группа получает набор действий, необходимый для ее рабочих задач.
Права администраторов, операторов и читателей
| Группа | Cluster permissions | Index permissions | Tenant permissions |
|---|---|---|---|
| Администраторы | Управление Security plugin и согласованные административные операции | По необходимости, без автоматической выдачи wildcard | Общий tenant для администрирования |
| Операторы | Ограниченные операции мониторинга и обслуживания | Чтение и разрешенные операции записи в назначенных индексах | Shared tenant без управления security-настройками |
| Читатели | Минимальные права мониторинга, если они нужны | Только чтение выбранных индексов | Private или ограниченный shared tenant |
Пример роли читателя:
opensearch_readers:
reserved: false
cluster_permissions:
- 'cluster_composite_ops_ro'
index_permissions:
- index_patterns:
- 'logs-app-*'
allowed_actions:
- 'read'
tenant_permissions:
- tenant_patterns:
- 'app_logs'
allowed_actions:
- 'kibana_all_read'Названия действий зависят от версии и установленной модели ролей. Проверьте их в текущем Security plugin перед загрузкой.
Доступ к Dashboards и tenant permissions
Права REST API и права OpenSearch Dashboards проверяются отдельно. Пользователь может читать индекс через API, но не видеть saved objects в Dashboards. Обратная ситуация тоже возможна, если tenant permissions настроены шире index permissions.
Для каждой группы проверьте:
- вход в Dashboards;
- доступ к нужному tenant;
- чтение saved objects;
- видимость разрешенных индексов;
- отсутствие доступа к административным разделам.
Какие права не следует выдавать по умолчанию
all_accessвсем пользователям LDAP;security_rest_api_accessоператорам и читателям без рабочей необходимости;- wildcard-паттерны на все индексы;
- административные cluster permissions для групп чтения;
- запись и удаление данных там, где требуется только поиск.
Начинайте с пустого набора разрешений и добавляйте конкретные действия после проверки API. Временная выдача all_access скрывает ошибку mapping и часто остается в рабочей конфигурации.
Применение config.yml и проверка в работающем кластере
Порядок действий снижает риск потери доступа и рассинхронизации узлов. Меняйте конфигурацию через штатный инструмент Security plugin, а не ручным редактированием файлов на одном сервере.
Резервная копия и план отката
Перед изменением сохраните:
- текущие
config.yml,roles.ymlиroles_mapping.yml; - версию OpenSearch и Security plugin;
- имена узлов и целевой cluster name;
- рабочий admin-сертификат;
- проверенный способ возврата прежней конфигурации.
Проверьте локальный admin-доступ до начала работ. Ошибка в authentication domain или mapping может заблокировать вход всех пользователей, включая LDAP-администраторов.
Проверка YAML и LDAP-запросов до применения
Сначала проверьте отступы, вложенность и обязательные ключи YAML-парсером, доступным в вашей среде. Затем отдельно проверьте DNS, TCP-порт, TLS handshake, bind и поиск пользователя через ldapsearch.
Диагностический порядок:
- Разрешить имя LDAP-сервера с каждого узла OpenSearch.
- Проверить доступность порта 636 или 389.
- Проверить цепочку сертификата и имя в SAN.
- Выполнить bind сервисной учетной записью.
- Найти тестового пользователя фильтром из
usersearch. - Найти его группы фильтром из
rolesearch. - Сверить полученное имя группы с
roles_mapping.yml.
Применение через securityadmin.sh
securityadmin.sh загружает конфигурацию Security plugin в кластер. Для запуска требуется admin-сертификат с допустимым DN, сетевой доступ к REST или transport endpoint согласно настройкам и совместимость версии инструмента с кластером.
Общий порядок выглядит так:
./securityadmin.sh \
-cd /path/to/securityconfig \
-icl \
-nhnv \
-cacert /path/to/ca.pem \
-cert /path/to/admin.pem \
-key /path/to/admin-key.pemПараметр -nhnv отключает проверку имени узла в клиенте securityadmin. Не переносите его автоматически в production-процедуру: требования зависят от сертификатов и версии инструмента. При включенной проверке hostname используйте корректные DNS-имена и сертификаты.
Перед загрузкой убедитесь, что команда обращается к нужному кластеру. После применения проверьте логи всех узлов и состояние Security plugin. Способ запуска и набор аргументов меняются между версиями и пакетными установками OpenSearch.
Функциональная проверка после изменений
Создайте тестовые учетные записи в трех группах и проверьте каждую отдельно:
- администратор входит и выполняет только согласованные административные операции;
- оператор читает и изменяет назначенные ресурсы, но не управляет security-настройками;
- читатель читает
logs-app-*и получает отказ при обращении к закрытому индексу; - пользователь видит разрешенный tenant в Dashboards;
- пользователь без LDAP-группы не получает рабочую роль.
Фиксируйте коды ответа. Успешный вход дает 200 или другой ожидаемый положительный ответ для разрешенного действия, а запрещенный запрос должен завершаться 403.
Диагностика ошибок LDAP-аутентификации OpenSearch
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| 401 Unauthorized | Неверный пароль, bind DN, userbase или usersearch | LDAP bind, DN пользователя, фильтр и атрибут логина |
| 403 Forbidden | Вход успешен, роль не назначена или permission недостаточно | backend_roles, mapping, index и tenant permissions |
| TLS handshake error | Недоверенный CA, истекший сертификат или неверное имя | openssl s_client, truststore и SAN |
| Timeout | DNS, firewall, маршрут или недоступный контроллер | DNS-запись, TCP-порт и сетевые логи |
| Группы отсутствуют | Неверный rolebase, rolesearch или атрибут участника | Запись группы через ldapsearch и формат DN |
LDAP-сервер недоступен или не проходит TLS
Проверяйте проблему с узла OpenSearch, а не с рабочей станции администратора. Сравните DNS-ответы, маршрут и правила firewall. Затем проверьте сертификат, срок действия, SAN и доверенный CA.
В логах ищите сообщения со словами SSLHandshakeException, PKIX path building failed, Connection refused и timeout. Каждое сообщение указывает на отдельный уровень сбоя: truststore, порт или сеть.
Пользователь найден, но вход завершается ошибкой
Поиск записи не подтверждает возможность входа. После поиска OpenSearch должен выполнить bind от имени найденного пользователя с введенным паролем. Проверьте DN результата, атрибут логина и отдельный bind тестовой учетной записью.
Если сервисный bind работает, а пользовательский bind завершается Invalid Credentials, проверяйте пароль, блокировку учетной записи, срок действия и ограничения политики каталога.
Вход успешен, но OpenSearch возвращает 403
HTTP 403 означает отказ в доступе к уже понятому сервером запросу. Для LDAP-сценария чаще всего отсутствует корректное сопоставление группы с ролью.
Проверьте в таком порядке:
- Возвращается ли группа из LDAP.
- Совпадает ли формат имени группы с mapping.
- Загружен ли актуальный
roles_mapping.yml. - Содержит ли роль нужные index permissions.
- Разрешен ли нужный tenant в Dashboards.
Не устраняйте 403 временной выдачей all_access. Сначала зафиксируйте фактическую backend role и конкретное запрещенное действие.
Группы пользователя не определяются
Сопоставьте схему группы с фильтром. При groupOfNames ищите DN пользователя в member, при posixGroup проверяйте memberUid. В Active Directory убедитесь, что фильтр учитывает group, а имя пользователя и DN не перепутаны.
Если применяются вложенные группы, проверьте настройку resolve_nested_roles, поведение контроллера и ограничения на рекурсивный поиск. Сначала добейтесь корректного результата для прямого членства.
Production-чеклист OpenSearch LDAP-конфигурации
Что проверить перед публикацией и внедрением
- Версии OpenSearch и Security plugin зафиксированы.
- Все плейсхолдеры заменены реальными значениями.
- Выбран LDAPS или StartTLS, открытый LDAP не используется без обоснования.
- Сертификат LDAP-сервера действителен, его SAN совпадает с DNS-именем.
- CA импортирован в truststore нужного процесса.
- Bind-пользователь имеет права только на чтение нужных веток.
- Пароль не хранится в публичном Git и логах.
userbaseиrolebaseограничены конкретными OU.usersearchиrolesearchпроверены черезldapsearch.- Группы администраторов, операторов и читателей разделены.
- Wildcard-права и безусловный
all_accessисключены. - Подготовлены резервная копия, admin-сертификат и план отката.
Минимальный набор проверок после внедрения
- Успешный вход пользователя из каждой разрешенной группы.
- Отказ при неверном пароле.
- Отказ пользователя без разрешенной группы.
- Чтение разрешенного индекса.
- 403 при обращении к закрытому индексу.
- Проверка записи и изменения данных для операторов.
- Проверка входа в Dashboards и доступа к нужному tenant.
- Проверка backend roles в логах или доступном диагностическом механизме.
- Отсутствие TLS ошибок и массовых поисковых запросов в LDAP.
- Проверка ротации bind-пароля по подготовленной процедуре.
Для быстрого сравнения минимальной и production-схемы используйте практическое руководство по минимальному config.yml OpenSearch. Отдельные команды для проверки bind, DNS, TCP и логов собраны в шпаргалке по диагностике LDAP-аутентификации.
Рабочая production-конфигурация LDAP для OpenSearch строится вокруг четырех проверок: защищен ли канал, ограничены ли базы поиска, корректно ли группы превращаются в backend roles и не выданы ли пользователям лишние разрешения.
После проверки конфигурации зафиксируйте версии, значения DN, фильтры, mapping и тестовые результаты в базе знаний команды. Это сокращает время восстановления при смене сертификатов, контроллера LDAP или узла OpenSearch.