Blog 24/7

rate limiting

TAB. 1Hasłopo angielsku
Po angielskurate limiting
Którą formą pisaćpo angielsku Polski odpowiednik istnieje, ale w praktyce nikt tak nie pisze. Zostaw angielski, polski trzymaj jako synonim.
Inne formyograniczanie liczby żądań · ograniczanie częstotliwości żądań · limitowanie żądań
KategoriaSieć i infrastruktura obronna

Rate limiting to mechanizm ograniczający liczbę żądań, które jeden klient, konto albo adres IP może wysłać do usługi w określonym oknie czasu. Chroni przed nadużyciami, atakami siłowymi i przeciążeniem serwera. OWASP w zestawieniu API Security Top 10 z 2023 roku wymienia rate limiting wśród podstawowych środków przeciw nieograniczonemu zużyciu zasobów (kategoria API4:2023) [1]. Protokół HTTP ma dla tej sytuacji osobny kod odpowiedzi, 429 Too Many Requests [2].

Jak działa

Limiter liczy żądania według wybranego klucza i porównuje wynik z progiem. Kluczem bywa adres IP, identyfikator konta, token API albo cała usługa. RFC 6585 celowo nie określa, jak serwer ma rozpoznawać użytkowników i liczyć żądania: limit może obejmować pojedynczy zasób, cały serwer albo grupę serwerów, a użytkownika można wskazać po danych uwierzytelniających lub ciasteczku [2].

Gdy próg zostaje przekroczony, serwer odrzuca albo opóźnia kolejne żądania. Odpowiedź 429 oznacza według RFC 6585, że użytkownik wysłał zbyt wiele żądań w danym czasie [2]. Powinna zawierać wyjaśnienie i może zawierać nagłówek Retry-After, który mówi, po jakim czasie ponowić próbę [2]. Przebieg pokazuje schemat poniżej.

RYS. 1Żądanie przechodzi przez limiter

Popularną realizacją jest moduł limit_req serwera nginx. Ogranicza on tempo przetwarzania żądań dla zdefiniowanego klucza, najczęściej adresu IP, i korzysta z algorytmu „cieknącego wiadra” (leaky bucket) [4]. Parametr burst pozwala przyjąć określoną liczbę żądań ponad średnie tempo, a nadmiarowe żądania są domyślnie opóźniane [4]. Przykład z dokumentacji nginx ustala średnio jedno żądanie na sekundę z adresu:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

location /search/ {
    limit_req zone=one burst=5;
}

Odmiany

Limity różnią się kluczem, miejscem egzekwowania i reakcją na przekroczenie. Najważniejsze warianty zestawia tabela.

WariantCo jest liczoneUwagi
Na adres IPżądania z jednego adresu [4]tani, ale omijany przez rozproszone źródła [3]
Na kontopróby dla jednego loginu [3]chroni konkretne konto przed zgadywaniem
Na serwer lub usługęwszystkie żądania do zasobu [2]ogranicza łączne obciążenie
Na operacjęwywołania jednej funkcji API [1]np. wysyłka SMS, eksport, wyszukiwanie

Reakcja na przekroczenie też bywa różna. Dokumentacja nginx domyślnie zwraca kod 503, a inny kod ustawia dyrektywa limit_req_status [4]. CERT Polska wymienia jako reakcje narastające opóźnienia, blokadę czasową, dodatkową weryfikację albo CAPTCHA [3].

W WordPressie

Rdzeń WordPressa ma dwa punkty szczególnie narażone na masowe żądania. Dokumentacja wskazuje stronę logowania wp-login.php oraz plik xmlrpc.php, który opisuje jako częsty cel ataków siłowych (brute-force), zwłaszcza przez metodę system.multicall [5]. Metoda ta grupuje wiele wywołań w jednym żądaniu, więc limit liczący wyłącznie żądania HTTP jej nie obejmie. OWASP opisuje ten sam problem ogólnie jako brak limitu liczby operacji w pojedynczym żądaniu klienta [1]. Więcej o interfejsie w haśle XML-RPC. Kolejnym miejscem są punkty końcowe REST API; zob. niezabezpieczony endpoint REST API.

Dokumentacja WordPressa zauważa, że nawet nieudany atak siłowy może przeciążyć stronę samą liczbą żądań [5]. Dlatego ważne jest, na której warstwie działa limit. Wtyczki ograniczające logowanie działają wewnątrz PHP i przy silnym ataku same zużywają zasoby [5]. Limity na poziomie serwera, na przykład limit_req_zone w nginx, przykładowo z tempem rate=10r/m dla logowania, odcinają ruch wcześniej [5]. Najwcześniej działa zarządzany WAF na brzegu sieci: ruch jest blokowany, zanim dotrze do serwera [5]. Dokumentacja wymienia też fail2ban, który po analizie logów czasowo blokuje nadużywające adresy [5].

Na poziomie aplikacji rate limiting ma zwykle postać limitu prób logowania, który liczy nieudane próby dla konta i adresu.

Zagrożenia i skutki

Brak limitu jest znaną słabością. MITRE opisuje ją jako CWE-307: produkt nie stosuje wystarczających środków przeciw wielu nieudanym próbom uwierzytelnienia w krótkim czasie [6]. Jako przykład podaje CVE-2019-0039, w którym REST API miało wysokie limity połączeń, co umożliwiało zgadywanie haseł [6].

Bez ograniczeń łatwiejsze są:

OWASP zwraca uwagę, że nadmierne zużycie zasobów prowadzi do odmowy usługi, ale też do wzrostu kosztów infrastruktury, na przykład mocy obliczeniowej i przestrzeni w chmurze [1]. Wśród limitów, których brak czyni API podatnym, wymienia między innymi czas wykonania, pamięć, rozmiar przesyłanych plików, liczbę operacji w jednym żądaniu i limit wydatków u zewnętrznych dostawców usług [1].

Jak się bronić

CERT Polska zaleca liczyć próby uwierzytelnienia jednocześnie dla konta i dla źródła żądania oraz nie opierać limitów wyłącznie na adresie IP [3]. Limity trzeba egzekwować po stronie serwera, spójnie we wszystkich instancjach aplikacji [3]. Powinny obejmować wszystkie etapy uwierzytelniania, także resetowanie hasła i weryfikację kodów MFA [3].

  • Ustal progi według potrzeb biznesowych, osobno dla kosztownych operacji [1].
  • Odrzucaj nadmiar kodem 429 z nagłówkiem Retry-After, żeby uczciwi klienci wiedzieli, kiedy wrócić [2].
  • Umieszczaj limit jak najbliżej brzegu: w CDN lub reverse proxy, a dopiero potem w aplikacji [5].
  • Łącz rate limiting z innymi mechanizmami; sam nie zatrzyma rozproszonego ataku DDoS z tysięcy adresów.

MITRE jako środki przeciw CWE-307 wymienia rozłączanie po określonej liczbie nieudanych prób, przerwy czasowe, blokadę atakowanego konta i wymaganie od klienta zadania obliczeniowego [6].

TAB. 2

Przypisy

6
  1. [1] API4:2023 Unrestricted Resource Consumption — OWASP API Security Top 10 · OWASP
  2. [2] RFC 6585: Additional HTTP Status Codes · IETF
  3. [3] Brute force — Baza wiedzy CERT Polska · CERT Polska
  4. [4] Module ngx_http_limit_req_module · nginx
  5. [5] Brute Force Attacks — Advanced Administration Handbook · WordPress.org
  6. [6] CWE-307: Improper Restriction of Excessive Authentication Attempts · MITRE
TAB. 3

Hasła w tym artykule

16
TAB. 4

Linkują tutaj

25

Wszystkie kategorie → · Hasło w słowniku →

Blog 24/7
05.11CISA i FBI wzywają do zabezpieczenia sterowników chłodzenia po atakach w Europietherecord.media05.11Midnight Blizzard atakowała iPhone'y i Androidy przez zainfekowane strony w Europie i USAsecurityweek.com05.11APT29 kradła dane z iPhone'ów i Androidów przez przejęte i podrobione stronytherecord.media05.11Grupa APT29 przejęła skrypt Plerdy i atakowała niezałatane iPhone'y i Androidythehackernews.com05.11Microsoft wykrył 7,3 mld wiadomości phishingowych w III kwartale 2026microsoft.com05.11DigiCert ujawnia wyciek danych klientów i skanów dokumentów tożsamościbleepingcomputer.com05.11CWPdoor podmienia serwer cwpsrv w Control Web Panel i otwiera tylne wejście do Linuksableepingcomputer.com05.11Brytyjskie NCSC ostrzega, że narzędzia AI zwiększyły liczbę wykrywanych luk zero-daythehackernews.com05.11Skaner RootEvidence sprawdza starą lukę w Cisco IOS i dodaje nagłówki Opt-Outisc.sans.edu05.11Włamanie do portalu grantowego Norad, zagrożone dane 20 614 użytkownikówhelpnetsecurity.com