A „Linuxon nem kell vírusirtó” elterjedt vélemény, és eredeti formájában helytálló: a Linux rendszerfájljait fertőző vírusok gyakorlatilag nem léteznek. A szerveren a ClamAV feladata más, és így hangzik: megtalálni azt, amit a webhelyeden keresztül feltöltöttek. Elsősorban a webshelleket.
Mit is keresünk pontosan
A webshell egy kis PHP-fájl, amely lehetővé teszi parancsok futtatását a böngészőn keresztül. Feltöltési űrlapon, sebezhető bővítményen vagy kitalált adminjelszón keresztül kerül a szerverre, letelepszik a feltöltött fájlok könyvtárába a képek közé, és hónapokig ott él. Sem a tűzfal, sem a Fail2ban nem látja: a hozzá érkező kérések a webhely szokásos kéréseinek látszanak.
Ezenkívül a ClamAV megtalálja:
- a felhasználók által feltöltött és a szerveredről tovább osztott kártékony fájlokat — erről érkezik általában a levél a tárhelyszolgáltatótól;
- a levélmellékleteket, ha a szerver levelezést szolgál ki;
- a Windows-kártevőket fájltárolókban — magának a szervernek nem árt, de az a munkatárs, aki letölti a fájlt, megjárja.
És rögtön a határokról: a ClamAV nem akadályozza meg a behatolást, és magát a behatolást sem észleli. A nyomokat észleli. Egy meglévő sablonfájlba beírt észrevétlen hátsó ajtót a szignatúraalapú szkenner elszalasztja — arra való az integritás-ellenőrzés.
Telepítés és a legfontosabb beállítás
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
A második parancs fontosabb az elsőnél. A freshclam a szignatúrafrissítő szolgáltatás, és ha nem fut, a ClamAV használhatatlanná válik, miközben továbbra is sikeres ellenőrzéseket jelent. Az adatbázisok korát így ellenőrzöd:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Az egy hétnél régebbi adatbázisok elromlott mechanizmust jelentenek. Gyakori ok a letiltott kimenő kapcsolat, vagy hogy a freshclam parancsot kézzel, rootként futtatták, ami után a szolgáltatás a jogosultságok miatt már nem tud a saját fájljába írni.
Memória: állandó szolgáltatás vagy egyszeri futtatás
Két használati mód van, és tudatosan kell választani közöttük.
A clamd folyamatosan futó szolgáltatás, amely az adatbázisokat a memóriában tartja. Gyorsan válaszol, de körülbelül egy gigabájt operatív memóriát foglal. Egy-két gigabájtos VPS-en ez elfogadhatatlan: a szolgáltatás kiszorítja az adatbázist és a PHP-FPM-et, a szerver pedig látható ok nélkül akadozni kezd. Ez a free -m parancsból és az aktív lapozóterületből ismerhető fel.
Alternatíva a clamscan ütemezés szerint. Lassabb (minden futtatáskor betölti az adatbázisokat, körülbelül egy percig), de csak az ellenőrzés idejére dolgozik:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
Az -i kapcsoló csak a leleteket írja ki; enélkül a kimenet több százezer sor.
Könyvtárakat szkennelj, ne a lemezt
A teljes lemez ellenőrzése gyenge szerveren órákig tart és terheli a gépet, ezért éjszakára állítják, majd teljesen kikapcsolják. Gyakorlatiasabb azt szkennelni, ami valóban kívülről változik:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Ebben a sorban három dolog lényeges. Az ionice és a nice leveszi a hatást a webhelyről. A --move a --remove helyett — a fájl karanténba kerül, nem törlődik: téves riasztás előfordul, és egy tévedésből törölt ügyfélfájlt nincs honnan visszaszerezni. A szkennelt könyvtár pedig az, ahová feltöltenek, nem a webgyökér.
Szignatúrák webshellekre
A ClamAV alapértelmezett adatbázisai rosszul boldogulnak a PHP-hátsóajtókkal — főként a levélforgalomra vannak hangolva. Ebben lényegesen jobb a Linux Malware Detect (maldet): saját szignatúrakészlete van, éppen a webshellek köré építve, és a ClamAV motorjával szkennel, ha az telepítve van. A szokásos párosítás: ClamAV mint motor és frissített adatbázis, maldet mint a speciális szignatúrák forrása.
Mit kezdj a lelettel
A megtalált webshell nem a vizsgálat vége, hanem a kezdete. A fájl a feltöltési könyvtárban azt jelenti, hogy valaki képes volt oda írni, és a fájl törlése ezt a lehetőséget nem szünteti meg.
- Ne töröld azonnal — ments másolatot, és jegyezd fel a fájl módosítási idejét.
- Ezen időpont alapján keresd meg a webszerver naplóiban azt a kérést, amely odatette. Ez a sebezhetőség.
- Keress szomszédokat: hátsó ajtót szinte soha nem hagynak egyetlen példányban.
- Ellenőrizd, mi változott még ugyanabban az időszakban a lemezen, és nem jelentek-e meg új cron-feladatok és SSH-kulcsok.
Külön a téves riasztásokról. A sablonkönyvtárak és a minifikált JavaScript néha beleesnek a szignatúrákba. Ezért karantén, nem törlés, és ezért nem érdemes válogatás nélkül bekötni minden fellelt idegen szignatúrakészletet sem: az olyan jelentés iránti bizalom, amelyben a sorok fele zaj, egy hét alatt elvész, és utána már el sem olvassák.
A szkenner gyakorlati értéke abban áll, hogy az eredményei szem előtt legyenek: mikor volt az utolsó ellenőrzés, milyen régiek az adatbázisok, mit talált. Ez egyetlen sor, de nélküle a telepített vírusirtóból kipipált tétel lesz. Hogy néz ki ez a sor, azt az alábbi bemutatóoldal mutatja.