سیل اسکرپر روی پلن رایگان Cloudflare: چه چیزی آن را متوقف کرد و چه چیزی را خاموش رها کردیم

عملیات

یک صبح، یکی از سایت‌های لیستینگ ما باز نشد. Cloudflare به بازدیدکنندگان خطای 524 را نشان می‌داد، سرور مبدأ برای هر صفحه دو تا شش دقیقه زمان می‌برد و چیزی حدود ده ساعت به ما چیزی نگفت. علت، یک اسکرپر بود که از طریق پروکسی‌های مسکونی با سرعت حدود 225 درخواست در ثانیه حرکت می‌کرد.

شکل سیل

برای هر درخواست، هر صفحه رندر می‌شد، بنابراین هر ورکر صدها رندر را در صف می‌گذاشت و به سقف CPU خود می‌رسید.

چرا محدودیت‌های بر اساس آدرس کمکی نمی‌کردند

یک rate limit درخواست‌ها را بر اساس آدرس می‌شمارد. با یک تا سه درخواست از هر کدام از هزاران آدرس، هیچ آدرس منفردی هرگز به نزدیکی یک محدودیت نمی‌رسد. مسدود کردن کشورها، بازدیدکنندگان ما را هم مسدود می‌کرد. چیزی که اسکرپر نمی‌توانست به‌صورت ارزان جعل کند، رفتار شبیه به مرورگری بود که قبلاً به سایت سر زده باشد.

در لبه Cloudflare: سه قانون رایگان

پلن رایگان اجازه می‌دهد پنج قانون سفارشی WAF برای هر zone داشته باشیم. ما از سه مورد استفاده کردیم، همه با یک چالش مدیریت‌شده به‌جای بلاک، بنابراین اگر شخصی اشتباهاً گیر افتاد، می‌تواند با کلیک از آن عبور کند:

هر سه مورد، ربات‌های تأییدشده Cloudflare، یوزر‌اجنت‌هایی که خود را ربات معرفی می‌کنند، آدرس‌های IP خودمان، مسیرهای API و وب‌هوک، و فایل‌هایی که صفحه نیستند را عبور می‌دهند. دو روز بعد، سیل همچنان ادامه داشت: در یک ساعت، قانون مرورگر جعلی بیش از 10,000 درخواست را به چالش کشید. 10,000 رویدادی که Cloudflare در هر کوئری برمی‌گرداند، از 9,627 آدرس بود که هیچ‌کدام بیش از 4 مورد نداشتند.

در مبدأ: یک دروازه در اپلیکیشن

نیمه‌ی بدون رابط (headless) دارای هدرهای کامل مرورگر است، بنابراین قوانین لبه (edge) به تنهایی آن را شناسایی نمی‌کنند در حالی که قانون اضطراری غیرفعال است. در خود اپلیکیشن، یک میدل‌ور کوچک جلوی رندرر صفحه قرار دادیم:

در دقیقه اول، دروازه حدود 6,700 مرورگر جعلی را رد کرد و حدود 6,700 غریبه را دور زد، در حالی که به غریبه‌ها حدود 9 صفحه در ثانیه سرویس می‌داد. درخواست‌های کند به صفر رسیدند، CPU ورکرها از حد مجاز به 12 تا 15 درصد کاهش یافت و حافظه آن‌ها از 4 تا 5 گیگابایت برای هر کدام به 0.65 گیگابایت رسید.

آنچه غیرفعال رها کردیم

نکته کلیدی

تشخیص سیل از طریق پروکسی‌های مسکونی با توجه به آنچه کم دارد آسان است: هدرهای fetch مرورگر، کوکی‌ها و Refererها. آن را در لبه به چالش بکشید، غریبه‌ها را در محدوده‌ای نگه دارید که ورکرهای شما می‌توانند رندر کنند، و مطمئن شوید چیزی خارج از سرور متوجه می‌شود وقتی باز شدن صفحه متوقف می‌شود. Night Watch هر سه مورد را بسته‌بندی می‌کند: واچ‌داگ، قوانین با یک سوئیچ خودکار برای قانون اضطراری، و دروازه برای اپلیکیشن‌های وب Python.

به‌روزرسانی شد: