Mały sklep, serwer od miesięcy na 100 procentach i dziesiątki tysięcy odwiedzających na godzinę, którzy nie byli klientami

Sklep na WooCommerce z 52 produktami ładował się bardzo długo albo wcale. Przyczyną była opłacana sieć botów, która wysyłała dziesiątki tysięcy żądań na godzinę, każde z innego domowego adresu, a każdy bot z osobna zachowywał się wzorowo. Nasi inżynierowie zatrzymali ten ruch na brzegu sieci, a gdy miesiąc później boty zmieniły taktykę, druga reguła zdjęła obciążenie w dwie minuty.

  • CPU sklepu z 926 % na 16 %
  • 57 622 różnych adresów w jedną godzinę
  • Żaden klient niczego nie zauważył
Pole wielu małych kropek oznacza adresy; trzy tory z niego kończą się na pomarańczowym murze z podpisem WAF, a jeden tor od laptopa przechodzi przez przerwę w murze do witryny sklepu

Mały sklep internetowy z odzieżą roboczą na WooCommerce, 52 produkty, przejęty od poprzedniego wykonawcy

Wyzwanie

Według właściciela problem trwał od miesięcy, zanim sklep trafił do nas: serwer stale na 100 procentach, strony ładujące się bardzo długo i okresowe błędy, bo serwer nie odpowiadał na czas. Standardowe środki były próbowane i niczego nie zmieniły.

Godzina logów opowiedziała całą historię. Ze 172 057 żądań 68 110 szło na jeden adres kategorii z parametrami filtrów, w 68 238 różnych kombinacjach koloru i rozmiaru. Pochodziły z 57 622 różnych adresów, z których większość wysłała od jednego do pięciu żądań: domowe łącza internetowe w wielu krajach, prowadzone przez komercyjną sieć proxy rezydencjalnych. Podpis przeglądarki był podrobiony, a szacowany transfer około 90 GB na dobę oznaczał, że ktoś za tę operację płaci.

Rozwiązanie

Najpierw pomiar: ile serwer płaci za jedno żądanie każdego rodzaju. Plik statyczny 0,65 milisekundy, dowolne żądanie do WordPressa 90 do 120 milisekund, przefiltrowana lista produktów 257 milisekund. Pliki statyczne były większością żądań i 0,4 procent kosztu; żądania z filtrami były całym obciążeniem.

Potem reguła na brzegu sieci: zapora przed sklepem odrzuca ruch botów w najwcześniejszej fazie, zanim żądanie dotrze do WordPressa. Odrzucenie żądania kosztuje około milisekundy, wyrenderowanie listy 257. Rozpoznajemy ten ruch po tym, jak porusza się po sklepie, a nie po tym, skąd przychodzi. Gdy miesiąc później boty się dostosowały, druga reguła, oparta na zachowaniu nawigacyjnym prawdziwej przeglądarki, działała kilka minut po diagnozie. Każdą zmianę sprawdziliśmy pod kątem prawdziwych klientów: filtrowanie, wyszukiwarka, koszyk, zamówienie i wejścia z wyszukiwarek działają jak wcześniej.

Wyniki

Serwer sklepu
Z 926 % na 16 % CPU po pierwszej regule
Serwer sklepu po adaptacji botów
Z 905 % na 1 % w dwie minuty po drugiej regule
Serwer bazy danych
Ze 123 % na 0,01 % CPU
Żądania z filtrami docierające do sklepu
Z 68 110 na godzinę do kilkuset, wszystkie od ludzi
Żądania odrzucone na brzegu
Około 90 na sekundę
Zmiany, które zauważyli klienci
Żadnych: filtry, wyszukiwarka, koszyk i wejścia z wyszukiwarek bez zmian

Jak pracowaliśmy

  1. Pomiar zamiast zgadywania

    Logi z produkcji z jednej godziny, rozbite według rodzaju żądania i adresu, oraz koszt procesora każdego rodzaju żądania zmierzony osobno.

  2. Prawdziwa przyczyna

    Nie zdjęcia, nie kod, nie klienci: 68 110 żądań z filtrami na godzinę z 57 622 adresów, każdy z osobna grzeczny.

  3. Reguła na brzegu sieci

    Zapora przed sklepem odrzuca ruch botów w najwcześniejszej fazie, zanim dotrze do WordPressa. CPU sklepu spadło z 926 procent do 16.

  4. Progi z danych

    Klienci i boty wyraźnie różnią się tym, jak używają filtrów; reguła jest ustawiona tak, żeby żaden klient nie mógł w nią wpaść.

  5. Druga warstwa, gdy boty się dostosowały

    Miesiąc później ruch wrócił tuż pod progiem pierwszej reguły i przeniósł się na inne strony. Reguła oparta na zachowaniu nawigacyjnym prawdziwej przeglądarki zdjęła obciążenie w dwie minuty.

  6. Skutki uboczne sprawdzone

    Filtrowanie, wyszukiwarka, koszyk, zamówienie i wejścia z wyszukiwarek były testowane po każdej zmianie, a operator ma na piśmie, co robią reguły.

