Защита API от несанкционированного доступа: вход, права, лимиты и защита от перебора

Несанкционированный доступ к API бывает трёх видов: вошёл не тот, вошёл нужный, но видит чужое, и подбирают пароли и номера, пока не повезёт. Защита строится по слоям: проверка того, кто пришёл, проверка прав на каждый объект, ограничение частоты запросов и журнал, по которому перебор заметен. Мы проверяем и усиливаем существующий API или закладываем эти слои в новый. Работаем на уровне кода и конфигурации: это не пентест боевой системы и не защита от DDoS.

Обследование защиты API — от 200 000 ₽, 2–3 неделиПрава проверяются из-под каждой роли на чужих объектахЛимиты и журнал настраиваются под ваш трафик, а не по шаблону

С чем приходят

Когда защиту API пора проверять

API открыли наружу

Раньше им пользовались только своё приложение и кабинет, теперь к нему подключают партнёров и клиентов. Защита, рассчитанная на доверенную сеть, перестала подходить.

Ключи выданы и забыты

Партнёрские ключи не имеют срока жизни, один ключ используют несколько систем, и никто не помнит, у кого какой. При утечке нечего отозвать, не сломав остальных.

В журнале странные запросы

Много неудачных входов за ночь, перебор номеров заказов, одинаковые запросы с разных адресов. Нужно понять, что это было и что закрыть.

Клиент спрашивает про лимиты и права

В опроснике безопасности вопросы про ограничение попыток, срок токенов и разделение данных клиентов. Ответить хочется документом, а не словами.

Откуда приходят

Четыре источника нежелательного доступа и чем закрывается каждый

Источник определяет меры. Об устройстве самого API, версиях и ошибках см. статью «Проектирование API для интеграций».

Источник
Пример
Где ломается
Чем закрываем
ИсточникАноним из интернетаперебор
ПримерПодбор паролей и кодов, перебор номеров заказов и документов
Где ломаетсяНет ограничения попыток, ответы различаются для существующего и несуществующего адреса, номера идут подряд
Чем закрываемЛимиты по учётной записи и адресу, одинаковые ответы, журнал неудачных попыток
ИсточникВошедший пользовательчужие данные
ПримерКлиент меняет номер в запросе и получает чужой объект или лишние поля
Где ломаетсяПрава проверены на уровне метода, а не объекта; ответ отдаёт объект целиком
Чем закрываемПроверка владельца в каждом обработчике, явный список полей, прогон двумя учётными записями
ИсточникИнтеграция или партнёрутёкший ключ
ПримерКлюч попал в репозиторий, письмо или чат партнёра
Где ломаетсяКлюч без срока, права шире нужных, один ключ на несколько систем
Чем закрываемОтдельный ключ на систему, минимальные права, срок и отзыв без остановки остальных
ИсточникВнутренний сервисдоверие по сети
ПримерСервис внутри сети вызывает другой без проверки
Где ломаетсяПредполагается, что в сети чужих нет, а один взломанный сервис открывает все
Чем закрываемПодпись или взаимный сертификат между сервисами, права на уровне вызова
Вход

Способ входа в API: ключ, токен, подпись или сертификат

Способ зависит от того, кто вызывает API. В одном сервисе обычно два-три.

Способ
Кому подходит
Что учесть
Как закрываем риск
СпособAPI-ключпростая выдача
Кому подходитСерверные интеграции партнёров
Что учестьКлюч — это пароль, который не меняют годами; в браузере и в мобильном клиенте его хранить нельзя
Как закрываем рискХранить только хеш, показывать при создании один раз, ограничить срок, адреса и права
СпособКороткий токен доступаOAuth 2.0 и OpenID Connect
Кому подходитПриложения пользователей, кабинеты, единый вход
Что учестьНужен сервер выдачи токенов и порядок обновления; токен, украденный за время жизни, работает
Как закрываем рискКороткий срок, обновление по отдельному токену, отзыв при смене пароля и увольнении
СпособПодпись запросаHMAC
Кому подходитВебхуки и обмен с партнёром, где нужна целостность
Что учестьОбщий секрет у обеих сторон; повторная отправка перехваченного запроса
Как закрываем рискПодпись вместе со временем и одноразовым номером запроса, окно приёма ограничено
СпособВзаимный сертификатmTLS
Кому подходитСервис — сервис, закрытые партнёры
Что учестьНужны выпуск, срок и отзыв сертификатов, мониторинг истечения
Как закрываем рискСвой удостоверяющий центр или сервис выпуска, оповещение об истечении
Права

Права на уровне объекта: где чаще всего утекают данные

Вход отвечает на вопрос «кто это», права — на вопрос «что ему можно». Ошибки второго рода обходятся дороже.

Три уровня проверки

  • Метод. Может ли эта роль вообще вызвать этот метод. Её проверяют почти всегда.
  • Объект. Может ли она открыть именно этот заказ, документ или контрагента. Здесь чаще всего ошибаются: объект берут по номеру из запроса, а принадлежность организации не проверяют.
  • Поле. Какие поля видны и какие можно менять. Партнёр видит свою цену, но не себестоимость; пользователь не должен передавать в запросе поле «роль» или «скидка» и получать запись.

Номера, которые не должны угадываться, не заменяют проверку

Случайные идентификаторы вместо последовательных номеров затрудняют перебор, но не защищают: ссылка, которую кто-то переслал, тоже откроет объект, если владелец не проверяется. Правило одно: сервер сверяет объект с пользователем на каждый запрос, как бы выглядел номер.

Как мы это проверяем

Берём две учётные записи в разных организациях с одной ролью и пробуем из-под каждой обратиться к объектам другой: читать, менять, удалять, скачивать файл. Затем так же из-под разных ролей одной организации. Результат записывается в матрицу «роль — метод — объект — результат», и она остаётся у вас как набор тестов. Код обработчиков читаем отдельно, подход описан на странице Secure code review.

Лимиты

Rate limiting: что ограничиваем и по какому признаку

Ограничение частоты защищает от перебора и случайной перегрузки отдельным клиентом. От распределённой атаки на отказ в обслуживании оно не защищает, для этого нужны провайдер или сеть доставки.

Что ограничиваем
Риск при ошибке
Как ограничиваем
Что делаем при превышении
Что ограничиваемВход по паролюучётная запись и адрес
Риск при ошибкеТолько по адресу: перебор с множества адресов проходит. Только по записи: злоумышленник блокирует чужую учётную запись
Как ограничиваемОдно ограничение по записи, другое по адресу
Что делаем при превышенииНарастающая пауза, оповещение владельца, второй фактор
Что ограничиваемКоды и восстановление доступаучётная запись и канал
Риск при ошибкеКороткий код подбирается за разумное число попыток; письмо для восстановления можно использовать как рассылку
Как ограничиваемОграничение попыток и числа отправок
Что делаем при превышенииКод сгорает после нескольких неудач, новый запрос ограничен по времени
Что ограничиваемОбычные запросыключ или токен
Риск при ошибкеОдин клиент занимает весь сервис
Как ограничиваемКвота на минуту с запасом на всплески
Что делаем при превышенииОтвет с кодом превышения и временем повтора
Что ограничиваемДорогие операцииключ и метод
Риск при ошибкеВыгрузки, поиск и отчёты нагружают базу сильнее остальных
Как ограничиваемОтдельная, более строгая квота
Что делаем при превышенииОчередь вместо немедленного ответа
Что ограничиваемПеребор номеровчисло отказов подряд
Риск при ошибкеПодряд идущие запросы к несуществующим объектам остаются незамеченными
Как ограничиваемСчётчик ответов «не найдено» и «нет доступа»
Что делаем при превышенииВременная блокировка ключа и запись в журнал
Перебор

Защита от перебора паролей: порядок мер

Подбор паролей идёт двумя способами. Первый — перебор по словарю для одной записи, его видно по лимитам. Второй — проверка пар «адрес — пароль», утёкших с чужих сервисов: на каждую запись приходит по одной-две попытки с разных адресов, и простой лимит по адресу ничего не показывает. Защита строится в таком порядке:

  1. Одинаковый ответ. Вход, восстановление и регистрация не должны сообщать, существует ли такая запись.
  2. Лимиты по записи и по адресу. Нарастающая задержка, а не вечная блокировка: блокировка по записи позволяет вывести из строя чужую учётную запись.
  3. Хранение паролей. Специальный медленный алгоритм с солью, а не быстрый хеш. При утечке базы это замедляет подбор.
  4. Проверка пароля при установке. Отказ для слишком простых и известных по утечкам вариантов.
  5. Второй фактор для ролей с доступом к деньгам и персональным данным. Выбор способа разобран в статье «SSO и MFA: что выбрать», вход сотрудников и единый вход — на странице SSO и MFA для корпоративных систем.
  6. Оповещение. Всплеск неудачных входов по одной записи или с одного адреса доходит до человека, который может отреагировать.
