Secret sprawl: как секреты расползаются

Почему в зрелой компании одни и те же креды лежат в десятке мест и никто не знает, где именно.

Secret sprawl (расползание секретов) — состояние, при котором копии секретов неконтролируемо распространяются по репозиториям, CI-системам, образам контейнеров, чатам и файлам разработчиков.

Хардкод одного пароля — локальная проблема. Secret sprawl — системная: организация физически теряет ответ на простой вопрос «где сейчас лежит пароль от продакшн-базы и кто к нему имеет доступ».

Откуда берётся расползание

Секрет создаётся один раз, а копий появляется десятки. Вот типичный жизненный путь одного пароля от БД:

пароль создан в облаке
   |
   +--> вставлен в .env разработчика А
   +--> отправлен в Slack коллеге Б
   +--> записан в Variables CI (GitLab/GitHub)
   +--> зашит в Docker-образ через ARG
   +--> продублирован в staging-конфиг
   +--> сохранён в личном менеджере паролей В

Каждая стрелка — новая точка утечки и новый источник, который нужно обновить при ротации. На практике обновляют не все, и старый пароль продолжает где-то работать.

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

Расползание ломает три свойства безопасности сразу. Невозможна ротация: сменить пароль означает найти и обновить все копии, а их карта неизвестна. Невозможен аудит: если секрет утёк, нельзя понять, из какой именно копии. Размывается ответственность: доступ есть у тех, кто давно уволился или сменил роль.

Как работает под капотом утечка через образ

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

# секрет, переданный через ARG, виден в метаданных образа
docker history --no-trunc myapp:latest
docker inspect myapp:latest

Образ уезжает в реестр, реестр доступен многим — и секрет расползается дальше уже вместе с артефактом сборки.

Подход Vault к проблеме

Vault разрывает цепочку копий: вместо распространения значения распространяется право его получить. Приложение в момент старта аутентифицируется и читает секрет напрямую из Vault. Копий не возникает, потому что секрет живёт в одном месте, а доступ к нему — это управляемая политика, которую можно отозвать.

Без VaultС Vault
копии пароля во многих местаходно каноничное хранилище
ротация = охота за копиямиротация в одной точке
кто читал — неизвестнокаждое чтение в audit-логе

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

  • Копировать секрет из Vault в .env «чтобы было удобнее» — вы вернули sprawl обратно.
  • Передавать секреты через Docker ARG — они оседают в слоях и истории образа.
  • Раздавать долгоживущие креды людям в чат вместо выдачи доступа через систему.

Итог

  • Secret sprawl — это потеря карты того, где лежат секреты и у кого к ним доступ.
  • Расползание делает невозможными ротацию, аудит и отзыв доступа.
  • Vault борется с sprawl, централизуя хранение и раздавая право доступа, а не само значение.
Проверьте себя
1. Что такое secret sprawl?
AШифрование секретов несколькими ключами
BНеконтролируемое расползание копий секретов по системам и людям
CАвтоматическая ротация паролей
DСпособ хранения секретов в одном месте
2. Почему secret sprawl делает ротацию практически невозможной?
AПароли становятся слишком длинными
BНеизвестна полная карта всех копий, которые надо обновить
CVault блокирует смену паролей
DРотация запрещена политиками
3. Как Vault принципиально борется с расползанием секретов?
AЗапрещает использовать .env-файлы
BРаздаёт право получить секрет, а не само значение, храня его в одном месте
CШифрует Docker-образы
DУдаляет историю git автоматически