Wyzwania, które pokonaliśmy

Większość tego, co wyglądało na zabezpieczenie albo rozwiązanie, w tym przypadku nie działała.

Zdjęcia nie były problemem, choć było ich najwięcej

Najwięcej żądań dotyczyło plików statycznych, więc zdjęcia były oczywistym podejrzanym. Kosztowały 2 procent jednego rdzenia procesora. Całe obciążenie pochodziło z żądań do WordPressa, a każde z nich, nawet błąd 404 czy żądanie o robots.txt, uruchamia cały sklep z wtyczkami.

Cache by nie pomógł, a do tego i tak nie działał

Wtyczka cache była zainstalowana, a jej plik konfiguracyjny twierdził, że wszystko jest włączone. W praktyce nie działała: brakowało plików i ustawienia, bez których WordPress ją ignoruje. Ważniejsze: nawet działający cache niczego by nie zmienił. Cache przyspiesza powtarzające się adresy, a tu prawie każdy adres był inny.

Limity i automatyczne bany nie mogły zadziałać

Zapora ogranicza tempo żądań z jednego adresu i banuje adresy, które zbierają odpowiedzi z błędami. Oba mechanizmy patrzą na nadawcę. Bot wysyłał około trzech żądań na godzinę z jednego adresu, przy limicie dwóch na sekundę, i za każdym razem dostawał poprawną odpowiedź. W oczach zapory był wzorowym gościem. Żadna obrona oparta na adresie nadawcy nie mogła tu zadziałać.

Blokada po adresie strony nie widziała parametrów

Zapora potrafi blokować po wzorcu adresu. Okazało się, że dopasowuje wyłącznie ścieżkę, bez parametrów po znaku zapytania, a ruch botów różnił się właśnie parametrami. Taka reguła wygląda na zastosowaną i nic nie robi. Znaleźliśmy to w kodzie źródłowym zapory, zanim ktokolwiek na niej polegał.

Boty dostosowały się w ciągu miesiąca

Pierwsza reguła odrzucała ruch po kształcie adresu. Miesiąc później ruch wrócił: ten sam wolumen, prawie 30 000 adresów w dziesięć minut, dokładnie pod progiem reguły, i przeniesiony z kategorii na strony tagów produktów. Ktoś obserwował odpowiedzi i stroił atak. Jedna cecha nie wystarcza na długo; reguły muszą być trudne do obejścia, a nie tylko łapać dzisiejszy ruch.

Najlepsza cecha była w danych od początku

Druga reguła opiera się na zachowaniu, którego prawdziwa przeglądarka nie pomija, gdy klient klika filtr. Ta cecha była widoczna już w pierwszej godzinie logów, w 67 113 z 68 110 żądań. Za pierwszym razem wybraliśmy cechę najbardziej rzucającą się w oczy, a nie najtrudniejszą do podrobienia. Dziś obie warstwy działają razem.

Strona zbanowała samą siebie

WordPress uruchamia swoje zadania okresowe, wywołując własny publiczny adres. Podczas zalewu każde wejście bota uruchamiało te zadania, ponad 1 300 wywołań w dziesięć minut z adresu samego serwera. Zapora potraktowała to jak atak i zbanowała własny serwer strony na dobę. Wysyłka maili i zadania sklepu stanęły, a nasze testy z serwera dostawały odmowę, co przez chwilę wyglądało na fałszywy alarm nowej reguły.

Blokada botów nie może banować klientów

Odrzucone żądanie liczy się do automatycznego bana. Gdyby reguła była zbyt ostra, klient klikający „zaznacz wszystkie” w filtrze dostałby ban na dobę. Progi wzięliśmy z danych: klienci zaznaczali kilka wartości, boty znacznie więcej, a obie grupy się nie pokrywały.

U góry jeden dom z trzema krótkimi strzałkami i wskaźnik, którego wskazówka ledwo drgnęła; poniżej pole dwunastu domów, szeroka strzałka i wskaźnik z pomarańczową wskazówką na oporze

Przed i po

