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, и проверьте поиск по каталогу.
Создайте учётную запись
svc-stronghold-bindдля поиска пользователей и групп. Достаточно прав обычного пользователя домена на чтение каталога. Задайте бессрочный пароль.Если планируете ротацию паролей, создайте учётную запись
svc-stronghold-rotatorи делегируйте ей право Reset password на OU со служебными учётными записями. Не выдавайте ей права администратора домена.Проверьте поиск по 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, подключите его к контроллерам домена и проверьте вход.
Включите метод аутентификации:
d8 stronghold auth enable ldapНастройте подключение. Пользователь входит по
sAMAccountName, группы ищутся с учётом вложенности через правилоLDAP_MATCHING_RULE_IN_CHAIN(OID1.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пользователя, который содержит все группы безопасности, включая вложенные.Чтобы искать пользователей по 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меняет только параметры, переданные в команде. Остальные параметры сохраняют текущие значения.Проверьте вход:
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.
Включите механизм секретов и настройте его на схему
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.Смените пароль
svc-stronghold-rotator, чтобы его знал только Stronghold:d8 stronghold write -f ldap/rotate-rootСоздайте статическую роль для служебной учётной записи приложения:
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"Приложение читает текущий пароль:
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».
Проверка
Проверьте результат:
Войдите под пользователем из группы, вложенной в
SG-Stronghold-Admins, и проверьте, что токен получил политикуadmin:d8 stronghold login -method=ldap username=ivanov d8 stronghold token lookupПрочитайте пароль статической роли и проверьте 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.