Я открыл админку Commercetools в пятницу — просто добавить одну интеграцию. Так до неё и не добрался. Потому что на меня смотрели тридцать четыре API-клиента. Половину из них я видел впервые. Некоторые были старше нынешней команды. В ту минуту я бросил свою задачу и сел писать инструмент, который умеет находить, аудировать и убивать протухшие API-клиенты — те самые забытые credentials, что копятся в любом энтерпрайзе и тихо ждут, пока кто-нибудь ими воспользуется.
Список, до конца которого никто не докручивает
Вот как честно выглядит «гигиена доступов» в большинстве компаний: кто-то во время спринта заводит клиента, зашивает секрет в сервис, катит в прод и забывает. Через два года этого человека уже нет в компании, сервис то ли ходит в API, то ли нет, а клиент всё так же живёт — с теми же scope, с которыми родился. Его никто не удаляет, потому что никто не может доказать, что это безопасно.
Вся защита этих ключей держится на честном слове и вере в лучшее.
Когда я наконец присмотрелся, картина оказалась хуже, чем просто «бардак». Это была дыра.
Первый настоящий аудит
Я выгрузил всех клиентов и сверил каждого с реальными логами обращений к API. Не по названию. Не по тому, что кто-то думал про этого клиента. А по тому, что он на самом деле вызывал и когда. Расклад:
- 34 API-клиента всего
- 12 живых — с понятным, задокументированным использованием
- 18 зомби — ноль активности за последние 90+ дней
- 4 с полным admin-scope к проду, к которым не прикасались полгода
Перечитайте последнюю строчку. Четыре ключа с полным доступом на запись в продовые данные, от проекта, который закрылся полтора года назад, всё ещё живые. Скомпрометируй любой из них — и можно было бы менять данные в проде бесследно: некому заметить, секрет не ротируется, аудита нет.
Четыре открытые двери в прод, о которых никто не знал.
Почему кладбище только растёт
Самое интересное — это вообще не техническая проблема. Это проблема ответственности, переодетая в техническую.
Каждый спринт плодит новых API-клиентов. Ни в одном спринте нет задачи «удалить клиента, которым мы перестали пользоваться». Доступы копятся как технический долг, только этот долг невидимый — нет падающего теста, красного дашборда, всплеска latency. Мёртвый клиент с admin-scope выглядит ровно как живой — до того дня, когда его повернут против тебя.
А причина, по которой их никто не чистит, до обидного проста: никто не может сказать, какие из них ещё используются. Нет карты. Нет трекинга обращений. Просто список имён, которые что-то значили для человека, который здесь давно не работает.
Нельзя убрать то, чего не видишь.
Инструмент: сделать невидимое видимым
Так что я собрал то, что должно было существовать с первого дня. Нарочито скучное: Python, в Docker, запускается где угодно без настройки. Наводишь на API Commercetools — и он делает четыре вещи:
- Находит всех клиентов аккаунта, никого не пропуская
- Сверяет каждого с реальными логами и раскладывает на живых и мёртвых
- Проверяет scope против тех вызовов, которые клиент реально делает, — видно, у кого прав больше, чем нужно
- Советует ротацию для всего, что держит больше власти, чем оправдано поведением
Запустить один раз — приятно. Но по-настоящему это ничего не решает: со следующего спринта кладбище начинает наполняться заново. Поэтому весь смысл в том, что он запускается не один раз.
Держать в поле зрения — автоматически
Теперь инструмент живёт в CI/CD:
- Еженедельные автосканы — аудит не героический подвиг раз в год, а cron-джоба
- Алерт в Slack в момент, когда клиент простаивает 30 дней, — зомби подсвечивается, пока люди ещё помнят проект
- Проверка scope на каждом прогоне — переразрешённые клиенты всплывают раньше, чем успевают дозреть до риска
Кладбище доступов перестало расти в ту секунду, когда за ним начали следить. В этом весь фокус. Не хитрый алгоритм — а постоянный дозор.
Иди проверь свои цифры
Это есть в любом энтерпрайзе. Просто большинство команд делают вид, что нет, — потому что посмотреть означает признать, сколько ключей от королевства валяется прямо на улице. Невидимая проблема остаётся невидимой, пока её не сделают видимой — и не оставят такой по расписанию.
Так что вот неуютное домашнее задание: сколько API-доступов в твоей инфраструктуре прямо сейчас имеют ноль активности за последние 90 дней? Сколько из них могут писать в прод? Открой админку и докрути список до конца.
Цифра тебя напряжёт. И правильно сделает.