Идея динамических секретов

Почему «создать креды на 30 минут и забыть» безопаснее, чем «хранить пароль годами».

Динамический секрет — учётные данные, которые Vault создаёт в целевой системе по запросу, выдаёт на ограниченный срок и автоматически удаляет по истечении аренды.

Статический секрет — это пароль, который кто-то когда-то создал и который живёт, пока его не сменят вручную. Динамический секрет переворачивает модель: пароля не существует, пока он не понадобился, а как только аренда истекла — он удаляется из целевой системы. Это и есть та возможность, ради которой Vault чаще всего внедряют.

Сравнение моделей

Статический секретДинамический секрет
один пароль на всехуникальные креды каждому потребителю
живёт годамиживёт минуты/часы (аренда)
ротация вручнуюновый креды при каждом запросе
отзыв = смена пароля вездеавто-отзыв по истечении аренды
утечка = долгий доступутечка = доступ на минуты

Как это выглядит

Приложению нужен доступ к БД. Вместо чтения статического пароля оно запрашивает креды у Vault и получает свежесозданную пару:

vault read database/creds/readonly
{
  "lease_id": "database/creds/readonly/abCD12",
  "lease_duration": 3600,
  "renewable": true,
  "data": {
    "username": "v-token-readonly-x7Yq2",
    "password": "A1b2-randomly-generated"
  }
}

Пользователь v-token-readonly-x7Yq2 только что создан в самой БД и будет удалён через час (lease_duration). Следующий запрос даст другого пользователя.

Почему это безопаснее

Главный выигрыш — сужение окна компрометации. Украденные динамические креды действуют считанные минуты или часы, а не вечно. Плюс появляется точная атрибуция: каждый потребитель ходит под своим уникальным пользователем, и по логам БД видно, кто именно что делал. И ротация становится бесплатной: она происходит сама при каждом новом запросе.

Как работает под капотом

За динамику отвечает движок секретов (database, aws, gcp и др.), который умеет создавать и удалять сущности в целевой системе. Для этого у движка есть собственные привилегированные креды (например, админ БД). При запросе движок выполняет в целевой системе команду создания пользователя, регистрирует аренду (lease) и возвращает креды клиенту. Когда аренда истекает или отзывается, движок выполняет команду удаления. Vault выступает посредником с правом создавать и убирать доступы.

[ Приложение ]
   | read creds
   v
[ Vault: database engine ] --CREATE USER--> [ PostgreSQL ]
   | возвращает временные креды + lease
   v
[ Приложение ] -- работает с БД под временным юзером --
   ... аренда истекла ...
[ Vault ] --DROP USER--> [ PostgreSQL ]

Частые ошибки

  • Кэшировать динамические креды надолго — приложение должно уметь получить новые, а не держать одни.
  • Не обрабатывать истечение аренды — после её конца креды перестанут работать, нужно запросить заново.
  • Считать, что это «обычный пароль из Vault» — это эфемерная сущность с жизненным циклом.

Итог

  • Динамический секрет создаётся по запросу, живёт ограниченно и удаляется по истечении аренды.
  • Это сужает окно компрометации, даёт атрибуцию и бесплатную ротацию.
  • Движок сам создаёт и удаляет сущности в целевой системе, используя свои привилегированные креды.
Проверьте себя
1. Чем динамический секрет принципиально отличается от статического?
AОн длиннее
BОн создаётся по запросу, живёт ограниченно и автоматически удаляется по истечении аренды
CОн хранится в .env
DОн не требует политик
2. Почему динамические креды снижают риск при утечке?
AИх нельзя украсть
BОни действуют лишь минуты/часы, поэтому окно эксплуатации мало
CОни зашифрованы дважды
DИх не видно в логах
3. Откуда у движка БД права создавать временных пользователей?
AОн угадывает пароль админа
BУ движка есть собственные привилегированные креды к целевой системе
CПользователи создаются в самом Vault
DЭто делает клиент