Каждый новый LLM-провайдер в команде умножает ключи: 5 провайдеров × 3 среды × 4 команды = 60 секретов в .env, CI-переменных и мессенджерах. Ротация превращается в обход всех мест, отзыв — в панику. Централизация и автоматизация делают ротацию фоновой операцией, а не проектом.
Key sprawl: откуда 60 ключей
Ключ появляется быстрее процесса: разработчик скопировал при прототипе, закоммитил .env, прокинул в CI. Через месяц никто не помнит какие ключи ходят в прод-данные и кто их выдавал. Hardcoded секреты остаются в истории Git даже после удаления, а без ротации и аудита нельзя быстро локализовать инцидент — пять из шести разборов 2024–2026 упирались не в хранение, а в отсутствие мониторинга кто и как часто обращается к секретам.
Почему .env и base64 — не хранение
Kubernetes Secrets — base64, не шифрование. .env на ноутбуке — копия без TTL и без отзыва. Решение — единое хранилище с политиками и аудитом:
- Vault — когда нужно единое хранилище, ACL, динамические секреты и аудит на организацию;
- Sealed Secrets / ESO — когда нужен GitOps-старт в одном кластере с доставкой в namespace.
Практический стек 2026: Vault как источник правды + External Secrets Operator для доставки в Kubernetes + короткие TTL + аудит. Это баланс между безопасностью и скоростью.
Dynamic vs static: нечего ротировать vs ротировать
Сила Vault — динамические секреты: вместо ротации общего пароля каждому потребителю выдается уникальный credential с lease TTL (часы). Приложение запрашивает доступ к Postgres — Vault создает временного пользователя БД на 1 час, потом отзывает. Нет shared password, нет глобальной ротации, компрометация одного lease не бьет по остальным. Blast radius — часы.
Статика (API-ключи LLM, Stripe) остается: для них — KV v2 с версионированием и ротацией по расписанию. Но даже там TTL и overlap снижают риск.
48-часовой overlap: ротация без даунтайма
Безопасный паттерн:
T+0 Сгенерировать KEY_B рядом с KEY_A (оба валидны)
T+1h Прогнать тестовые запросы на KEY_B
T+24h Переключить потребителей на KEY_B
T+48h Отозвать KEY_A
Два ключа валидны одновременно — zero-downtime гарантировано, кэшированные credentials в долгоживущих процессах успевают протухнуть, CI подхватывает новый ключ на следующем запуске. Если KEY_B проблемный — откат на KEY_A без простоя. Для AWS Secrets Manager это two-user ротация, для Azure KV — версионирование, для Vault KV v2 — версионированный секрет с мягким удалением.
Частота: SOC 2 / ISO 27001 — 90 дней, для LLM-ключей с платежными полномочиями — 30–60 дней.
Доставка: Vault Agent + ESO
- Vault Agent как sidecar/init-container: аутентифицируется через Kubernetes auth (service account), проактивно перезапрашивает секреты при приближении lease expiry, рендерит в файл/env без хранения в Git.
- ESO берет секреты из Vault/AWS SM/Azure KV и создает нативные Secrets в namespace. Облачные CSI-драйверы опрашивают по расписанию — есть окно с устаревшими кредами (минута-две после ротации), Vault Agent обновляет немедленно.
Интеграция с CI/CD — через AppRole / JWT/OIDC (GitHub Actions, GitLab CI), а не через долгоживущие переменные.
Runbook отзыва за 1 час
- Обнаружение — зафиксировать факт и затронутые системы.
- Изоляция — отозвать leases/токены, заблокировать сессии.
- Ротация — заменить все потенциально скомпрометированные секреты (overlap!).
- Проверка — убедиться что новые секреты применены (поды перезапросили).
- Разбор — найти корневую причину и закрыть в процессе.
Скорость важнее идеальной формулировки: чем быстрее отзыв и ротация, тем меньше ущерб. Проверьте сейчас: включен ли audit device на Vault и есть ли алерт на burst GetSecretValue в CloudTrail — если нет, у вас та же проблема что в пяти из шести кейсов.
Где Codenik
Codenik хранит и ротирует секреты централизованно: агент не знает токена downstream-системы, gateway подставляет scoped секрет на каждый tools/call и логирует применение. Ротация — одна операция в хранилище, а не обход ноутбуков: поменяли в Vault — все агенты получили новый при следующем вызове, отозвали lease — доступ закрылся везде мгновенно. Это убирает key sprawl из конфигов и делает отзыв фоновой операцией.
Короткий вывод
Секреты должны жить отдельно от агентов и ротироваться сами. Начните с инвентаризации и сканирования pre-commit, централизуйте в Vault, введите overlap-ротацию и протестируйте runbook отзыва. Тогда следующий ключ утечет на часы, а не на месяцы.