Журнал

Что должно быть в журнале, чтобы нападение было видно

Журнал, в который пишется всё подряд, не читает никто. Для защиты API нужны события с понятным составом: кто (учётная запись или ключ), откуда, что запросил, какой был ответ. Их набор небольшой:

  • успешные и неудачные входы, смена пароля, выдача и отзыв ключей;
  • отказы в доступе («нет прав», «не найдено» на чужой объект), особенно серии подряд;
  • превышения лимитов;
  • смена ролей и прав и массовые выгрузки.

Пароли, токены и ключи в журнал не попадают, даже в сообщениях об ошибках. Мы настраиваем отправку событий в то, чем вы пользуетесь для мониторинга, и 2–3 оповещения на серии отказов и неудачных входов. Систем обнаружения вторжений, SIEM и дежурства мы не предоставляем: события должны дойти до вашего человека.

Что делаем

Из чего состоит работа и сколько она стоит

Цены совпадают с тарифами. Цена обследования фиксируется до начала, остановиться можно после любой ступени.

Обследование защиты одного API

Карта методов и ролей, проверка входа, прав и лимитов, чтение кода обработчиков, матрица «роль — метод — объект», вилка бюджета на исправление.

200 000 ₽ · 2–3 недели

Обследование нескольких API и обмена

Плюс границы между сервисами, ключи партнёров и вебхуки, схема выдачи и отзыва доступа.

350 000 ₽ · 3–4 недели

Закрытие дыр: лёгкий пилот

Один набор мер: лимиты, срок и отзыв ключей, проверка владельца в самых рискованных методах, журнал и оповещения.

150 000–400 000 ₽ · 2–8 недель

Перестройка модели доступа: тяжёлый пилот

Сервер выдачи токенов, права на уровне объекта и поля в нескольких сервисах, подпись между сервисами.

400 000–1 200 000 ₽ · 2–3 месяца

Сопровождение

Проверка прав перед релизами, разбор срабатываний лимитов, ротация ключей. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

Неделя 1 — Инвентаризация

Список методов, ролей, ключей и потребителей. Выясняем, кто чем пользуется, какие ключи живы, где доступ шире нужного.

Недели 1–3 — Проверка

Прогон прав двумя учётными записями, чтение кода обработчиков, проверка входа и восстановления, оценка лимитов на копии. Боевую систему не трогаем.

Конец обследования — Отчёт и порядок

Находки с местом в коде, сценарием, правкой и серьёзностью. Порядок исправления: что закрыть до следующего релиза, что запланировать.

Исправление — Этапы с приёмкой

Лимиты, ключи, права, журнал. Каждая мера с тестом в вашем репозитории, который остаётся у вас.

После — Проверка и сопровождение

Повторный прогон прав и ключей. Дальше разовые проверки перед релизами или пакет часов.

Цена

Что двигает цену внутри вилки

Число методов, ролей и потребителей

Работа растёт по числу сочетаний «роль — метод — объект», а не по числу методов. Пять ролей с правами на уровне договоров требуют иного объёма, чем две.

Состояние ключей и входа

Если ключи выданы без срока и учёта, сначала нужна инвентаризация. Если вход встроен в каждый сервис отдельно, работа включает вынесение его в одно место.

Доступность людей и стенда

Копия для прогона прав и разработчик, который объяснит, зачем в методе сделано именно так, экономят недели.

Закрытый контур

Сервер выдачи токенов, хранилище секретов и мониторинг в контуре без выхода наружу собираются из того, что разрешено, и требуют больше подготовки.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Исходный код в вашем репозитории с первого коммита.
  • Матрица «роль — метод — объект» и тесты на права, которые мы написали.
  • Настройки лимитов и описание, как их менять.
  • Порядок выдачи, ротации и отзыва ключей в виде инструкции.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не атакуем боевые системы и не проводим пентест. Лицензии ФСТЭК у нас нет, аттестацию не проводим.
  • Не защищаем от DDoS и не предоставляем WAF, SIEM или обнаружение вторжений как услугу.
  • Не размещаем ваш API у себя и не держим ключи доступа к нему.
  • Не делаем мобильные приложения: серверную часть для них делаем, приложения нет.
  • Не обещаем, что взлом невозможен: мы снижаем вероятность типовых атак. Юридические вопросы по персональным данным решает ваш юрист.
  • Не берём работы дешевле 150 000 ₽ и не дежурим круглосуточно.
