Poplava skrapera na Cloudflare Free planu: šta ju je zaustavilo i šta smo ostavili isključeno
Operacije
Jednog jutra jedna od naših stranica sa oglasima prestala je da se otvara. Cloudflare je posetiocima prikazivao grešku 524, origin serveru je trebalo od dva do šest minuta po stranici, a ništa nas nije upozoravalo oko deset sati. Uzrok je bio skreper koji je prolazio kroz rezidencijalne proksi servere brzinom od oko 225 zahteva u sekundi.
Oblik poplave
- Hiljade adresa, po jedan do tri zahteva sa svake. Kućne širokopojasne veze u SAD, Španiji, Francuskoj, Brazilu, Velikoj Britaniji i drugde, onakav saobraćaj kakav izdaje mreža rezidencijalnih proksi servera.
- Chrome korisnički agenti na Mac-u, sa brojevima verzija od 103 do 151.
- Skoro nikada kolačić ili Referer. Od 2.697 zahteva koje smo uzorkovali na serveru, 4 su sadržala kolačić, a 4 Referer.
- Dve vrste klijenata. Oko polovina nije slala
Sec-Fetch-*zaglavlja niti informacije o klijentu: skripta sa kopiranom stringom korisničkog agenta. Druga polovina je slala puna zaglavlja pregledača: headless pregledač.
Svaka stranica je bila renderovana za svaki zahtev, pa je svaki radni proces (worker) stavio u red čekanja stotine renderovanja i udario u CPU limit.
Zašto ograničenja po adresi nisu pomogla
Ograničenje brzine (rate limit) broji zahteve po adresi. Sa jednim do tri zahteva sa svake od hiljada adresa, nijedna pojedinačna adresa se nikada ne približava limitu. Blokiranje država bi blokiralo naše posetioce. Ono što skreper nije mogao jeftino da simulira bilo je ponašanje kao pregledač koji je već bio na sajtu.
Na Cloudflare ivici: tri besplatna pravila
Free plan dozvoljava pet prilagođenih WAF pravila po zoni. Iskoristili smo tri, sva sa upravljanom proverom (managed challenge) umesto blokiranja, tako da osoba uhvaćena greškom može da klikne i prođe:
- Falsifikovani pregledač: GET čiji korisnički agent sadrži
Chrome/i koji nemaSec-Fetch-Modezaglavlje. Svaki Chrome od 2019. ga šalje. - Skreper oblaci: zahtev za stranicu sa mreža Alibaba, Tencent i Huawei Cloud, odakle je došlo mnogo onoga što smo izazvali.
- Vanredno, podrazumevano isključeno: GET bez ijednog kolačića i bez Referer-a. Osoba koja je bila na sajtu ili koja dolazi preko linka prolazi neometano; skreper koji ne čuva kolačiće nailazi na proveru pri svakom zahtevu. Uključujemo ga samo tokom poplave, jer izaziva i nekoga ko ukuca adresu u svež pregledač.
Sve tri propuštaju Cloudflare-ove verifikovane botove, korisničke agense koji se sami predstavljaju kao roboti, naše adrese, API i webhook putanje, kao i fajlove koji nisu stranice. Dva dana kasnije poplava je i dalje trajala: u jednom satu pravilo za lažne pretraživače je izazvalo više od 10.000 zahteva. 10.000 događaja koje Cloudflare vraća po upitu dolazilo je sa 9.627 adresa, nijedna od njih nije imala više od 4.
Na izvoru: kapija u aplikaciji
Headless deo ima pune zaglavlja pretraživača, pa ga pravila na ivici ne hvataju dok je hitno pravilo isključeno. U samoj aplikaciji smo postavili mali middleware ispred renderera stranica:
- Chrome korisnički agent bez
Sec-Fetch-Modezaglavlja niti korisničkih podataka dobija 403 pre bilo kakvog rada; - stranac, bez naših kolačića i bez Referer zaglavlja, dobija sadržaj samo dok radnik ima slobodnog kapaciteta, nekoliko stranica u sekundi. Preko toga, 400-bajtna 503 stranica postavlja kolačić i ponovo se učitava nakon dve sekunde. Čovek dobija stranicu iz drugog pokušaja; scraper koji ne čuva kolačiće nikada ne dobija.
U prvoj minuti kapija je odbila oko 6.700 lažnih pretraživača i odbila oko 6.700 stranaca, dok je strancima servirala oko 9 stranica u sekundi. Spori zahtevi su pali na nulu, CPU radnika je pao sa svog limita na 12 do 15 procenata, a njihova memorija sa 4 do 5 GB po radniku na 0,65 GB.
Šta smo ostavili isključenim
- Bot Fight Mode. On izaziva automatizovani saobraćaj i ne može se zaobići prilagođenim pravilom na Free planu, a uhvatio je webhook-ove našeg provajdera plaćanja.
- Under Attack mode za celu zonu. On svaki posetilac, API klijent i webhook prolazi kroz intersticijalnu stranicu. Hitno pravilo obavlja isti posao samo za zahteve stranaca za stranicama.
- Pravilo za ograničavanje stope sa Free plana. Ono broji po adresi, što ova poplava nikada ne aktivira.
- Blokiranje AI crawlera. Želimo da nas AI pretraživači pronađu, a ti crawleri nisu bili problem.
Zaključak
Poplavu kroz rezidencijalne proksi servere lako je uočiti po tome čega joj nedostaje: browser fetch zaglavlja, kolačići i Referer zaglavlja. Izazovite to na ivici, držite strance u okvirima onoga što vaši radnici mogu da renderuju i pobrinite se da nešto van servera primeti kada stranica prestane da se otvara. Night Watch pakuje sve tri stvari: nadzor, pravila sa automatskim prebacivanjem za hitno pravilo i kapiju za Python web aplikacije.