Я открыл админку 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 дней? Сколько из них могут писать в прод? Открой админку и докрути список до конца.

Цифра тебя напряжёт. И правильно сделает.