Доступность и злоупотребления
Приложение, которое тривиально положить, или которое позволяет одному вызывающему раздуть твой счёт, имеет проблему безопасности, даже если данные не утекают. Речь о том, чтобы ограничить, что один клиент может потребить.
Чек-лист
- Ограничивай частоту каждого эндпоинта, а не только входа. Лимитируй, как часто и сколько вызовов каждый клиент (по IP, по аккаунту, по ключу) может сделать. Неограниченное потребление ресурсов - это отдельный риск OWASP API. Возвращай 429 при превышении.
- Ограничивай дорогие операции жёстче. Всё, что запускает вызов модели, письмо, конвертацию файла, отчёт или сканирование базы, заслуживает более строгого лимита, потому что каждый вызов стоит реальных денег или CPU.
- Ограничивай пагинацию. Эндпоинт списка должен ограничивать количество записей на страницу.
?limit=1000000нужно обрезать, а не выполнять. - Ограничивай размер загрузок и тел до парсинга, а также число одновременных загрузок или задач, которые пользователь может запустить.
- Задавай таймауты и лимиты параллелизма на исходящие вызовы и на обработку запросов, чтобы один медленный сервис не исчерпал воркеры.
- Ставь CDN или WAF перед приложением для защиты от DDoS. Сервис вроде Cloudflare поглощает объёмные флуды и позволяет ограничивать частоту и фильтровать по геолокации на границе, до того как трафик дойдёт до origin. Убедись, что origin нельзя достать напрямую, в обход границы (см. инфраструктуру).
- Отказывай быстро и закрыто. Когда лимит достигнут или сервис недоступен, быстро отклоняй запрос с понятным статусом, а не ставь в очередь работу, которая копится.
- Следи за стоимостью автомасштабирования. Атаки на исчерпание ресурсов часто проявляются сначала в счёте за облако, а не в простое. Настрой оповещения о необычных расходах и объёме запросов.
Как тестировать
- Отправь пачку запросов на каждый эндпоинт и убедись, что получаешь 429.
- Запроси огромный размер страницы и огромную загрузку и убедись, что оба обрезаются.
- Убедись, что твой origin IP не отвечает на трафик приложения напрямую, а только через границу.