حملات DDoS یا دیداس چیست و چگونه با آن مقابله کنیم؟
هر سروری که سرویسی را ارایه میدهد، از جهتهای مختلفی آسیبپذیر است. بسیاری از این آسیبپذیریها تا به امروز شناسایی شده و راهکارهایی برای جلوگیری از آنها به وجود آمده است. اما زمانی تشخیص این آسیبپذیریها بسیار سخت میشود که نتوان حمله را از رفتار عادی کاربر، متمایز کرد. حملهی DDoS یکی از حملاتی است که به دلیل شباهت بسیار زیاد به رفتار کاربران عادی، به سختی شناسایی میشود و همچنین به سختی میتوان از آن جلوگیری کرد.
فرض کنید که یک سرور، در حال اجرای یک سرویس است و به درخواستهای مختلف کاربران پاسخ میدهد. هر سرور، ظرفیت محدودی برای پاسخگویی به درخواستهای کاربران دارد و اگر به حد اشباع برسد، ممکن است نتواند درخواستها را به موقع یا بهدرستی پاسخ بدهد. یکی از راههای آسیب زدن به یک سرویس، استفاده از همین ظرفیت محدود هر سرور است. اگر یک کاربر، به شکل مداوم، به یک سرور درخواست بدهد، خواه ناخواه بخشی از ظرفیت سرور را به خود اختصاص داده است و با توجه به محدود بودن ظرفیت، سرویس از دسترس تعدادی از کاربران خارج میشود. یکی دیگر از این روشها، ارسال بستههای درخواست به گونهای است که بیشتر منابع شبکه درگیر شوند. به این نوع حملات، حملهی Denial of Service یا منع سرویس گفته میشود. حملهی DoS معمولن از یک ماشین و با IP ثابت انجام میشود، بنابراین گاهی میتوان با بستن IP حمله کننده، جلوی حمله را گرفت.
حال تصور کنید مهاجم، برای جلوگیری از دسترسی به سرویس، از روش مشابهی استفاده کند با این تفاوت که به جای استفاده از یک ماشین و یک IP ثابت، از چندین ماشین و IP متفاوت بهره گیرد و در مقایسه با حالت قبل که حمله از یک نقطهی متمرکز انجام میشد، اینبار حمله به شکل توزیع شده انجام شود. به این نوع حملات، حملات DDoS Distributed Denial of Service یا منع سرویس توزیعشده میگویند. مقابله با این حمله به دو دلیل سختتر است.
چگونه میتوان جلوی حملات DDoS را گرفت؟
با توجه به دلایل گفته شده، تشخیص و جلوگیری از حملهی DDoS به شکل کامل تقریبا غیرممکن است اما همواره میتوان اقداماتی انجام داد که بتوان ترافیک مهاجم را بهتر تشخیص داد و با این تشخیص، تا بیشترین میزان ممکن جلوی حمله را گرفت.
اولین قدم برای مقابله با این نوع حملات، تشخیص ترافیک مهاجم است. برای این کار، لازم است که الگوی ترافیک عادی تعریف شود تا بر مبنای آن، ترافیک کاربر واقعی از مهاجم تشخیص داده شود. همچنین، روشهایی وجود دارد که به کمک آنها میتوان ترافیک واقعی را از ترافیکی که رباتهای حمله کننده تولید میکنند، جدا کرد. قدم بعدی پس از تشخیص، استفاده از فیلترینگ است. باید با فیلتر ترافیک در لایهی شبکه و فایروال، از رسیدن ترافیک به سرور جلوگیری کرد. این اقدامات به میزان خوبی میتواند باعث جلوگیری از حمله شود، اما نمیتواند به شکل کامل سرویس را در برابر حمله امن کند. بنابراین، همیشه لازم است راه حل جایگزینی، مانند استفاده از Proxy Server یا انتقال سرویس وجود داشته باشد تا اگر مهاجم توانست از فیلترهای قبلی عبور کند، کمترین آسیب ممکن به سرویس و در نتیجه کاربر برسد. خطر حملهی DDoS همواره برای هر سرویسی بر بستر اینترنت وجود دارد. اگرچه اقدامات گفته شده میتواند به امنیت سرویس تا حدی کمک کند، اما بسیار توصیه میشود که از راههای مقابله با DDoS به شکل دستی استفاده نشود. از آنجایی که استفاده از رباتها در این حملات بسیار رایج است، در عمل مقابلهی دستی با این حملات ناممکن است. اول اینکه چون تعداد درخواستهای هر ماشین حمله کننده، نسبت به حالت قبل بسیار کمتر است، تشخیص ترافیک حمله کننده سختتر است. دوم اینکه، حتی اگر این ترافیک به عنوان حمله تشخیص داده شود، همواره درصدی خطا وجود دارد. اگر سعی شود با بلاک ترافیک جلوی حمله گرفته شود، در صورت اشتباه، سرویس یک کاربر واقعی قطع میشود و این امر، حمله کننده را یک قدم به هدفش نزدیکتر میکند.
استفاده از فایروال سختافزاری
یکی از راههای دیگر مفید جهت جلوگیری از حملات DDoS استفاده از فایروال سختافزاری بر روی سرور است که توسط دیتاسنتر ارائه میشود. البته این فایروال بصورت 100% جلو حملات را نمیگیرید و شما نیاز به فایروال نرمافزاری هم دارید تا بتوانید به صورت دستی IP حمله کننده را پیدا نمایید و سپس در فایروال مسدود کنید.
پیدا کردن IP مبداء حملات DDoS بصورت دستی
جهت جلوگیری از DDoS یکی از راههای مفید آن پیدا کردن IP مبداء حملات است که تعداد اتصالات آن به سرور از حالت عادی بیشتر باشد و پس از پیدا کردن آن را از فایروال مسدود میکنیم. برای این کار کافی است که از دستور زیر استفاده کنیم تا لیست IPهای که به سرور متصل هستند را بیابیم:
netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
و با دستور زیر میتوانیم تعداد اتصالات به سرور را مشخص کنیم:
netstat -n | grep :80 |wc -l