Záplava scraperů na bezplatném tarifu Cloudflare: co ji zastavilo a co jsme nechali vypnuté
Provoz
Jednoho rána se náš web s výčty produktů přestal otevírat. Cloudflare návštěvníkům zobrazoval chybu 524, origin server potřeboval dvě až šest minut na načtení jedné stránky a asi deset hodin nám nic neřeklo. Příčinou byl scraper procházející rezidenčními proxy přibližně rychlostí 225 požadavků za sekundu.
Průběh záplavy
- Tisíce adres, jedna až tři požadavky z každé. Domácí širokopásmová připojení v USA, Španělsku, Francii, Brazílii, Velké Británii a jinde, tedy typ provozu, který pronajímají sítě rezidenčních proxy.
- Uživatelské agenty Chrome na Macu s čísly verzí od 103 do 151.
- Téměř nikdy žádný cookie ani Referer. Z 2 697 požadavků, které jsme na serveru vzorkovali, 4 nesly cookie a 4 Referer.
- Dva typy klientů. Přibližně polovina neposílala hlavičky
Sec-Fetch-*ani klientské hinty: šlo o skript s okopírovaným řetězcem uživatelského agenta. Druhá polovina posílala kompletní hlavičky prohlížeče: šlo o headless prohlížeč.
Každá stránka se vykreslovala pro každý požadavek, takže každý worker měl ve frontě stovky vykreslování a narážel na limit CPU.
Proč limity na adresu nepomohly
Omezení rychlosti počítá požadavky na adresu. Při jednom až třech požadavcích z každé z tisíců adres se žádná jednotlivá adresa k limitu ani nepřiblíží. Blokování zemí by zablokovalo naše návštěvníky. Co scraper nemohl levně zfalšovat, bylo chovat se jako prohlížeč, který už na webu byl.
Na okraji Cloudflare: tři bezplatná pravidla
Bezplatný tarif umožňuje pět vlastních pravidel WAF na zónu. Použili jsme tři, všechna s řízenou výzvou místo blokování, aby člověk, který je zachycen omylem, mohl projít kliknutím:
- Falešný prohlížeč: požadavek GET, jehož uživatelský agent obsahuje
Chrome/a který nemá hlavičkuSec-Fetch-Mode. Každý Chrome od roku 2019 ji posílá. - Scraper cloud: požadavek na stránku ze sítí Alibaba, Tencent a Huawei Cloud, odkud pocházela velká část toho, co jsme podrobili výzvě.
- Nouzové, ve výchozím stavu vypnuté: požadavek GET bez jakéhokoli cookie a bez Referer. Člověk, který už na webu byl, nebo který přichází přes odkaz, projde bez zásahu; scraper, který neuchovává cookies, narazí na výzvu při každém požadavku. Zapínáme ho pouze během záplavy, protože podrobuje výzvě i někoho, kdo zadá adresu do nově otevřeného prohlížeče.
Všechny tři propouštějí ověřené boty Cloudflare, user agenty, které se samy označují jako roboti, naše vlastní adresy, cesty k API a webhookům a soubory, které nejsou stránkami. O dva dny později záplava stále pokračovala: během jedné hodiny pravidlo pro falešné prohlížeče vyžádalo ověření u více než 10 000 požadavků. 10 000 událostí, které Cloudflare vrátí na jeden dotaz, pocházelo z 9 627 adres, žádná z nich neměla více než 4.
Na zdroji: brána v aplikaci
Headless polovina má úplné hlavičky prohlížeče, takže samotná pravidla na okraji ji nezachytí, když je nouzové pravidlo vypnuté. V samotné aplikaci jsme před vykreslování stránek umístili malý middleware:
- user agent Chrome bez
Sec-Fetch-Modeani bez klientských hintů dostane 403 dříve, než se začne pracovat; - cizí návštěvník, který nemá žádné naše cookies a žádný Referer, je obsluhován pouze tehdy, když má worker volnou kapacitu, a to několik stránek za sekundu. Nad tento limit se zobrazí 400bajtová stránka 503, která nastaví cookie a po dvou sekundách znovu načte stránku. Člověk stránku dostane na druhý pokus; scraper, který neuchovává cookies, nikdy.
Během první minuty brána odmítla přibližně 6 700 falešných prohlížečů a odmítla přibližně 6 700 cizích návštěvníků, přičemž cizím návštěvníkům obsloužila přibližně 9 stránek za sekundu. Pomalé požadavky klesly na nulu, CPU workerů kleslo z jejich limitu na 12 až 15 procent a jejich paměť z 4 až 5 GB na každého na 0,65 GB.
Co jsme nechali vypnuté
- Bot Fight Mode. Vyzývá k ověření automatizovaný provoz a na Free plánu jej nelze obejít vlastním pravidlem; zachytil také webhooky našeho platebního poskytovatele.
- Režim Under Attack pro celou zónu. Vystavuje každého návštěvníka, klienta API a webhook ověřovací stránce. Nouzové pravidlo dělá stejnou práci pouze pro požadavky cizích návštěvníků na stránky.
- Pravidlo pro omezení rychlosti na Free plánu. Počítá podle adresy, což tato záplava nikdy nespustí.
- Blokování AI crawlerů. Chceme, aby nás AI vyhledávací asistenti našli, a tito crawleři nebyli problémem.
Shrnutí
Záplavu přes rezidenční proxy je snadné poznat podle toho, co jí chybí: hlavičky fetch prohlížeče, cookies a Referery. Vyzvěte ji na okraji, udržujte cizí návštěvníky v rámci toho, co vaši workers dokážou vykreslit, a ujistěte se, že něco mimo server pozná, když se stránka přestane otevírat. Night Watch balíček obsahuje vše tři: hlídač, pravidla s automatickým přepínačem pro to nouzové a bránu pro webové aplikace v Pythonu.