Stronghold подключается к Active Directory (AD) по протоколу LDAP: проверяет пароли пользователей домена, определяет их группы, в том числе вложенные, и назначает политики по группам. Механизм секретов LDAP со схемой ad меняет пароли служебных учётных записей домена.

Цель

После настройки:

  • Пользователи AD входят в Stronghold под доменными учётными записями через метод ldap по LDAPS.
  • Права в Stronghold назначаются по членству в группах AD с учётом вложенности.
  • Stronghold ротирует пароли служебных учётных записей AD и выдаёт их приложениям.

Предварительные требования

Перед началом подготовьте:

  • Домен AD, например corp.example.com с контроллерами dc01.corp.example.com и dc02.corp.example.com.
  • На контроллерах домена включён LDAPS (порт 636) с сертификатом, выданным корпоративным УЦ.
  • Сертификат корневого УЦ в формате PEM (Base-64), например corp-ca.pem.
  • Сетевой доступ от узлов Stronghold к контроллерам домена по порту 636.
  • Токен Stronghold с правами на настройку методов аутентификации, механизмов секретов, политик и Identity.

В примерах пользователи находятся в OU=Users,DC=corp,DC=example,DC=com, группы — в OU=Groups,DC=corp,DC=example,DC=com, служебные учётные записи — в OU=Service Accounts,DC=corp,DC=example,DC=com. Замените DN на свои.

Шаг 1. Подготовьте учётные записи в AD

Создайте учётные записи, которые Stronghold использует в AD, и проверьте поиск по каталогу.

  1. Создайте учётную запись svc-stronghold-bind для поиска пользователей и групп. Достаточно прав обычного пользователя домена на чтение каталога. Задайте бессрочный пароль.

  2. Если планируете ротацию паролей, создайте учётную запись svc-stronghold-rotator и делегируйте ей право Reset password на OU со служебными учётными записями. Не выдавайте ей права администратора домена.

  3. Проверьте поиск по LDAPS:

    LDAPTLS_CACERT=./corp-ca.pem ldapsearch -x -H ldaps://dc01.corp.example.com -D "svc-stronghold-bind@corp.example.com" -W -b "OU=Users,DC=corp,DC=example,DC=com" "(sAMAccountName=ivanov)" sAMAccountName userPrincipalName memberOf

Шаг 2. Настройте метод LDAP

Включите метод ldap, подключите его к контроллерам домена и проверьте вход.

  1. Включите метод аутентификации:

    d8 stronghold auth enable ldap
  2. Настройте подключение. Пользователь входит по sAMAccountName, группы ищутся с учётом вложенности через правило LDAP_MATCHING_RULE_IN_CHAIN (OID 1.2.840.113556.1.4.1941):

    d8 stronghold write auth/ldap/config url="ldaps://dc01.corp.example.com:636,ldaps://dc02.corp.example.com:636" certificate=@corp-ca.pem insecure_tls=false starttls=false binddn="CN=svc-stronghold-bind,OU=Service Accounts,DC=corp,DC=example,DC=com" bindpass='<BIND_PASSWORD>'
    d8 stronghold write auth/ldap/config userdn="OU=Users,DC=corp,DC=example,DC=com" userattr="sAMAccountName" groupdn="OU=Groups,DC=corp,DC=example,DC=com" groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" groupattr="cn" username_as_alias=true

    <BIND_PASSWORD> — пароль учётной записи svc-stronghold-bind. Первая команда настраивает подключение, вторая — поиск пользователей и групп.

    Основные параметры:

    ПараметрЗначение для AD
    urlСписок контроллеров домена через запятую, порт 636.
    certificateСертификат корневого УЦ, выдавшего сертификаты контроллеров.
    insecure_tls, starttlsfalse для ldaps://. При подключении по ldap:// на порту 389 укажите starttls=true.
    userattrsAMAccountName — короткое имя входа, например ivanov.
    groupfilterНаходит все группы, в которые пользователь входит прямо или через вложенные группы.
    groupattrcn — имя группы в Stronghold.

    Вместо groupfilter можно включить use_token_groups=true: Stronghold прочитает вычисляемый атрибут tokenGroups пользователя, который содержит все группы безопасности, включая вложенные.

  3. Чтобы искать пользователей по UPN (ivanov@corp.example.com), добавьте в конфигурацию параметр upndomain. Оставьте userattr=sAMAccountName:

    d8 stronghold write auth/ldap/config upndomain="corp.example.com"

    Пользователь по-прежнему вводит имя без домена, например ivanov. Stronghold от имени binddn ищет в userdn объект с userPrincipalName=ivanov@corp.example.com, выполняет bind с DN найденного объекта и использует этот DN при поиске групп.

    Запись в auth/ldap/config меняет только параметры, переданные в команде. Остальные параметры сохраняют текущие значения.

  4. Проверьте вход:

    d8 stronghold login -method=ldap username=ivanov

Шаг 3. Сопоставьте группы AD с политиками

Для одного метода входа достаточно групп метода LDAP. Имя группы должно совпадать с cn группы в AD:

d8 stronghold write auth/ldap/groups/SG-Stronghold-Admins policies=admin
d8 stronghold write auth/ldap/groups/SG-Developers policies=dev-read

Если группы AD используются и в других методах входа или к ним нужно применить MFA, создайте внешние группы Identity:

GROUP_ID=$(d8 stronghold write -field=id identity/group name="ad-stronghold-admins" type="external" policies="admin")
LDAP_ACCESSOR=$(d8 stronghold auth list -format=json | jq -r '."ldap/".accessor')
d8 stronghold write identity/group-alias name="SG-Stronghold-Admins" mount_accessor="$LDAP_ACCESSOR" canonical_id="$GROUP_ID"

Подробнее о внешних группах — в разделе «Идентификационные данные (Identity)».

Шаг 4. Ротируйте пароли служебных учётных записей

Механизм секретов LDAP со схемой ad меняет пароли служебных учётных записей AD и выдаёт их приложениям.

AD разрешает менять пароль (атрибут unicodePwd) только по защищённому соединению. Используйте ldaps:// или starttls=true.

  1. Включите механизм секретов и настройте его на схему ad:

    d8 stronghold secrets enable ldap
    d8 stronghold write ldap/config url="ldaps://dc01.corp.example.com:636" certificate=@corp-ca.pem insecure_tls=false binddn="CN=svc-stronghold-rotator,OU=Service Accounts,DC=corp,DC=example,DC=com" bindpass='<ROTATOR_PASSWORD>' userdn="OU=Service Accounts,DC=corp,DC=example,DC=com" schema=ad

    <ROTATOR_PASSWORD> — текущий пароль учётной записи svc-stronghold-rotator.

  2. Смените пароль svc-stronghold-rotator, чтобы его знал только Stronghold:

    d8 stronghold write -f ldap/rotate-root
  3. Создайте статическую роль для служебной учётной записи приложения:

    d8 stronghold write ldap/static-role/svc-jenkins dn="CN=svc-jenkins,OU=Service Accounts,DC=corp,DC=example,DC=com" username="svc-jenkins" rotation_period="24h"
  4. Приложение читает текущий пароль:

    d8 stronghold read ldap/static-cred/svc-jenkins

Для общих учётных записей, которые выдаются людям на время, используйте библиотеку:

d8 stronghold write ldap/library/helpdesk service_account_names="svc-helpdesk1@corp.example.com,svc-helpdesk2@corp.example.com" ttl=2h max_ttl=8h
d8 stronghold write -f ldap/library/helpdesk/check-out
d8 stronghold write ldap/library/helpdesk/check-in service_account_names="svc-helpdesk1@corp.example.com"

Значения service_account_names сравниваются с атрибутом из параметра userattr; для схемы ad по умолчанию это userPrincipalName, поэтому указывайте полное имя вида svc-helpdesk1@corp.example.com.

Политики доступа к static-cred и library аналогичны приведённым в разделе «Интеграция с ALD Pro».

Проверка

Проверьте результат:

  1. Войдите под пользователем из группы, вложенной в SG-Stronghold-Admins, и проверьте, что токен получил политику admin:

    d8 stronghold login -method=ldap username=ivanov
    d8 stronghold token lookup
  2. Прочитайте пароль статической роли и проверьте bind:

    LDAPTLS_CACERT=./corp-ca.pem ldapsearch -x -H ldaps://dc01.corp.example.com -D "svc-jenkins@corp.example.com" -w '<STATIC_CRED_PASSWORD>' -b "DC=corp,DC=example,DC=com" -s base

    <STATIC_CRED_PASSWORD> — значение password из ответа ldap/static-cred/svc-jenkins.

Устранение неполадок

При ошибке bind AD возвращает код 49 и подкод в поле data сообщения об ошибке. Подкод показывает причину.

СимптомВероятная причинаЧто сделать
Invalid Credentials, data 52eНеверный пароль пользователя или bindpassПроверьте пароль. После rotate-root пароль binddn известен только Stronghold.
data 525Пользователь не найденПроверьте userdn, userattr или upndomain.
data 775Учётная запись заблокирована в ADРазблокируйте её в AD. Проверьте также блокировку Stronghold (lockout_threshold), описанную в разделе «Метод LDAP».
data 533, data 532, data 701Учётная запись отключена, пароль или учётная запись истеклиВключите учётную запись или смените пароль в AD.
x509: certificate signed by unknown authorityНе указан или указан не тот сертификат УЦПередайте корневой сертификат корпоративного УЦ в certificate.
Вход проходит, но нет политик группgroupfilter не находит группы или имена групп не совпадаютВыполните ldapsearch с фильтром (member:1.2.840.113556.1.4.1941:=<USER_DN>). Имена групп в Stronghold должны совпадать с cn.
rotate-role возвращает Unwilling To Perform или Insufficient Access RightsНет защищённого соединения, у binddn нет права Reset password или пароль не соответствует политике паролей доменаИспользуйте LDAPS, проверьте делегирование и настройте политику паролей Stronghold через параметр password_policy.

Очистка

Отключите метод аутентификации и механизм секретов:

d8 stronghold auth disable ldap
d8 stronghold secrets disable ldap

При отключении механизма секретов пароли не меняются. Смените пароли служебных учётных записей средствами AD.

Дополнительные ресурсы