چطور یک دیوار آتش تحت وب با زبان گو ساختم که جلوی پیچیدهترین حملات سایبری رو میگیره؟
اولین باری که با یه حمله واقعی روبرو شدم، سرور یه دوست بود که فروشگاه اینترنتی کوچیکی داشت. یه شب نصفهشب پیام داد: «سایتم از کار افتاده!» وقتی لاگهای سرور رو چک کردم، دیدم هزاران درخواست توی چند ثانیه به سمت سایتش سرازیر شده. یه حمله ساده اس کیو ال بود که کل دیتابیس رو قفل کرده بود.همون شب تصمیم گرفتم یه راهحل بسازم. راهحلی که هم ارزون باشه، هم ساده نصب بشه، و مهمتر از همه، واقعاً کار کنه. بعد از یک سال توسعه، نتیجه شد سروش.
سروش یه دیوار آتش تحت وب یا همون دبلیو ای اف هست. به زبون ساده، یه نگهبان هوشمنده که بین کاربر و سرور شما قرار میگیره و هر درخواست رو قبل از رسیدن به سایت بررسی میکنه. اگه درخواست مشکوک باشه، جلوش رو میگیره.
سروش چیه؟
چرا خودم ساختمش؟ چون گزینههای موجود یا خیلی گرون بودن، یا پیچیده، یا به اینترنت خارج وابسته. من یه چیزی میخواستم که:
روی سرور خودم نصب بشه
پیکربندیش ساده باشه
واقعاً جلوی حملات رایج رو بگیره
هزینه نجومی نداشته باشه
چرا زبان GO؟
خیلیها میپرسن چرا پایتون ننوشتی؟ یا پیاچپی؟
جواب سادهست: سرعت و همزمانی.
گو یه زبان کامپایلشوندهست که گوروتینهاش اجازه میدن هزاران درخواست همزمان رو بدون مصرف رم بالا پردازش کنم. یه دبلیو ای اف باید بتونه توی کسری از ثانیه تصمیم بگیره. گو این امکان رو بهم داد.
سروش چطور حملات رو تشخیص میده؟
بیشتر دبلیو ای افها فقط دنبال کلماتی مثل UNION SELECT یا ' OR '1'='1 میگردن. ولی مهاجمهای حرفهای از روشهای پیچیدهتر استفاده میکنن:
کدگذاری بیس۶۴
کدگذاری هگزادسیمال
کامنتهای مخصوص مای اس کیو ال مثل /*!50000 SELECT*/
سروش اول کل درخواست رو رمزگشایی میکنه، بعد بررسی میکنه. این باعث میشه خیلی از حملات پیشرفته هم گیر بیفتن.
یه مهاجم با یه کاربر عادی فرق داره. کاربر عادی با سرعت طبیعی کلیک میکنه، مسیرهای منطقی رو میره. مهاجم (مخصوصاً اسکنرها) با سرعت ماشینی صفحات مختلف رو باز میکنن.
سروش آنتروپی مسیرهای درخواستی رو حساب میکنه. اگه ببینه یه کاربر داره بیرویه صفحات مختلف رو باز میکنه، بهش امتیاز منفی میده. اگه امتیاز از حدی بگذره، بلاک میشه.
خیلی از رباتها و اسکریپتهای حمله نمیتونن جاوااسکریپت اجرا کنن. سروش یه معمای ریاضی (اثبات کار) به مرورگر میده. کاربر واقعی بدون اینکه بفهمه حلش میکنه. ربات نمیتونه.
برای مهاجمهای سرسخت، سروش یه تکنیک خاص داره: دام قیر.
اتصال مهاجم رو عمداً باز نگه میداره و هر چند ثانیه یه کاراکتر براش میفرسته. مهاجم فکر میکنه هنوز وصله، ولی سرور اصلی آزاده. اینجوری منابع مهاجم هدر میره بدون اینکه فشاری به سرور اصلی بیاد.
سروش از چند بخش اصلی تشکیل شده:
۱. موتور تشخیص: قلب سیستم که درخواستها رو بر اساس ۱۵۰ قاعده مختلف بررسی میکنه
۲. محدودکننده نرخ: با الگوریتم سطل توکن، جلوی حملات فلاد رو میگیره
۳. تحلیلگر رفتار: آنتروپی و الگوی زمانی درخواستها رو تحلیل میکنه
۴. مدیریت وضعیت: با ردیس، وضعیت کاربران رو ذخیره میکنه (برای حالت توزیعشده)
۵. گزارشدهی: با پرومتئوس و گرافانا، آمار لحظهای ارائه میده
مهاجمها از بیس۶۴ و هگز برای پنهان کردن payload استفاده میکردن. مجبور شدم یه لایه رمزگشایی هوشمند بنویسم که اول ببینه آیا رشته کدگذاری شده یا نه، اگه آره رمزگشایی کنه، بعد بررسی کنه.
بعضی ورودیهای قانونی (مثل کامنت کاربر که توش کلمه SELECT داره) نباید بلاک بشن. راهحل من ترکیب چندین معیار بود. یه درخواست فقط وقتی بلاک میشه که چندین نشانه خطر رو همزمان داشته باشه.
گو سریعه، ولی بازم باید بهینه میکردم. از sync.Pool برای استفاده مجدد از بافرها استفاده کردم. نتیجه؟ سروش میتونه بیش از ۵۰۰۰ درخواست در ثانیه رو روی یه سرور معمولی پردازش کنه.
مقایسه:
ردیف | قابلیت | سروش | کلودفلر پرو | مادسکیوریتی
یک | نصب روی سرور خودم | دارد | ندارد | دارد
دو | متنباز | دارد | ندارد | دارد
سه | پیکربندی ساده | دارد | ندارد | ندارد
چهار | تشخیص اس کیو ال کدگذاریشده | دارد | ندارد | ندارد
پنج | تحلیل رفتاری | دارد | دارد | ندارد
شش | دام قیر | دارد | ندارد | ندارد
هفت | چالش اثبات کار | دارد | ندارد | ندارد