Zalanie scraperem na darmowym planie Cloudflare: co je zatrzymało i co zostawiliśmy wyłączone

Operacje

Pewnego ranka nasza strona z opisami produktów przestała się otwierać. Cloudflare wyświetlał odwiedzającym błąd 524, serwer źródłowy potrzebował od dwóch do sześciu minut na stronę, a przez około dziesięć godzin nic nam tego nie zgłaszało. Przyczyną był scraper korzystający z proxy domowych przy około 225 żądaniach na sekundę.

Kształt zalewu

Każda strona była renderowana dla każdego żądania, więc każdy worker kolejkował setki renderów i uderzał w limit CPU.

Dlaczego limity na adres nie mogły pomóc

Limit częstotliwości liczy żądania na adres. Przy jednym do trzech żądań z każdego z tysięcy adresów żaden pojedynczy adres nigdy nie zbliża się do limitu. Blokowanie krajów zablokowałoby naszych odwiedzających. Tego, czego scraper nie mógł tanio podrobić, było zachowanie się jak przeglądarka, która już była na stronie.

Na krawędzi Cloudflare: trzy darmowe reguły

Plan darmowy pozwala na pięć własnych reguł WAF na strefę. Użyliśmy trzech, wszystkie z wyzwaniem zarządzanym zamiast blokady, więc osoba złapana przez pomyłkę może przejść dalej:

Wszystkie trzy przepuszczają zweryfikowane boty Cloudflare, user agenty, które same nazywają się robotami, nasze własne adresy, ścieżki API i webhooków oraz pliki, które nie są stronami. Dwa dni później fala wciąż trwała: w ciągu godziny reguła dla fałszywych przeglądarek rzuciła wyzwanie ponad 10 000 żądań. 10 000 zdarzeń zwracanych przez Cloudflare w jednym zapytaniu pochodziło z 9 627 adresów, z których żaden nie miał więcej niż 4.

Na serwerze źródłowym: bramka w aplikacji

Główna część ruchu pochodzi z przeglądarek bez interfejsu (headless) i ma pełne nagłówki przeglądarki, więc same reguły na krawędzi sieci nie przechwycą tego ruchu, gdy reguła awaryjna jest wyłączona. W samej aplikacji umieściliśmy małe oprogramowanie pośredniczące (middleware) przed renderowaniem strony:

W pierwszej minucie bramka odrzuciła około 6 700 fałszywych przeglądarek i odesłała około 6 700 nieznajomych, jednocześnie obsługując nieznajomych z prędkością około 9 stron na sekundę. Liczba wolnych żądań spadła do zera, zużycie CPU workerów spadło z limitu do 12–15 procent, a pamięci z 4–5 GB na każdy do 0,65 GB.

Co pozostawiliśmy wyłączone

Wniosek

Falę przez proxy mieszkaniowe łatwo rozpoznać po tym, czego brakuje: nagłówków fetch przeglądarki, plików cookie i nagłówków Referer. Rzuć jej wyzwanie na krawędzi sieci, utrzymaj nieznajomych w granicach tego, co twoje workerzy są w stanie wyrenderować, i upewnij się, że coś poza serwerem zauważy, gdy strona przestanie się otwierać. Night Watch pakuje wszystkie trzy elementy: watchdog, reguły z automatycznym przełącznikiem dla tej awaryjnej oraz bramkę dla aplikacji webowych w Pythonie.

Zaktualizowano: