«على لينكس لا حاجة لمضاد فيروسات» رأي شائع، وهو في صيغته الأصلية صحيح: فالفيروسات التي تصيب ملفات نظام لينكس تكاد لا توجد. لكن لـ ClamAV على خادم مهمة أخرى، وتُصاغ هكذا: أن يجد ما رُفع عبر موقعك. وقبل كل شيء الـ web shells.
ما الذي نبحث عنه بالضبط
الـ web shell ملف PHP صغير يتيح تنفيذ أوامر عبر المتصفح. يصل عبر نموذج رفع، أو إضافة بها ثغرة، أو كلمة مرور مدير خُمِّنت، ثم يستقر بين الصور في دليل الرفع ويعيش هناك شهورًا. ولن يراه جدار الحماية ولا Fail2ban: فالطلبات إليه تبدو طلبات عادية إلى الموقع.
وإلى جانب ذلك يجد ClamAV:
- ملفات خبيثة رفعها مستخدمون وتُقدَّم من خادمك إلى غيرهم — وعن هذا تتحدث رسالة مزوّدك عادة؛
- مرفقات البريد إن كان الخادم يعالج البريد؛
- برمجيات Windows الخبيثة في مخزن الملفات — لا يعني ذلك الخادم نفسه، لكن سيتضرر الموظف الذي ينزّل الملف.
وعن الحدود مباشرة: ClamAV لا يمنع اختراقًا ولا يكتشفه بنفسه. بل يكتشف الآثار. أما باب خلفي لطيف أُلحق بنهاية ملف قالب موجود فسيفوت ماسح التواقيع — ولهذا توجد مراقبة سلامة الملفات.
التثبيت وإعداد واحد مهم
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
الأمر الثاني أهم من الأول. فـ freshclam هو خدمة تحديث التواقيع، وإن لم تكن تعمل صار ClamAV عديم الجدوى بينما يواصل التبليغ عن فحوص ناجحة. تحقّق من عمر القواعد هكذا:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
وقواعد أقدم من أسبوع تعني أن الآلية معطَّلة. والسبب الشائع هو حجب الاتصالات الصادرة، أو تشغيل freshclam يدويًا بصلاحيات root، وبعدها لا تستطيع الخدمة الكتابة في ملفها بسبب الأذونات.
الذاكرة: عفريت أم تشغيل لمرة واحدة
ثمة طريقتان للاستخدام، وينبغي أن يكون الاختيار واعيًا.
clamd عفريت يعمل باستمرار ويحتفظ بالقواعد في الذاكرة. وهو يجيب بسرعة لكنه يشغل نحو غيغابايت من الذاكرة. وعلى خادم VPS بغيغابايت أو اثنين هذا غير مقبول: فسيزاحم العفريت قاعدة البيانات و PHP-FPM، ويبدأ الخادم بالزحف دون سبب ظاهر. ويُشخَّص ذلك بـ free -m وبنشاط منطقة التبديل.
والبديل هو clamscan وفق جدول. وهو أبطأ (يحمّل القواعد في كل تشغيل، نحو دقيقة) لكنه يعمل أثناء الفحص فقط:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
والراية -i تطبع ما وُجد فقط؛ وإلا بلغ المخرج مئات الآلاف من الأسطر.
افحص الأدلة لا القرص
فحص القرص كاملًا على خادم ضعيف يستغرق ساعات ويولّد حملًا، ولهذا يُجدوَل ليلًا ثم يُعطَّل تمامًا. والأجدى فحص ما يتغيّر فعلًا من الخارج:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
ثلاثة أشياء في هذا السطر مهمة. ionice وnice يزيلان الأثر على الموقع. و--move بدل --remove — فالملف يذهب إلى الحجر بدل أن يُحذف: فالإنذارات الكاذبة تحدث، وملف عميل حُذف خطأً لا يمكن استعادته من أي مكان. ودليل الفحص هو الدليل الذي تُرفع إليه الملفات لا الجذر.
تواقيع الـ web shells
قواعد ClamAV القياسية ضعيفة أمام الأبواب الخلفية بلغة PHP — فهي موجّهة أساسًا إلى حركة البريد. وأداة Linux Malware Detect (maldet) أفضل هنا بوضوح: فلها مجموعة تواقيع خاصة مبنية حول الـ web shells بالذات، وتفحص بمحرك ClamAV إن كان مثبتًا. والتركيبة المعتادة هي ClamAV كمحرك وقاعدة قابلة للتحديث، و maldet كمصدر لتواقيع متخصصة.
ماذا تفعل بما تجده
الـ web shell الذي عُثر عليه ليس نهاية التحقيق بل بدايته. فوجود ملف في دليل الرفع يعني أن أحدهم استطاع الكتابة هناك، وحذف الملف لا يزيل تلك القدرة.
- لا تحذفه فورًا — احتفظ بنسخة وسجّل وقت تعديل الملف.
- باستخدام ذلك الوقت، جد في سجلات خادم الويب أي طلب وضعه هناك. تلك هي الثغرة.
- ابحث عن الجيران: نادرًا جدًا ما يُترك باب خلفي في نسخة واحدة.
- افحص ما الذي تغيّر أيضًا على القرص في الفترة نفسها، وهل ظهرت مهام cron ومفاتيح SSH جديدة.
وكلمة منفصلة عن الإنذارات الكاذبة. فمكتبات القوالب و JavaScript المصغّر تطابق التواقيع أحيانًا. ومن هنا الحجر بدل الحذف، ومن هنا أيضًا النصيحة بألا تضم كل مجموعة تواقيع من طرف ثالث تجدها: فالثقة بتقرير نصف أسطره ضجيج تضيع خلال أسبوع، ويتوقف الناس عن قراءته.
والقيمة العملية للماسح في أن تقع نتائجه في عينك: متى جرى آخر فحص، وكم عمر القواعد، وماذا وُجد. وهذا سطر واحد، لكن غيابه يحوّل مضاد فيروسات مثبتًا إلى علامة في مربع. وشكل هذا السطر تعرضه صفحة العرض التوضيحي أدناه.