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, централизуя хранение и раздавая право доступа, а не само значение.