Poplava scraperjev na brezplačnem načrtu Cloudflare: kaj jo je ustavilo in kaj smo pustili izklopljeno
Operacije
Nekega jutra se naša stran z oglasi ni več odpirala. Cloudflare je obiskovalcem prikazoval napako 524, izvirni strežnik je potreboval od dveh do šestih minut na stran, mi pa o tem nismo ničesar vedeli približno deset ur. Vzrok je bil scraper, ki je prek rezidenčnih proxy strežnikov pošiljal približno 225 zahtev na sekundo.
Oblika poplave
- Tisoči naslovov, ena do tri zahteve na naslov. Domače širokopasovne povezave v ZDA, Španiji, Franciji, Braziliji, Veliki Britaniji in drugod, torej vrsta prometa, ki ga izposojajo mreže rezidenčnih proxy strežnikov.
- Uporabniški posredniki Chrome na Macu, s številkami različic od 103 do 151.
- Skoraj nikoli piškotka ali glava Referer. Od 2.697 vzorčenih zahtev na strežniku so 4 vsebovale piškotek in 4 glavo Referer.
- Dve vrsti odjemalcev. Približno polovica ni pošiljala glav
Sec-Fetch-*niti namigov odjemalca: šlo je za skript s kopirano vrednostjo uporabniškega posrednika. Druga polovica je pošiljala polne glave brskalnika: šlo je za brezglavni brskalnik.
Vsaka stran je bila obdelana za vsako zahtevo, zato je vsak delavec čakal v vrsti na na stotine obdelav in dosegel svojo omejitev procesorja.
Zakaj omejitve na naslov niso pomagale
Omejitev hitrosti šteje zahteve na naslov. Ker je vsak od tisočih naslovov poslal le eno do tri zahteve, noben posamezen naslov ni nikoli približal omejitvi. Blokiranje držav bi blokiralo naše obiskovalce. Tega, kar scraper ni mogel poceni ponarediti, je bilo obnašanje, kot da gre za brskalnik, ki je že bil na strani.
Na robu Cloudflare: tri brezplačna pravila
Brezplačni načrt dovoljuje pet pravil po meri WAF na cono. Uporabili smo tri, vsa z upravljanjem izziva namesto blokade, da oseba, ki je po pomoti zajeta, klikne skozi:
- Lahni brskalnik: zahteva GET, katere uporabniški posrednik vsebuje
Chrome/in ki nima glaveSec-Fetch-Mode. Vsak Chrome od leta 2019 jo pošilja. - Mreže scraperjev: zahteva za stran iz omrežij Alibaba, Tencent in Huawei Cloud, kjer je prihajalo veliko tistega, kar smo izzvali.
- Izredno stanje, privzeto izklopljeno: zahteva GET brez kakršnega koli piškotka in brez glave Referer. Oseba, ki je že bila na strani, ali ki pride prek povezave, gre naprej nepreprečena; scraper, ki ne shranjuje piškotkov, naleti na izziv pri vsaki zahtevi. Vklopimo ga le med poplavo, ker izzove tudi nekoga, ki naslov vpiše v nov brskalnik.
Vsi trije prepuščajo preverjene bote storitve Cloudflare, uporabniške agentove, ki se predstavijo kot roboti, naše lastne naslove, poti API in webhook ter datoteke, ki niso strani. Dva dni pozneje je poplava še vedno trajala: v eni uri je pravilo za lažne brskalnike ovrednotilo več kot 10.000 zahtev. 10.000 dogodkov, ki jih Cloudflare vrne po poizvedbi, je prihajalo z 9.627 naslovov, noben z več kot 4.
Na izvornem strežniku: vrata v aplikaciji
Polovica brez glave ima polne glave brskalnika, zato robna pravila same ne ujamejo prometa, ko je nujno pravilo izklopljeno. V sami aplikaciji smo pred izrisovalnik strani postavili majhen vmesni sloj:
- uporabniški agent Chrome brez
Sec-Fetch-Modein brez namigov odjemalca prejme kodo 403, preden se opravi kakršnokoli delo; - neznancu, ki nima naših piškotkov in nima glave Referer, se postreže le, če ima delavec prosto zmogljivost, pri nekaj straneh na sekundo. Nad tem 400-bajtna stran s kodo 503 nastavi piškotek in ponovno naloži stran po dveh sekundah. Človek dobi stran ob drugem poskusu; strgalec, ki ne shranjuje piškotkov, je nikoli ne dobi.
V prvi minuti je vrata zavrnila približno 6.700 lažnih brskalnikov in odbila približno 6.700 neznancev, hkrati pa neznancem postregla s približno 9 stranmi na sekundo. Počasne zahteve so padle na nič, poraba CPE delavcev je padla z njihove omejitve na 12 do 15 odstotkov, pomnilnik pa z 4 do 5 GB na osebo na 0,65 GB.
Kaj smo pustili izklopljeno
- Bot Fight Mode. Ta ovrednoti avtomatizirani promet in ga na brezplačnem paketu ni mogoče preskočiti s pravilom po meri, ujel pa je webhook-e našega ponudnika plačil.
- Način Under Attack za celotno cono. Ta vsakega obiskovalca, odjemalca API in webhook pošlje skozi vmesno stran. Nujno pravilo opravi isto delo le za zahteve neznancev za strani.
- Pravilo za omejitev hitrosti na brezplačnem paketu. To šteje po naslovu, česar ta poplava nikoli ne sproži.
- Blokiranje AI strgalcev. Želimo, da nas najdejo AI iskalni pomočniki, in ti strgalci niso bili težava.
Ključna ugotovitev
Poplavo prek stanovanjskih proxy strežnikov je enostavno prepoznati po tem, česa manjka: glave fetch brskalnika, piškotki in glave Referer. To ovrednotite na robu, neznance obdržite znotraj zmogljivosti, ki jo lahko izrišejo vaši delavci, ter poskrbite, da nekaj zunaj strežnika opazi, ko se stran neha odpirati. Night Watch pakira vse tri: varuha, pravila s samodejnim preklopom za nujno pravilo in vrata za Python spletne aplikacije.