مقال : الحماية من هجمات DDoS باستخدام mod_evasive
Mod_evasive عبارة عن Apache module كان يعرف سابقاً باسم mod_dosevasive وهو يساعد في الحماية ضد هجمات حجب الخدمة DoS – Denial of Service وهجمات منع الخدمة الموزعة DDoS – Distributed Denial of Service وهجمات القوة الغاشمة brute force التي تستهدف سيرفر الويب Apache web server حيث يقوم بإرسال تقارير عن هذه الحالات عبر البريد الالكتروني وتسجيلها في سجلات النظام syslog.
هذه الأداة تعمل من خلال خلق جدول داخلي متغير لعناوين IP and URL وتقوم بمنع أي عنوان IP منفرد من القيام بالأمور التالية:
-
طلب نفس الصفحة أكثر من مرة خلال ثانية واحدة
-
عمل أكثر من 50 طلب متزامن لنفس العملية خلال ثانية واحدة
-
عمل أي طلبات أثناء فترة الحظر أو المنع المؤقتة
في حال تم القيام بإحدى الأمور السابقة فسوف يقوم السيرفر بالإجابة من خلال إرسال كود الحالة 403 وسيتم تسجيل عنوان IP الخاص بهذا الطلب في log file.
ويمكن لمدير السيرفر تفعيل خاصية التنبيه من خلال إرسال رسائل عن الحالات المشبوهة إلى عنوان بريد إلكتروني يتم تحديده مسبقاً، كما يمكن لمدير السيرفر ضبط تعليمات خاصة لتقوم بمنع أو حظر عنوان IP الخاص بالمهاجم.
سنتعرف على عملية تنصيب وإعداد واستخدام mod-evasive على السيرفر :
المتطلبات:
قبل البدء بهذه العملية يجب أن تملك الأمور التالية:
-
نظام تشغيل CentOS 7 64-bit (يمكن أن يكون CentOS 6)
-
مستخدم بصلاحيات عادية non-root user قادر على استخدام صلاحيات sudo
-
سيرفر أباتشي Apache web server
الخطوة 1: تنصيب mod_evasive :
سنقوم بتنصيب الحزم packages المطلوبة لعمل mod_evasive ومن ثم نقوم بتنصيب mod_evasive, في البداية يجب أن نقوم بتنصيب EPEL yum repository
EPEL – Extra Packages for Enterprise Linux (مجموعة مختصة بتوزيعه فيدورا Fedora تقوم بإنشاء وإدارة مجموعة من حزم التطبيقات المفتوحة المصدر الخاصة بنظام التشغيل Linux) .
عملية تنصيب هذا المستودع EPEL repository على السيرفر تتم باستخدام التعليمة التالية:
CentOS 7
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
CentOS 6
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
للتأكد من تفعيل هذا المستودع نستخدم التعليمة التالية:
sudo yum repolist
إذا تمت عملية إضافة هذا المستودع بنجاح يجب أن نرى اسمه في نتيجة تنفيذ التعليمة السابقة بشكل مشابه للنص التالي:
epel/x86_64 Extra Packages for Enterprise Linux 7 – x86_64
للقيام بحماية الحزم الأساسية الخاصة بهذا المستودع باستخدام الإضافة plugin portecbase يمكننا استخدام التعليمة التالية:
sudo yum install yum-plugin-protectbase.noarch –y
الغاية من استخدام الإضافة protectbase plugin هو حماية مستودعات محددة من عملية التحديث لمستودعات أخرى , حزم التطبيقات الموجودة في المستودعات المحمية لن يتم تحديثها أو الكتابة فوقها أو استبدالها بحزم أخرى من مستودعات غير محمية حتى ولو كانت ذات إصدار إحدث.
الان يمكننا تنصيب mod_evasive module باستخدام التعليمة التالية:
sudo yum install mod_evasive –y
الخطوة 2: التحقق من عملية التنصيب :
بعد الانتهاء من عملية التنصيب لنقم بالتحقق من أن ملف الإعدادات تم تنصيبه والتحقق من أن الوحدات اللازمة قد تم تحميلها, خلال عملية التنصيب سيتم إضافة ملف الإعدادات ضمن المسار التالي:
etc/httpd/conf.d/mod_evasive.conf/
للتأكد من ذلك يمكننا استخدام التعليمة:
sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
النتيجة ستكون بشكل مشابه للتالي:
rw-r–r– 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf-
بشكل افتراضي يتم إضافة سطر يحوي على العبارة LoadModule لبداية ملف الإعدادات mod_evasive.conf , قم بفتح هذا الملف وقم بإضافة هذه العبارة إن لم تكن موجوه، هذه العبارة تجعل سيرفر الأباتشي يقوم بتحميل واستخدام mod_evasive module.
في CentOS 7 يجب أن يحوي ملف الإعدادات:
etc/httpd/conf.d/mod_evasive.conf/
على السطر التالي:
LoadModule evasive20_module modules/mod_evasive24.so
وفي CentOS 6 يجب أن يحوي ملف الإعدادات:
etc/httpd/conf.d/mod_evasive.conf/
على السطر التالي:
LoadModule evasive20_module modules/mod_evasive20.so
التعليمة التالية تقوم بعرض الوحدات الخاصة بسيرفر الأباتشي وتبحث عن mod_evasive module
sudo httpd -M | grep evasive
نتيجة تنفيذ التعليمة السابقة يجب أن تحوي على السطر التالي:
evasive20_module (shared)
الخطوة 3 إعداد Mod_evasive:
بعد الانتهاء من عملية التنصيب والتحقق يمكننا إعداد mod_evasive بسهولة من خلال ملف الإعدادات mod_evasive.conf
سوف نناقش بعض بارامترات الإعدادات الرئيسية:
DOSEmailNotify: إذا تم ضبط هذه القيمة سوف يتم إرسال رسائل عبر البريد الالكتروني لعنوان يتم تحديده مسبقاً للإعلام عن عمليات حظر أو منع لعنوان IP الذي قام بمخالفة القواعد المطبقة (محاولة هجوم)
نص رسالة البريد الالكتروني يكون كالتالي:
mod_evasive HTTP Blacklisted 111.111.111.111
إذا كنا نريد إعداد mod_evasive ليقوم بإرسال التنبيهات إلى عنوان البريد الالكتروني [email protected] يجب أن نقوم بتعديل ملف الإعدادات من خلال فتح هذا الملف باستخدام محرر النصوص nano (يمكن أن يكون أي محرر نصوص أخر)
sudo nano /etc/httpd/conf.d/mod_evasive.conf
ومن ثم إزالة الإشارة # قبل DOSEmailNotify وكتابة عنوان البريد الالكتروني
DOSEmailNotify [email protected]
تنبه : mod_avasive يستخدم /bin/mail في عملية الإرسال، يجب أن يكون mail server منصب مسبقاً ويعمل بشكل جيد.
DOSWhitlist: استخدام هذا الخيار مع عناوين IP موثوقة يسمح لهذه العنوان بالقيام بالأمور الممنوعة، الهدف من هذه العملية هو السماح لبرامج الحماية و السكريبتات الخاصة والأدوات الأخرى التي يستخدمها مدير السيرفر بالعمل دون أن يتم منعها في حال قامت بطلبات متكررة من السيرفر.
إضافة العنوان IP: 111.111.111.111 إلى whitelist تتم من خلال تعديل محتوى ملف الإعدادات:
etc/httpd/conf.d/mod_evasive.conf/
ليحوي على السطر التالي:
DOSWhitelist 111.111.111.111
يمكن أن نقوم بالسماح لمجال عناوين محدد من خلال كتابة أول ثلاث أجزاء من عنوان IP إذا لزم الأمر , للسماح لأكثر من عنوان IP ضمن مجالات مختلفة يمكن أن نستخدم أسطر متعددة كما في المثال التالي:
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
البرامترين DOSPagCount و DOSSiteCount ينصح بتغير قيمهم لتجنب حالات الحجب الغير ضرورية للمستخدمين العاديين.
DOSPageCount: يحدد عدد الطلبات من نفس عنوان IP لنفس الصفحة خلال فترة زمنية محددة (عادةً ما تكون ثانية واحدة) وفي حال تجاوز عدد المرات المسموح به فسوف يتم إضافة عنوان IP إلى قائمة الحظر.
القيمة الافتراضية هي 2 ويمكن تغيرها إلى 20 من خلال تعديل محتوى الملف:
etc/httpd/conf.d/mod_evasive.conf/
ليحوي على السطر التالي:
DOSPageCount 20
DOSSiteCount: يحدد العدد الكلي للطلبات لصفحات موقع محدد من قبل نفس عنوان IP وذلك خلال فترة زمنية محدد (القيمة الافتراضية هي ثانية واحدة) , لتغير هذه القيمة لتصبح 100 من خلال تعديل محتوى الملف:
etc/httpd/conf.d/mod_evasive.conf/
ليحوى على السطر التالي:
DOSSiteCount 100
يوجد بعض البارامترات الأخرى التي يمكن تعديلها للحصول على أداء أفضل.
DOSBlockingPeriod: يحدد الفترة الزمنية بالثانية لمدة حظر عنوان IP لمستخدم معين في حال قام بمخالفة القواعد المطبقة وتمت إضافته إلى قائمة الحظر، وخلال هذه الفترة (فترة الحظر) كل الطلبات المشبوه القادمة من هذا المستخدم سوف يتم الإجابة عليها برسالة الخطأ 403 (forbidden). القيمة الافتراضية لمدة الحظر هي 10 ثانية.
لزيادة هذه المدة لتصبح 300 ثانية يمكننا تعديل ملف الإعدادات:
etc/httpd/conf.d/mod_evasive.conf/
ليحوي على السطر التالي:
DOSBlockingPeriod 300
:DOSLogDir يحدد مسار مجلد مؤقت ليتم استخدامه من قبل mod_evasive بشكل افتراضي يتم استخدام tem وهذا يمكن أن يؤدي إلى بعض المشاكل في الحماية, إذا كان النظام مفتوح للمستخدمين (المستخدم يملك shell بصلاحية المستخدم العادي) فيجب أن نقوم بإنشاء مجلد والسماح فقط بالكتابة فيه من قبل المستخدم الذي يستخدم سيرفر الأباتشي (عادةً يكون باسم apache) ومن ثم ضبط هذا البارامتر لمسار هذا المجلد.
مثال: من أجل ضبط mod-evasive لتقوم باستخدام المجلد:
var/log/mod_evasive/
نقوم أولاً بإنشاء هذا المجلد باستخدام التعليمة التالية:
sudo mkdir /var/log/mod_evasive
ومن ثم تحديد ملكية هذا المجلد ليكون تابع للمستخدم apache
sudo chown -R apache:apache /var/log/mod_evasive
ومن ثم تعديل ملف الإعدادات:
etc/httpd/conf.d/mod_evasive.conf/
ليحوي على السطر التالي:
DOSLogDir “/var/log/mod_evasive”
DOSSystemCommand: يمكن تحديد قيمة لهذا البارامتر تكون على شكل تعليمة معينة ليتم تنفيذها في كل مرة يتم فيها إضافة عنوان IP إلى قائمة الحظر. استخدام هذا البارامتر يمكن أن يتم بشكل مشترك مع الجدار الناري (في حال وجوده) أو يمكن أن يعمل لتنفيذ shell script
الخطوة 4 تفعيلmod_evasivemodul :
بعد إجراء التعديلات السابقة في ملف الإعدادات يجب أن نقوم بإعادة تشغيل سيرفر الاباتشي ليتم تفعيل وتطبيق التعديلات السابقة.
إعادة تشغيل الاباتشي تتم باستخدام التعليمة:
CentOS 7
sudo systemctl restart httpd.service
CentOS 6
sudo service httpd restart
الخطوة 5 اختبار mod_evasive:
لنقم بعملية اختبار بسيطة للتأكد من أن mod_evasive يعمل بشكل جيد, سوف نستخدم سكريبت مكتوبة بلغة perl تم كتابتها من قبل مطوري mod_evasive , لتشغيل هذه السكريبت يجب أن نقوم بتنصيب perl على السيرفر ويتم ذلك باستخدام التعليمة التالية:
sudo yum install -y perl
السكريبت موجودة في المسار التالي:
usr/share/doc/mod_evasive-1.10.1/test.pl/
بشكل افتراضي فإن هذه السكريبت تقوم بطلب نفس الصفحة من سيرفر الاباتشي 100 مرة من أجل اختبار فعالية mod_evasive سنقوم بتعديل هذه القيمة لتصبح 200 طلب ويتم ذلك من خلال تعديل محتوى السكريبت:
usr/share/doc/mod_evasive-1.10.1/test.pl/
لنقم بفتح هذا الملف باستخدام محرر النصوص nano باستخدام التعليمة التالية:
sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl
ومن ثم تعديل القيمة 100 في حلقة for(0..100) لتصبح for(0..200) ومن ثم حفظ هذا الملف والخروج منه.
لتنفيذ هذا السكريبت نستخدم التعليمة التالية:
sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
نتيجة التنفيذ يجب أن تكون كالتالي:
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
كود الحالة 403 في الإجابة يشير إلى أن عملية الوصول ممنوعة من قبل سيرفر الويب حيث قام Mod_evasive بمنع هذه الطلبات وقام أيضاً بتسجيل عنوان IP في syslog وقام بإضافته إلى قائمة الحظر.
يمكننا عرض السجل باستخدام التعليمة التالية:
sudo tailf /var/log/messages
يجب أن يحوي على رسالة كالتالي:
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack
إذا قمت بإعداد mod_avasive ليقوم بإعلامك بمنع عنوان IP من خلال رسالة عبر البريد الالكتروني عن فسوف تصلك رسالة تحوي على التالي:
mod_evasive HTTP Blacklisted 127.0.0.1
الخلاصة:
Mod_avasive هو أداة رائعة لحماية السيرفر من هجمات حجب الخدمة وحجب الخدمة الموزعة ولكنه فعال فقط في الحالات التي يكون فيها معالج السيرفر وعرض الحزمة الكلي قادرين على التعامل مع هذه الطلبات والإجابة عليها ولهذا السبب من المهم أن تقوم بربط mod_avasive ليعمل مع جدار ناري firewall من أجل الحصول على أعلى مستوى حماية.
بدون بنية تحتية جيدة وجدار ناري مُعد بشكل جيد وموجود في المكان المناسب فإن هجمات حجب الخدمة الموزعة DDoS يمكن أن تخرج السيرفر أو الموقع عن الخدمة وإذا كانت هذه الهجمات قوية وتتم بشكل مستمر يجب أن تفكر باستخدام أجهزة حماية خاصة للتخفيف من هذه الهجمات.
ترجمة بتصرف لمقال : How To Protect Against DoS and DDoS with mod_evasive for Apache on CentOS 7
merci mon frere
معلومات رائعة، موضووووع قيم
بوركت جهودك، و جزاك الله خير الجزاء