Не всегда приложение может работать с динамическими учётными данными: некоторые системы требуют заранее созданной учётной записи с постоянным именем. В этом случае Stronghold берёт управление паролем существующей учётной записи на себя и меняет его по расписанию. Потребители всегда получают текущий пароль из Stronghold.

Цель

Настроить автоматическую ротацию пароля служебной учётной записи PostgreSQL и учётной записи в LDAP или Active Directory, а также выдачу учётных записей из общего пула (библиотеки) с возвратом.

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

Для выполнения примера нужны:

  • Токен Stronghold с правами на настройку механизмов секретов database и ldap.
  • Настроенное подключение к PostgreSQL в механизме database (например, database/config/myapp-postgres из руководства «Динамические учётные данные PostgreSQL»).
  • Существующая учётная запись billing_svc в PostgreSQL.
  • Сервер LDAP или Active Directory и учётная запись для Stronghold с правом менять пароли служебных учётных записей.

Не назначайте статической роли учётную запись, которую Stronghold использует для подключения в config/. После ротации пароль в config/ станет недействительным, и все роли этого подключения перестанут работать. Для смены пароля служебной учётной записи Stronghold используйте rotate-root.

Часть 1. Статическая роль в базе данных

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

  1. Разрешите подключению использовать новую роль, добавив её в allowed_roles:

    d8 stronghold write database/config/myapp-postgres allowed_roles="myapp,billing-svc"

    При изменении (update) переданные параметры объединяются с уже сохранёнными, поэтому остальные параметры подключения повторно передавать не нужно.

  2. Создайте статическую роль. Stronghold сразу меняет пароль учётной записи и дальше меняет его каждые 24 часа:

    d8 stronghold write database/static-roles/billing-svc db_name="myapp-postgres" username="billing_svc" rotation_period=24h
  3. Создайте политику для потребителей:

    d8 stronghold policy write billing-svc-creds - <<'POLICY'
    path "database/static-creds/billing-svc" {
      capabilities = ["read"]
    }
    POLICY
  4. Получите текущие учётные данные:

    d8 stronghold read database/static-creds/billing-svc

    Поле ttl показывает время до следующей ротации, last_vault_rotation — время последней смены пароля.

  5. При необходимости смените пароль немедленно, например при подозрении на компрометацию:

    d8 stronghold write -f database/rotate-role/billing-svc

Приложение должно запрашивать пароль заново после каждой ротации. Для приложений, которые читают пароль из файла, используйте шаблоны Stronghold Agent: Agent перерисует файл после ротации и выполнит команду перезагрузки.

Часть 2. Статическая роль в LDAP

Создайте статическую роль для существующей учётной записи LDAP:

  1. Включите механизм секретов и настройте подключение. Для Active Directory укажите schema=ad:

    d8 stronghold secrets enable ldap
    d8 stronghold write ldap/config binddn="CN=stronghold,OU=Service,DC=example,DC=com" bindpass="<BIND_PASSWORD>" url=ldaps://dc01.example.com schema=ad

    <BIND_PASSWORD> — текущий пароль учётной записи CN=stronghold. На следующем шаге Stronghold заменит его сгенерированным.

  2. Смените пароль учётной записи Stronghold, чтобы он был известен только Stronghold:

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

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

    d8 stronghold read ldap/static-cred/svc-backup
  5. Смените пароль вручную при необходимости:

    d8 stronghold write -f ldap/rotate-role/svc-backup

Механизм LDAP не хеширует пароль перед записью. Убедитесь, что на сервере LDAP настроена политика паролей, которая хранит пароли в хешированном виде. Подробнее — в разделе «Механизм секретов LDAP».

Часть 3. Библиотека учётных записей

Библиотека — это пул служебных учётных записей, которые выдаются во временное пользование. При возврате учётной записи Stronghold меняет её пароль, поэтому пароль, выданный предыдущему пользователю, перестаёт действовать.

  1. Создайте библиотеку:

    d8 stronghold write ldap/library/ops-team service_account_names="ops-svc1@example.com,ops-svc2@example.com" ttl=4h max_ttl=8h
  2. Возьмите учётную запись:

    d8 stronghold write -f ldap/library/ops-team/check-out

    Ответ содержит service_account_name, password и lease_id.

  3. Верните учётную запись после работы:

    d8 stronghold write ldap/library/ops-team/check-in service_account_names="ops-svc1@example.com"

    Если учётную запись не вернуть, Stronghold вернёт её автоматически по истечении ttl аренды.

Проверка

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

  1. Прочитайте database/static-creds/billing-svc, выполните rotate-role и прочитайте учётные данные ещё раз — пароль должен измениться.

  2. Подключитесь к PostgreSQL с новым паролем и убедитесь, что старый пароль отклоняется.

  3. Проверьте статус библиотеки:

    d8 stronghold read ldap/library/ops-team/status

    Выданные учётные записи отмечены available:false.

Очистка

Удаление статической роли не меняет пароль. Перед удалением смените пароль вручную, чтобы последнее значение, выданное Stronghold, перестало действовать:

d8 stronghold write -f database/rotate-role/billing-svc
d8 stronghold delete database/static-roles/billing-svc

d8 stronghold write -f ldap/rotate-role/svc-backup
d8 stronghold delete ldap/static-role/svc-backup

d8 stronghold delete ldap/library/ops-team
d8 stronghold policy delete billing-svc-creds

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

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