„Pe Linux nu e nevoie de antivirus” este o părere răspândită și, în forma ei inițială, este corectă: virușii care infectează fișierele de sistem ale Linux practic nu există. Pe un server, ClamAV are altă sarcină, și anume: să găsească ceea ce a fost încărcat prin site-ul tău. În primul rând webshell-urile.
Ce căutăm de fapt
Un webshell este un fișier PHP mic, care permite rularea de comenzi prin browser. Ajunge pe server printr-un formular de încărcare, o extensie vulnerabilă sau o parolă de administrator ghicită, se așază în directorul fișierelor încărcate printre imagini și trăiește acolo luni de zile. Nici firewallul, nici Fail2ban nu îl vor vedea: cererile către el arată ca niște cereri obișnuite către site.
În plus, ClamAV găsește:
- fișierele rău intenționate încărcate de utilizatori și distribuite mai departe de pe serverul tău — de obicei despre asta este scrisoarea de la furnizorul de găzduire;
- atașamentele de e-mail, dacă serverul deservește poșta;
- programele malițioase pentru Windows din depozitele de fișiere — serverul însuși nu suferă, dar angajatul care descarcă fișierul, da.
Și imediat despre limite: ClamAV nu împiedică intruziunea și nu o detectează nici pe ea. Detectează urmele. O ușă din spate discretă, adăugată într-un fișier de temă existent, îi scapă unui scaner bazat pe semnături — pentru asta există controlul integrității.
Instalarea și setarea cea mai importantă
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
A doua comandă este mai importantă decât prima. freshclam este serviciul de actualizare a semnăturilor, iar dacă nu rulează, ClamAV devine inutil, continuând totuși să raporteze scanări reușite. Vechimea bazelor se verifică astfel:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Bazele mai vechi de o săptămână înseamnă un mecanism stricat. Cauza frecventă este blocarea conexiunilor ieșite sau rularea manuală a freshclam ca root, după care serviciul nu mai poate scrie în propriul fișier din cauza drepturilor.
Memoria: serviciu permanent sau rulare unică
Sunt două moduri de utilizare și alegerea trebuie făcută conștient.
clamd este un serviciu care rulează permanent și ține bazele în memorie. Răspunde repede, dar ocupă în jur de un gigaoctet de memorie. Pe un VPS cu unu sau doi gigaocteți asta este inacceptabil: serviciul împinge afară baza de date și PHP-FPM, iar serverul începe să se împotmolească fără motiv vizibil. Se recunoaște după free -m și după spațiul de interschimb activ.
Alternativa este clamscan după un program. Este mai lent (încarcă bazele la fiecare rulare, cam un minut), dar lucrează doar pe durata scanării:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
Opțiunea -i afișează doar descoperirile; altfel ieșirea are sute de mii de linii.
Scanează directoare, nu discul
Scanarea completă a discului pe un server slab durează ore și încarcă mașina, motiv pentru care se programează noaptea, iar apoi se dezactivează complet. Mai practic este să scanezi ceea ce se schimbă cu adevărat din exterior:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Trei lucruri din această linie sunt esențiale. ionice și nice elimină impactul asupra site-ului. --move în loc de --remove — fișierul ajunge în carantină, nu este șters: alarmele false se întâmplă, iar un fișier al clientului șters din greșeală nu are de unde fi recuperat. Iar directorul scanat este cel în care se încarcă, nu rădăcina site-ului.
Semnături pentru webshell-uri
Bazele standard ClamAV se descurcă slab cu ușile din spate în PHP — sunt orientate în principal spre traficul de e-mail. Semnificativ mai bine se descurcă Linux Malware Detect (maldet): are propriul set de semnături construit tocmai în jurul webshell-urilor și scanează cu motorul ClamAV, dacă acesta este instalat. Combinația obișnuită este ClamAV ca motor și bază actualizată, maldet ca sursă de semnături specializate.
Ce faci cu o descoperire
Un webshell găsit nu este sfârșitul investigației, ci începutul ei. Un fișier în directorul de încărcări înseamnă că cineva a reușit să scrie acolo, iar ștergerea fișierului nu elimină această posibilitate.
- Nu șterge imediat — păstrează o copie și notează ora modificării fișierului.
- După această oră, găsește în jurnalele serverului web cererea care l-a pus acolo. Aceea este vulnerabilitatea.
- Caută vecini: ușile din spate nu se lasă aproape niciodată într-un singur exemplar.
- Verifică ce altceva s-a modificat pe disc în aceeași perioadă și dacă nu au apărut sarcini cron și chei SSH noi.
Separat despre alarmele false. Bibliotecile de șabloane și JavaScript-ul minificat cad uneori sub semnături. De aceea carantină, nu ștergere, și de aceea nu are rost să conectezi fără discernământ toate seturile de semnături străine găsite: încrederea într-un raport în care jumătate din linii sunt zgomot se pierde într-o săptămână, iar apoi nu mai este citit deloc.
Valoarea practică a scanerului stă în faptul ca rezultatele lui să sară în ochi: când a fost ultima scanare, cât de vechi sunt bazele, ce s-a găsit. Este o singură linie, dar fără ea un antivirus instalat devine o bifă pusă. Cum arată această linie arată pagina demonstrativă de mai jos.