Το «στο Linux δεν χρειάζεσαι antivirus» είναι διαδεδομένη άποψη και στην αρχική της μορφή είναι σωστή: ιοί που μολύνουν αρχεία συστήματος Linux σχεδόν δεν υπάρχουν. Το 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 είναι μόνιμα εκτελούμενος δαίμονας που κρατά τις βάσεις στη μνήμη. Απαντά γρήγορα αλλά καταλαμβάνει περίπου ένα γιγαμπάιτ 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 αφαιρούν την επίδραση στον ιστότοπο. Το --move αντί για --remove — το αρχείο πάει σε καραντίνα αντί να διαγραφεί: ψευδώς θετικά συμβαίνουν και ένα αρχείο πελάτη διαγραμμένο κατά λάθος δεν ανακτάται από πουθενά. Και ο κατάλογος προς σάρωση είναι εκείνος όπου μεταφορτώνονται αρχεία, όχι η ρίζα.

Υπογραφές για web shells

Οι προεπιλεγμένες βάσεις του ClamAV είναι αδύναμες στις κερκόπορτες PHP — στοχεύουν κυρίως στην κίνηση ταχυδρομείου. Το Linux Malware Detect (maldet) τα πάει αισθητά καλύτερα εδώ: έχει δικό του σύνολο υπογραφών χτισμένο ακριβώς γύρω από τα web shells και σαρώνει με τη μηχανή του ClamAV αν αυτό είναι εγκατεστημένο. Ο συνηθισμένος συνδυασμός είναι ClamAV ως μηχανή και ενημερώσιμη βάση, maldet ως πηγή εξειδικευμένων υπογραφών.

Τι να κάνετε με ένα εύρημα

Ένα web shell που βρέθηκε δεν είναι το τέλος της έρευνας αλλά η αρχή της. Ένα αρχείο σε κατάλογο μεταφορτώσεων σημαίνει ότι κάποιος μπόρεσε να γράψει εκεί, και η διαγραφή του αρχείου δεν αφαιρεί αυτή τη δυνατότητα.

  1. Μην το διαγράψετε αμέσως — κρατήστε αντίγραφο και σημειώστε την ώρα τροποποίησης του αρχείου.
  2. Με βάση αυτή την ώρα, βρείτε στα αρχεία του διακομιστή ιστού ποιο αίτημα το τοποθέτησε εκεί. Αυτή είναι η ευπάθεια.
  3. Ψάξτε για γείτονες: μια κερκόπορτα σχεδόν ποτέ δεν αφήνεται σε ένα μόνο αντίγραφο.
  4. Ελέγξτε τι άλλο άλλαξε στον δίσκο την ίδια περίοδο και αν εμφανίστηκαν νέες εργασίες cron και κλειδιά SSH.

Ξεχωριστά για τα ψευδώς θετικά. Βιβλιοθήκες προτύπων και ελαχιστοποιημένη JavaScript ταιριάζουν καμιά φορά με υπογραφές. Εξ ου η καραντίνα αντί της διαγραφής, και εξ ου η συμβουλή να μην προσαρτάτε κάθε σύνολο υπογραφών τρίτων που θα βρείτε: η εμπιστοσύνη σε μια αναφορά όπου οι μισές γραμμές είναι θόρυβος χάνεται μέσα σε μία εβδομάδα και ο κόσμος παύει να τη διαβάζει.

Η πρακτική αξία ενός σαρωτή βρίσκεται στο να τραβούν τα αποτελέσματά του το βλέμμα σας: πότε έτρεξε η τελευταία σάρωση, πόσο παλιές είναι οι βάσεις, τι βρέθηκε. Αυτό είναι μία μόνο γραμμή, αλλά η απουσία της μετατρέπει ένα εγκατεστημένο antivirus σε ένα τικ σε ένα κουτάκι. Πώς μοιάζει αυτή η γραμμή το δείχνει η σελίδα επίδειξης παρακάτω.