Pomiar Przed Po
CPU sklepu, pierwszy incydent 926 % (9,3 z 12 rdzeni) 16 %
Żądania z filtrami docierające do sklepu 68 110 na godzinę Około 360 na godzinę, od ludzi
CPU sklepu po adaptacji botów 905 % 1,1 %
CPU bazy danych 123 % 0,01 %
Żądania odrzucone na brzegu 0 Około 90 na sekundę
Czas od drugiej reguły do efektu Około 2 minut

Co z tego wynika

  • Najpierw pomiar, potem dotykanie czegokolwiek. Zdjęcia były większością ruchu i żadnym obciążeniem; cache był „włączony” i nic nie robił; limity działały i nie miały znaczenia.
  • Filtry to niemal nieskończona liczba adresów. Przy 36 kolorach i 11 rozmiarach nawigacja warstwowa wystawia więcej adresów, niż pomieści jakikolwiek cache. Warto oznaczyć je dla wyszukiwarek jako nieindeksowane i liczyć się z nadużyciem.
  • Limity po adresie nie chronią przed sieciami proxy rezydencjalnych. Każdy adres jest grzeczny; atakiem jest dopiero suma. Ruch trzeba rozpoznawać po tym, jak porusza się po sklepie.
  • Odrzucać na brzegu. Żądanie odrzucone przez zaporę kosztuje około milisekundy, wyrenderowana lista 257. Dlatego reguła działa, zanim WordPress w ogóle wystartuje.
  • Liczyć się z adaptacją. Operatorzy botów czytają odpowiedzi. Reguła musi być trudna do obejścia, a druga warstwa powinna być gotowa, zanim będzie potrzebna.

Dla właścicieli sklepów prosty test jest taki: jeśli serwer jest zawsze zajęty, a sprzedaż się nie zmieniła, warto sprawdzić, kto naprawdę odwiedza sklep.

Dwa tory, których długość oznacza koszt: górne żądanie kończy się po 1 ms na pomarańczowym murze z podpisem WAF, pod torem pomarańczowy krzyżyk; dolne mija przerywany mur i biegnie dalej aż do witryny sklepu, z podpisem 257 ms

Powiązane sytuacje

  • Google ostrzega przed Państwa stroną, odwiedzający trafiają na obce strony albo dostawca hostingu zablokował konto? Izolujemy stronę, zamykamy lukę i usuwamy złośliwy kod w ciągu 24 godzin od uzyskania dostępu, także w weekend. Potem otrzymują Państwo pisemny raport.

  • Państwa system działa, ale nikt nie zna go dokładnie. Spisujemy aplikację, bazę danych, serwer i pocztę, oceniamy ryzyka, na piśmie rekomendujemy dalszą drogę, a na życzenie przejmujemy utrzymanie systemu.

Inne projekty

  • Skala punktów z przerywanym progiem: koperta phishingu przechodzi pomarańczowym łukiem przez próg

    Filtr antyspamowy, który działał, ale nie chronił

    Usługi uruchomione, konfiguracja poprawna, w statusie systemu żadnych błędów. A mimo to phishing lądował w skrzynkach odbiorczych, a newslettery partnerów w folderze spam. Nasi inżynierowie zmierzyli, które mechanizmy wykrywania naprawdę działają, usunęli przyczyny, a trzy miesiące później znaleźli i naprawili regresję, którą było widać dopiero w ujęciu godzinowym.

  • Cztery koperty przechodzą przez bramki SPF, DKIM i DMARC, odhaczone na pomarańczowo, w drodze do skrzynki odbiorczej

    Dostarczalność poczty dla czterech domen firmowych

    Serwer pocztowy czterech domen firmowych niczego nie podpisywał, nie publikował polityki DMARC i był odrzucany przez Microsoft. Nasi inżynierowie sprawdzili go, przetestowali zmianę na jednej domenie i wdrożyli ją partiami. Efekt: wszystkie trzy mechanizmy przechodzą sprawdzenie w Gmailu, blokada Microsoftu została zdjęta, a użytkownicy niczego nie odczuli.

W 20 minut ustalimy, jaki pierwszy krok pasuje do Państwa systemu

Państwo opisują cel i obecny stan, my mówimy otwarcie, czy i jak możemy pomóc. Odpowiedź w ciągu jednego dnia roboczego, bez zobowiązań.

Telefon (niemiecki, polski, angielski) +48 501 250 220
E-mail E-mail

Dostępni: poniedziałek–piątek, 9:00–17:00 (czas środkowoeuropejski); wsparcie i awarie całą dobę (24/7)