Scraperin tulva Cloudflaren ilmaisella tasolla: mikä sen pysäytti ja mitä jätimme päälle
Ylläpito
Eräänä aamuna yhden tuotesivustomme avautuminen lakkasi toimimasta. Cloudflare näytti vierailijoille virheen 524, palvelin käytti sivua kohden kaksi–kuusi minuuttia, eikä mikään kertonut meille asiasta noin kymmeneen tuntiin. Syynä oli scraper, joka kävi läpi asuntokohtaisia välityspalvelimia noin 225 pyynnön sekuntinopeudella.
Tulvan muoto
- Tuhansia osoitteita, yksi–kolme pyyntöä kullekin. Yhdysvaltojen, Espanjan, Ranskan, Brasilian, Ison-Britannian ja muiden maiden kotilaajakaistayhteyksiä, eli liikennettä, jota asuntokohtainen välityspalvelinverkko vuokraa.
- Chromen käyttäjäagentit Macilla, versionumerot 103–151.
- Lähes koskaan evästettä tai Referer-otsikkoa. Palvelimella tarkistamistamme 2 697 pyynnöstä 4:ssä oli eväste ja 4:ssä Referer.
- Kaksi asiakastyyppiä. Noin puolet lähetti pyynnöt ilman
Sec-Fetch-*-otsikoita ja ilman asiakasvihjeitä: skripti kopioidulla käyttäjäagenttimerkillä. Toiset puolet lähettivät täydet selainotsikot: headless-selain.
Jokainen sivu renderöitiin jokaiselle pyynnölle, joten kukin työntekijä joutui jonottamaan satoja renderöintejä ja ylitti CPU-rajan.
Miksi osoitekohtaiset rajoitukset eivät auttaneet
Nopeusrajoitus laskee pyynnöt osoitetta kohden. Kun tuhansista osoitteista tulee yksi–kolme pyyntöä kullekin, yksikään osoite ei koskaan lähesty rajaa. Maiden esto olisi estänyt myös kävijämme. Se, mitä scraper ei voinut halvalla väärentää, oli käyttäytyminen kuin selain, joka on käynyt sivustolla aiemmin.
Cloudflaren reunalla: kolme ilmaista sääntöä
Ilmainen taso sallii viisi WAF-mukautettua sääntöä vyöhykettä kohden. Käytimme kolmea, kaikki hallitun haasteen kanssa eston sijaan, joten vahingossa kiinni jäänyt henkilö klikkaa itsensä läpi:
- Väärennetty selain: GET-pyyntö, jonka käyttäjäagentissa on
Chrome/ja jossa ei oleSec-Fetch-Mode-otsikkoa. Kaikki Chromet lähettävät sen vuodesta 2019. - Scraper-pilvet: sivupyyntö Alibaba-, Tencent- ja Huawei Cloud -verkkojen alueelta, joista suurin osa haasteistamme tuli.
- Hätätila, oletuksena pois: GET-pyyntö ilman evästeitä ja ilman Refereriä. Henkilö, joka on käynyt sivustolla, tai joka saapuu linkin kautta, pääsee läpi koskemattomana; scraper, joka ei säilytä evästeitä, kohtaa haasteen jokaisella pyynnöllä. Laitamme tämän päälle vain tulvan aikana, koska se haastaa myös henkilön, joka kirjoittaa osoitteen uuteen selaimeen.
Kaikki kolme päästävät läpi Cloudflaren varmennetut botit, käyttäjäagentit, jotka nimeävät itsensä boteiksi, omat osoitteemme, API- ja webhook-polut sekä tiedostot, jotka eivät ole sivuja. Kaksi päivää myöhemmin tulva oli yhä käynnissä: tunnissa vale-selain -sääntö haastoi yli 10 000 pyyntöä. Cloudflaren palauttamat 10 000 tapahtumaa kyselyä kohden tulivat 9 627 osoitteesta, joista millään ei ollut enempää kuin 4.
Alkuperäisellä palvelimella: portti sovelluksessa
Headless-puolikas käyttää täydellisiä selaimen otsikoita, joten reunasäännöt eivät yksinään sieppaa sitä, kun hätäsääntö on pois päältä. Itse sovelluksessa laitoimme pienen väliohjelmiston sivun renderöijän eteen:
- Chrome-käyttäjäagentti, jolla ei ole
Sec-Fetch-Mode-otsikkoa eikä asiakasvihjeitä, saa 403-vastauksen ennen kuin työtä tehdään; - tuntematon, jolla ei ole meidän evästeitä eikä Referer-otsikkoa, saa palvelua vain niin kauan kuin työntekijällä on ylimääräistä kapasiteettia, muutaman sivun sekunnissa. Tämän ylittyessä 400 tavun 503-sivu asettaa evästeen ja latautuu uudelleen kahden sekunnin kuluttua. Ihminen saa sivun toisella yrityksellä; scraper, joka ei säilytä evästeitä, ei koskaan saa sitä.
Ensimmäisen minuutin aikana portti hylkäsi noin 6 700 vale-selainta ja käänsi pois noin 6 700 tuntematonta, samalla kun se palveli tuntemattomille noin 9 sivua sekunnissa. Hitaat pyynnöt putosivat nollaan, työntekijöiden CPU laski rajaltaan 12–15 prosenttiin ja muisti kullakin 4–5 GB:sta 0,65 GB:aan.
Mitä jätimme pois päältä
- Bot Fight Mode. Se haastaa automaattisen liikenteen eikä sitä voi ohittaa mukautetulla säännöllä Free-sopimuksella, ja se sieppasi maksupalveluntarjoajamme webhookit.
- Under Attack -tila koko vyöhykkeelle. Se laittaa jokaisen kävijän, API-asiakkaan ja webhookin väliikkunan läpi. Hätäsääntö tekee saman työn vain tuntemattomien sivupyyntöille.
- Free-sopimuksen nopeusrajoitussääntö. Se laskee osoitetta kohden, mitä tämä tulva ei koskaan laukaise.
- AI-hämähäkkien esto. Haluamme tulla löydetyksi AI-hakuavustajissa, eikä nämä hämähäkit olleet ongelma.
Pääpointti
Asuntoverkkoproksien kautta tuleva tulva on helppo tunnistaa siitä, mitä siltä puuttuu: selaimen fetch-otsikot, evästeet ja Referer-otsikot. Haasta se reunalla, pidä tuntemattomat työntekijöiden renderöintikyvyn rajoissa ja varmista, että jokin palvelimen ulkopuolella huomaa, kun sivu lakkaa aukeamasta. Night Watch paketoi kaikki kolme: vartijan, säännöt automaattisella kytkimellä hätäsäännölle sekä portin Python-web-sovelluksille.