Разрастание секретов: как мы устранили утечку 412 токенов
CI-конвейер дал сбой в 2:13 ночи 3 марта. Мы обнаружили 412 утекших API-токенов в 37 репозиториях. Эта ошибка поставила под угрозу 1,2 миллиона долларов потенциальных затрат на устранение последствий взлома.
Большинство команд считают, что Vault решает все проблемы. На самом деле, Vault может стать единой точкой отказа из-за задержек (latency). Когда токены хранятся вне Vault, используются жестко закодированные (hard-coded) значения или переменные окружения. Эти резервные варианты не отображаются в журналах аудита.
Наши метрики показали цену этого разрастания:
- Обычное получение секрета: 48 мс на запрос.
- Во время утечки: 187 мс на запрос.
Агенты сборки (build agents) извлекали по 12 токенов на задачу из удаленного кластера Vault. Это вызывало тайм-ауты и вынуждало разработчиков вручную откатывать изменения. Задержка — это не просто медленный процесс. Это центр затрат, который раздувает счета за облачные услуги и замедляет работу разработчиков.
Одна утекшая AWS-ключ в staging-репозитории могла стоить 120 долларов в час, если бы злоумышленник ею воспользовался. Один час злоупотребления стоит дороже, чем ежеквартальный аудит безопасности.
Статические сканеры нас подвели. Они пропустили 78% наших токенов. Почему? Потому что эти токены генерировались «на лету» и находились в артефактах сборки, а не в исходном коде. Один шаг GitHub Actions записал токен в слой Docker. Сканер ничего не увидел, но токен неделями находился в нашем реестре (registry).
Вам нужна видимость во время выполнения (runtime visibility), а не только статическая проверка.
Чтобы исправить это, мы создали Lambda-движок. Он отслеживает новые секреты через CloudTrail и сравнивает их с нашим Vault. Вот новый рабочий процесс:
- Обнаружение секрета через webhook.
- Запрос метаданных из Vault.
- Аннулирование токена через API провайдера.
- Открытие PR для удаления секрета из файла.
- Автоматическое слияние (merge) PR, если он проходит CI.
Этот движок ротировал 412 токенов за 27 минут с успешностью 99,97%.
Теперь мы отслеживаем возраст секрета. Если токену больше 30 дней, сборка завершается ошибкой. Это простое правило позволило сократить количество новых утечек на 62% за один квартал. Мы также используем модель isolation forest, чтобы помечать странные паттерны использования. Если токен появляется с нового IP-адреса, система немедленно его ротирует.
Перестаньте относиться к токенам как к файлам. Относитесь к возрасту секрета и задержке получения как к ключевым метрикам. Если вы это сделаете, разрастание сократится.
Optional learning community: https://t.me/GyaanSetuAi