Граница

Защита API, единый вход, аудит и новый бэкенд: что выбрать

Если API нужно построить, а не защитить, начинайте с разработки API и бэкенда: защита закладывается в проект сразу. Если нужно, чтобы сотрудники входили во все системы одним входом и со вторым фактором, это SSO и MFA. Если вопрос шире API и касается всего приложения, нужен аудит безопасности веб-приложения, а если только код, то ревью кода. Защита от внедрения запросов и подмены содержимого страниц описана на странице о защите от SQL-инъекций и XSS. Порядок мер по шагам лежит в статье «Как защитить API от взлома».

Инструменты

На чём собираем

Вход и права
  • Keycloak или ваш сервер входа: OAuth 2.0, OpenID Connect
  • Права в коде сервиса и политики на уровне строк в PostgreSQL
  • Хеширование паролей Argon2 или bcrypt
  • Хранилище секретов: HashiCorp Vault или ваше
Лимиты и наблюдение
  • Nginx: ограничение частоты запросов и соединений
  • Redis для счётчиков в самом приложении
  • Журнал в ваш Grafana Loki, Elastic или другой стек
  • Docker, GitLab CI для тестов на права в сборке
Материалы

Материалы по теме

Статья

Как защитить API от взлома: вход, лимиты, перебор

Порядок мер по шагам: что проверять в первую очередь, какие лимиты вводить и как не пропустить чужие данные.

  • Вход и права
  • Лимиты
  • Перебор
Читать →
Статья

SSO и MFA: что выбрать для корпоративных систем

Как выбрать протокол входа, место хранения пользователей и второй фактор для разных групп.

  • Протоколы
  • Второй фактор
  • Что при сбое
Читать →
Статья

Проектирование API для интеграций: версии и ошибки

Как устроены ключи, права, вебхуки, версии и ограничение частоты в API для интеграций.

  • Ключи и права
  • Вебхуки
  • Версии
Читать →
Заявка

Расскажите, какой API нужно защитить

Сорок минут созвона: кто вызывает API, как сейчас выдаются доступы и что вас беспокоит. По итогам скажем, с чего начать и в какую вилку это укладывается.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: защита API

Сколько стоит защита API?

Обследование одного API — 200 000 ₽ и 2–3 недели, нескольких — 350 000 ₽ и 3–4 недели. Закрытие найденных дыр оценивается после отчёта: лёгкий пилот 150 000–400 000 ₽ за 2–8 недель, перестройка модели доступа 400 000–1 200 000 ₽ за 2–3 месяца. Обследование вычитается из первого этапа, если продолжаете с нами.

Что такое rate limiting и зачем он нужен?

Это ограничение числа запросов от одного клиента за время. Оно мешает подбору паролей и кодов, перебору номеров и перегрузке сервиса одним потребителем. Распределённую атаку на отказ в обслуживании оно не останавливает: от неё защищает провайдер или сеть доставки.

Достаточно ли ключа API для защиты?

Для серверной интеграции партнёра ключ допустим, если у него есть срок, ограничение прав и возможность отзыва без остановки остальных. Для приложений пользователей лучше короткоживущие токены, а ключ в браузере или мобильном клиенте хранить нельзя.

Как проверить, что клиент не видит чужие данные?

Нужны две учётные записи в разных организациях с одинаковой ролью и прогон всех методов с чужими идентификаторами: чтение, изменение, удаление, скачивание файла. Результат записывается в матрицу и превращается в автоматические тесты, которые запускаются при сборке.

Нужен ли доступ к боевой системе?

Нет. Прогон прав и проверки лимитов идут на копии или тестовом стенде с обезличенными данными, код читаем в вашем репозитории. Боевую систему мы не атакуем.

Вы защищаете от DDoS и ставите WAF?

Нет. Мы работаем на уровне кода и конфигурации приложения: вход, права, лимиты, журнал. Защита от распределённых атак и WAF как услуга в наш состав не входят.

Можно ли защитить существующий API, не переписывая его?

В большинстве случаев да: лимиты, срок и отзыв ключей, проверка владельца в обработчиках и журнал добавляются по частям. Если вход устроен отдельно в каждом сервисе, на обследовании оценим, дешевле выносить его в единое место или оставить как есть.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.