«Linux पर एंटीवायरस की ज़रूरत नहीं» एक व्यापक राय है, और अपने मूल रूप में वह सही है: Linux की सिस्टम फ़ाइलों को संक्रमित करने वाले वायरस लगभग हैं ही नहीं। सर्वर पर ClamAV का काम दूसरा है, और उसे यूँ कहा जाता है: वह ढूँढ़ो जो आपकी साइट के ज़रिये अपलोड किया गया। सबसे बढ़कर web shell।

हम ठीक-ठीक क्या ढूँढ़ रहे हैं

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 लगातार चलने वाला डीमन है जो डेटाबेस मेमोरी में रखता है। वह जल्दी जवाब देता है पर लगभग एक गीगाबाइट RAM घेरता है। एक-दो गीगाबाइट वाले 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 साइट पर असर हटा देते हैं। --remove नहीं, --move — फ़ाइल मिटाने के बजाय क्वारंटीन में जाती है: झूठे नतीजे होते हैं, और ग़लती से मिटाई गई ग्राहक की फ़ाइल कहीं से वापस नहीं आती। और स्कैन की डायरेक्टरी वह है जिसमें फ़ाइलें अपलोड होती हैं, जड़ नहीं।

web shell के हस्ताक्षर

ClamAV के मानक डेटाबेस PHP पिछले दरवाज़ों पर कमज़ोर हैं — वे मुख्यतः मेल ट्रैफ़िक की ओर लक्षित हैं। Linux Malware Detect (maldet) यहाँ ध्यान देने योग्य रूप से बेहतर है: उसके पास ठीक web shell के इर्द-गिर्द बना अपना हस्ताक्षर समूह है, और अगर ClamAV लगा हो तो वह उसी इंजन से स्कैन करता है। आम संयोजन यही है: इंजन और अपडेट होने वाले डेटाबेस के रूप में ClamAV, विशेषीकृत हस्ताक्षरों के स्रोत के रूप में maldet।

कुछ मिल जाए तो क्या करें

मिली हुई web shell जाँच का अंत नहीं, उसकी शुरुआत है। अपलोड डायरेक्टरी में फ़ाइल का मतलब है कि कोई वहाँ लिख पाया, और फ़ाइल मिटाने से वह क्षमता नहीं मिटती।

  1. उसे तुरंत न मिटाएँ — नक़ल रखें और फ़ाइल के बदलने का समय नोट करें।
  2. उसी समय की मदद से वेब सर्वर के लॉग में ढूँढ़ें कि किस अनुरोध ने उसे वहाँ रखा। वही कमज़ोरी है।
  3. पड़ोसी ढूँढ़ें: पिछला दरवाज़ा लगभग कभी एक ही नक़ल में नहीं छोड़ा जाता।
  4. जाँचें कि उसी अवधि में डिस्क पर और क्या बदला, और नए cron कार्य तथा SSH कुंजियाँ तो नहीं आईं।

झूठे नतीजों के बारे में अलग से। टेम्पलेट लाइब्रेरियाँ और छोटा किया गया JavaScript कभी-कभी हस्ताक्षरों से मेल खा जाते हैं। इसीलिए मिटाना नहीं, क्वारंटीन, और इसीलिए यह सलाह कि जो भी तीसरे पक्ष का हस्ताक्षर समूह मिले उसे जोड़ते न जाएँ: जिस रिपोर्ट की आधी पंक्तियाँ शोर हों, उस पर भरोसा एक हफ़्ते में ख़त्म हो जाता है, और लोग उसे पढ़ना छोड़ देते हैं।

स्कैनर की व्यावहारिक क़ीमत इसमें है कि उसके नतीजे नज़र में आएँ: आख़िरी स्कैन कब चला, डेटाबेस कितने पुराने हैं, क्या मिला। यह एक पंक्ति है, पर उसकी अनुपस्थिति लगे हुए एंटीवायरस को एक ख़ानापूर्ति में बदल देती है। वह पंक्ति कैसी लगती है, नीचे डेमो पेज पर।