ALD Pro — российская служба каталогов на основе FreeIPA: данные пользователей и групп хранятся в 389 Directory Server, аутентификация выполняется через MIT Kerberos. Stronghold подключается к ALD Pro как к обычному LDAP-серверу, а при необходимости — как к центру распределения ключей Kerberos.
Цель
После настройки:
- Пользователи домена ALD Pro входят в Stronghold под своими доменными учётными записями через метод
ldap. - Права в Stronghold назначаются по членству в группах ALD Pro.
- Пользователи с действующим билетом Kerberos входят без ввода пароля (метод
kerberos, необязательно; только Stronghold EE). - Пароли служебных учётных записей домена ротирует Stronghold через механизм секретов LDAP.

Предварительные требования
Перед началом подготовьте:
- Развёрнутый домен ALD Pro, например
ald.example.comс контроллерамиdc01.ald.example.comиdc02.ald.example.com. - Сетевой доступ от узлов Stronghold к контроллерам домена по порту 636 (LDAPS), а для Kerberos — по порту 88.
- Сертификат корневого УЦ домена. На любом узле, введённом в домен, он находится в файле
/etc/ipa/ca.crt. - Токен Stronghold с правами на настройку методов аутентификации, механизмов секретов, политик и Identity.
- Утилиты
ldapsearchиjqна рабочей станции администратора.
В примерах используется базовый DN dc=ald,dc=example,dc=com. Замените его на DN своего домена.
Шаг 1. Подготовьте служебную учётную запись для поиска
Stronghold ищет пользователей и группы от имени отдельной учётной записи с правами только на чтение. Не используйте для этого учётные записи администраторов домена.
Создайте системную учётную запись (sysaccount) в ALD Pro. В FreeIPA это делается LDIF-файлом от имени
cn=Directory Manager:dn: uid=stronghold-bind,cn=sysaccounts,cn=etc,dc=ald,dc=example,dc=com changetype: add objectclass: account objectclass: simplesecurityobject uid: stronghold-bind userPassword: <BIND_PASSWORD> passwordExpirationTime: 20380119031407Z nsIdleTimeout: 0ldapmodify -x -H ldaps://dc01.ald.example.com -D "cn=Directory Manager" -W -f stronghold-bind.ldif<BIND_PASSWORD>— пароль учётной записиstronghold-bind.Если системные учётные записи в вашей инсталляции не используются, создайте обычного пользователя домена с бессрочным паролем и укажите его DN
uid=stronghold-bind,cn=users,cn=accounts,dc=ald,dc=example,dc=com.Скопируйте сертификат УЦ домена на рабочую станцию, с которой настраиваете Stronghold:
scp admin@dc01.ald.example.com:/etc/ipa/ca.crt ./ald-ca.crtПроверьте, что учётная запись видит пользователей и группы по LDAPS:
LDAPTLS_CACERT=./ald-ca.crt ldapsearch -x -H ldaps://dc01.ald.example.com -D "uid=stronghold-bind,cn=sysaccounts,cn=etc,dc=ald,dc=example,dc=com" -W -b "cn=users,cn=accounts,dc=ald,dc=example,dc=com" "(uid=ivanov)" uid memberOfВ выводе должны быть атрибут
uidпользователя и список групп вmemberOf.
Шаг 2. Настройте метод LDAP
Включите метод ldap, подключите его к контроллерам домена и проверьте вход.
Включите метод аутентификации:
d8 stronghold auth enable ldapНастройте подключение к ALD Pro. Группы ищутся по атрибуту
memberобъектов групп:d8 stronghold write auth/ldap/config url="ldaps://dc01.ald.example.com:636,ldaps://dc02.ald.example.com:636" certificate=@ald-ca.crt insecure_tls=false starttls=false binddn="uid=stronghold-bind,cn=sysaccounts,cn=etc,dc=ald,dc=example,dc=com" bindpass='<BIND_PASSWORD>' d8 stronghold write auth/ldap/config userdn="cn=users,cn=accounts,dc=ald,dc=example,dc=com" userattr="uid" groupdn="cn=groups,cn=accounts,dc=ald,dc=example,dc=com" groupfilter="(&(objectClass=groupOfNames)(member={{.UserDN}}))" groupattr="cn" username_as_alias=true<BIND_PASSWORD>— пароль учётной записиstronghold-bindиз шага 1. Первая команда настраивает подключение, вторая — поиск пользователей и групп.Основные параметры:
Параметр Значение для ALD Pro urlСписок контроллеров домена через запятую. Stronghold перебирает их по порядку при ошибке подключения. certificateСертификат УЦ домена из /etc/ipa/ca.crt.insecure_tlsfalse— проверка сертификата сервера обязательна.starttlsfalseдляldaps://. Если используетсяldap://на порту 389, укажитеtrue.userdn,userattrКонтейнер пользователей FreeIPA и атрибут входа uid.groupdn,groupfilter,groupattrКонтейнер групп и фильтр, который находит группы, где пользователь указан в member. Имя группы берётся изcn.username_as_aliasИмя псевдонима сущности совпадает с именем пользователя в домене. Альтернативный вариант — читать группы из атрибута
memberOfобъекта пользователя:d8 stronghold write auth/ldap/config groupdn="cn=users,cn=accounts,dc=ald,dc=example,dc=com" groupfilter="(&(objectClass=person)(uid={{.Username}}))" groupattr="memberOf"В этом случае в список групп попадут и роли, привилегии, правила HBAC и другие объекты, в которых состоит пользователь. Вариант с
memberвозвращает только группы изcn=groups,cn=accounts.Запись в
auth/ldap/configменяет только параметры, переданные в команде. Остальные параметры сохраняют текущие значения.Проверьте вход под доменной учётной записью:
d8 stronghold login -method=ldap username=ivanovИмя пользователя указывается без домена. Если группам ещё не назначены политики, токен получит только политику
default.
Шаг 3. Сопоставьте группы ALD Pro с политиками
Используйте один из двух способов. Не назначайте политики одной и той же группе обоими способами — это усложняет аудит прав.
Через группы метода LDAP
Имя группы в Stronghold должно совпадать со значением cn группы в ALD Pro:
d8 stronghold write auth/ldap/groups/stronghold-admins policies=admin
d8 stronghold write auth/ldap/groups/developers policies=dev-readСпособ подходит, если Stronghold использует только один метод входа.
Через внешние группы Identity
Внешние группы позволяют назначить политики один раз и использовать их для нескольких методов входа (например, ldap и kerberos), а также применять к группе правила MFA.
Создайте внешнюю группу и сохраните её идентификатор:
GROUP_ID=$(d8 stronghold write -field=id identity/group name="ald-stronghold-admins" type="external" policies="admin")Получите accessor метода
ldap/:LDAP_ACCESSOR=$(d8 stronghold auth list -format=json | jq -r '."ldap/".accessor')Создайте псевдоним группы. Значение
nameдолжно совпадать с именем группы в ALD Pro:d8 stronghold write identity/group-alias name="stronghold-admins" mount_accessor="$LDAP_ACCESSOR" canonical_id="$GROUP_ID"
Stronghold обновляет членство сущности во внешних группах при каждом входе и продлении токена. Изменения групп в ALD Pro применяются к выданным токенам при их продлении.
Шаг 4. Настройте единый вход по Kerberos (необязательно)
Метод kerberos принимает заголовок SPNEGO от клиента с действующим билетом Kerberos, а группы пользователя получает из LDAP. Параметры метода описаны в справочнике API методов аутентификации.
Метод аутентификации kerberos доступен только в Stronghold EE. Проверьте сценарий на тестовом стенде перед внедрением.
Создайте в ALD Pro сервисный принципал для HTTP-адреса Stronghold и получите keytab:
kinit admin ipa service-add HTTP/stronghold.ald.example.com ipa-getkeytab -s dc01.ald.example.com -p HTTP/stronghold.ald.example.com -k stronghold.keytabВключите метод. Метод читает токен SPNEGO из заголовка запроса
Authorizationи возвращает заголовокWWW-Authenticate, поэтому разрешите оба заголовка для подключения:d8 stronghold auth enable -passthrough-request-headers=Authorization -allowed-response-headers=www-authenticate kerberosЕсли метод уже включён, задайте те же заголовки для существующего подключения:
d8 stronghold auth tune -passthrough-request-headers=Authorization -allowed-response-headers=www-authenticate kerberos/Передайте keytab в кодировке Base64:
base64 -w0 stronghold.keytab > stronghold.keytab.b64 d8 stronghold write auth/kerberos/config keytab=@stronghold.keytab.b64 service_account="HTTP/stronghold.ald.example.com" add_group_aliases=trueС
add_group_aliases=trueметод передаёт группы пользователя из LDAP в Identity как псевдонимы групп, и внешние группы Identity работают для методаkerberos. Каждая запись вauth/kerberos/configзаменяет конфигурацию целиком: передавайтеkeytab,service_accountиadd_group_aliasesв одной команде.Значение
service_account— имя принципала в keytab в том же виде, что и вipa-getkeytab -p(HTTP/<FQDN>). Не указывайте для этого принципалаremove_instance_name=true: параметр убирает instance (часть после/) из имён принципалов в keytab и из имени пользователя при входе, и записьHTTP/stronghold.ald.example.comперестанет совпадать.Настройте поиск групп в LDAP. Параметры
auth/kerberos/config/ldapсовпадают с параметрамиauth/ldap/config:d8 stronghold write auth/kerberos/config/ldap url="ldaps://dc01.ald.example.com:636,ldaps://dc02.ald.example.com:636" certificate=@ald-ca.crt insecure_tls=false binddn="uid=stronghold-bind,cn=sysaccounts,cn=etc,dc=ald,dc=example,dc=com" bindpass='<BIND_PASSWORD>' d8 stronghold write auth/kerberos/config/ldap userdn="cn=users,cn=accounts,dc=ald,dc=example,dc=com" userattr="uid" groupdn="cn=groups,cn=accounts,dc=ald,dc=example,dc=com" groupfilter="(&(objectClass=groupOfNames)(member={{.UserDN}}))" groupattr="cn"<BIND_PASSWORD>— пароль учётной записиstronghold-bindиз шага 1. Первая команда настраивает подключение, вторая — поиск пользователей и групп.Назначьте политики группам:
d8 stronghold write auth/kerberos/groups/stronghold-admins policies=adminЕсли вы используете внешние группы Identity, создайте для каждой группы второй псевдоним с accessor метода
kerberos/вместо этого шага. Метод создаёт псевдонимы групп, только если вauth/kerberos/configзаданadd_group_aliases=true.Проверьте вход с машины, введённой в домен:
kinit ivanov curl --negotiate -u : -X POST https://stronghold.ald.example.com/v1/auth/kerberos/loginЗапрос должен быть
POST:GETпо этому пути всегда возвращает401 Negotiate. В ответе в полеauth.client_tokenвернётся токен Stronghold.Вход через
d8 stronghold login -method=kerberosи в веб-интерфейсе не поддерживается: в CLI дляkerberosне зарегистрирован обработчик входа, а веб-интерфейс позволяет только включить метод и не имеет формы входа для него. Используйте API, напримерcurl.
Шаг 5. Ротируйте пароли служебных учётных записей
Механизм секретов LDAP меняет пароли существующих учётных записей домена и выдаёт их приложениям. Для ALD Pro используйте схему openldap: пароль хранится в атрибуте userPassword.
В FreeIPA пароль, заданный другой учётной записью, по умолчанию помечается как истёкший, и пользователь должен сменить его при следующем входе. Учётная запись, от имени которой Stronghold меняет пароли, должна входить в список passSyncManagersDNs записи cn=ipa_pwd_extop,cn=plugins,cn=config, иначе ротированные пароли будут сразу истекать.
Создайте в ALD Pro учётную запись
stronghold-rotatorс правом менять пароли целевых служебных учётных записей.Включите механизм секретов и настройте подключение:
d8 stronghold secrets enable ldap d8 stronghold write ldap/config url="ldaps://dc01.ald.example.com:636" certificate=@ald-ca.crt insecure_tls=false binddn="uid=stronghold-rotator,cn=users,cn=accounts,dc=ald,dc=example,dc=com" bindpass='<ROTATOR_PASSWORD>' userdn="cn=users,cn=accounts,dc=ald,dc=example,dc=com" userattr="uid" schema=openldap<ROTATOR_PASSWORD>— текущий пароль учётной записиstronghold-rotator.Смените пароль учётной записи
stronghold-rotator, чтобы его знал только Stronghold:d8 stronghold write -f ldap/rotate-rootПолучить новый пароль после ротации нельзя. Если Stronghold потеряет доступ к ALD Pro, пароль придётся сбросить средствами домена.
Статическая роль
Статическая роль привязывает одну учётную запись домена к имени в Stronghold и меняет её пароль по расписанию:
d8 stronghold write ldap/static-role/svc-gitlab dn="uid=svc-gitlab,cn=users,cn=accounts,dc=ald,dc=example,dc=com" username="svc-gitlab" rotation_period="24h"Приложение читает текущий пароль:
d8 stronghold read ldap/static-cred/svc-gitlabПоле ttl в ответе показывает время до следующей ротации. Внеплановая ротация:
d8 stronghold write -f ldap/rotate-role/svc-gitlabБиблиотека учётных записей (check-out)
Библиотека выдаёт учётную запись из общего пула на время и меняет её пароль после возврата. Подходит для общих учётных записей, которыми пользуются дежурные инженеры.
d8 stronghold write ldap/library/ops-shared service_account_names="svc-ops1,svc-ops2" ttl=1h max_ttl=4hЗначения service_account_names сравниваются с атрибутом из userattr (здесь uid), поэтому указывайте значение uid, а не полный DN.
Выдача, проверка статуса и возврат:
d8 stronghold write -f ldap/library/ops-shared/check-out
d8 stronghold read ldap/library/ops-shared/status
d8 stronghold write ldap/library/ops-shared/check-in service_account_names="svc-ops1"Пример политики для приложения и дежурных инженеров:
path "ldap/static-cred/svc-gitlab" {
capabilities = ["read"]
}
path "ldap/library/ops-shared/check-out" {
capabilities = ["update"]
}
path "ldap/library/ops-shared/check-in" {
capabilities = ["update"]
}
path "ldap/library/ops-shared/status" {
capabilities = ["read"]
}Проверка
Проверьте результат:
Войдите под пользователем из группы
stronghold-adminsи проверьте политики токена:d8 stronghold login -method=ldap username=ivanov d8 stronghold token lookupВ
policies(илиidentity_policiesпри использовании внешних групп) должна быть политикаadmin.Убедитесь, что пользователь не из группы получает только
default.Прочитайте пароль статической роли и выполните с ним
ldapsearch -D "uid=svc-gitlab,..."— вход должен пройти успешно.
Устранение неполадок
Типовые ошибки и способы их устранения:
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
ldap operation failed: failed to bind as user или Invalid Credentials при входе | Неверный пароль пользователя, неверный userdn/userattr или неверный пароль binddn | Проверьте поиск и bind командой ldapsearch из шага 1. Проверьте, что пользователь находится в cn=users,cn=accounts. |
x509: certificate signed by unknown authority | В certificate не указан УЦ домена или указан не тот сертификат | Передайте /etc/ipa/ca.crt в certificate. Не включайте insecure_tls. |
x509: certificate is valid for ..., not ... | Адрес в url не совпадает с именем в сертификате контроллера | Указывайте FQDN контроллеров, а не IP-адреса. |
Вход проходит, но токен получает только default | groupfilter не находит группы или имена групп не совпадают с auth/ldap/groups/<GROUP_NAME> и псевдонимами | Выполните ldapsearch с фильтром из groupfilter, подставив DN пользователя. Сравните cn групп с именами в Stronghold. |
| Пользователь не может войти после нескольких неудачных попыток, пароль верный | Сработала блокировка Stronghold (lockout_threshold, по умолчанию 5 попыток на 15 минут) или учётная запись заблокирована в ALD Pro | Дождитесь окончания lockout_duration или проверьте статус учётной записи в ALD Pro. Настройки блокировки описаны в разделе «Метод LDAP». |
Приложение не может войти с паролем из static-cred | Пароль помечен в ALD Pro как истёкший | Добавьте учётную запись Stronghold в passSyncManagersDNs и выполните rotate-role. |
Очистка
Отключите методы аутентификации и механизм секретов:
d8 stronghold auth disable kerberos
d8 stronghold auth disable ldap
d8 stronghold secrets disable ldapПри отключении механизма секретов пароли учётных записей не меняются. Смените их средствами ALD Pro, а затем удалите учётные записи stronghold-bind и stronghold-rotator.