Dostępność i nadużycia
Aplikacja, którą można łatwo położyć, albo która pozwala jednemu wywołującemu napędzić Twój rachunek, ma problem z bezpieczeństwem, nawet jeśli żadne dane nie wyciekają. Chodzi o ograniczenie tego, ile zasobów może zużyć pojedynczy klient.
Lista kontrolna
- Ogranicz liczbę żądań dla każdego punktu końcowego, nie tylko logowania. Ustaw limit, jak często i ile wywołań każdy klient (według IP, konta lub klucza) może wykonać. Nieograniczone zużycie zasobów to osobne ryzyko OWASP API. Gdy limit zostanie przekroczony, zwracaj 429.
- Ograniczaj kosztowne operacje mocniej. Wszystko, co uruchamia wywołanie modelu, wysyłkę e-maila, konwersję pliku, raport lub skan bazy danych, zasługuje na ostrzejszy limit, bo każde wywołanie kosztuje realne pieniądze lub moc obliczeniową.
- Ogranicz paginację. Endpoint listy musi ograniczać liczbę rekordów zwracanych na stronę. Wartość
?limit=1000000powinna zostać przycięta, a nie zaakceptowana. - Ogranicz rozmiar przesyłanych plików i ciał żądań przed parsowaniem oraz liczbę równoległych przesłań lub zadań, które użytkownik może rozpocząć.
- Ustaw limity czasu i współbieżności dla wychodzących wywołań i obsługi żądań, aby jedna wolna zależność nie wyczerpała Twoich workerów.
- Ustaw CDN lub WAF przed aplikacją na potrzeby DDoS. Usługa taka jak Cloudflare absorbuje zalewy wolumetryczne i pozwala ograniczać liczbę żądań oraz filtrować ruch geograficznie na brzegu sieci, zanim dotrze on do Twojego origin. Upewnij się, że origin nie jest osiągalny bezpośrednio, z pominięciem brzegu (zob. infrastrukturę).
- Zamykaj się przy błędzie i działaj tanio. Gdy limit zostanie osiągnięty lub zależność nie działa, odrzucaj żądania szybko, z jasnym statusem, zamiast kolejkować pracę, która się piętrzy.
- Pilnuj kosztów autoskalowania. Ataki wyczerpujące zasoby często pierwsze objawiają się na rachunku za chmurę, a nie jako awaria. Ustaw alerty na nietypowe wydatki i wolumen żądań.
Jak testować
- Wyślij serię żądań do każdego punktu końcowego i potwierdź, że dostajesz 429.
- Zażądaj dużego rozmiaru strony i dużego przesłania pliku, i potwierdź, że oba zostały przycięte.
- Potwierdź, że adres IP Twojego origin nie odpowiada na ruch aplikacji bezpośrednio, tylko przez brzeg.