„Na Linuxe nie je antivírus potrebný“ je rozšírený názor a v pôvodnej podobe je správny: vírusy nakazujúce systémové súbory Linuxu prakticky neexistujú. Na serveri má ClamAV inú úlohu a znie takto: nájsť to, čo bolo nahrané cez váš web. Predovšetkým webshelly.

Čo presne hľadáme

Webshell je neveľký súbor PHP, ktorý umožňuje spúšťať príkazy cez prehliadač. Na server sa dostane cez formulár na nahrávanie, zraniteľné rozšírenie alebo uhádnuté heslo administrátora, uloží sa do adresára nahraných súborov medzi obrázky a žije tam mesiace. Ani firewall, ani Fail2ban ho neuvidia: požiadavky naň vyzerajú ako bežné požiadavky na web.

Okrem toho ClamAV nájde:

  • škodlivé súbory nahrané používateľmi a ďalej rozdávané z vášho servera — o tom obvykle prichádza list od poskytovateľa hostingu;
  • poštové prílohy, ak server obsluhuje poštu;
  • malvér pre Windows v súborových úložiskách — samotnému serveru neuškodí, ale zamestnanec, ktorý si súbor stiahne, na to doplatí.

A hneď o hraniciach: ClamAV prieniku nezabráni a sám ho ani neodhalí. Odhaľuje stopy. Nenápadné zadné vrátka dopísané do existujúceho súboru šablóny signatúrnemu skeneru uniknú — od toho je kontrola integrity.

Inštalácia a najdôležitejšie nastavenie

sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam

Druhý príkaz je dôležitejší než prvý. freshclam je služba aktualizácie signatúr, a ak nebeží, stáva sa ClamAV zbytočným, pričom ďalej hlási úspešné skenovania. Vek databáz sa overí takto:

sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam

Databázy staršie než týždeň znamenajú pokazený mechanizmus. Častou príčinou sú zablokované odchádzajúce spojenia alebo ručné spustenie freshclam pod rootom, po ktorom už služba nemôže kvôli právam zapisovať do vlastného súboru.

Pamäť: trvalá služba, alebo jednorazový beh

Spôsoby použitia sú dva a voliť medzi nimi treba uvedomele.

clamd je trvalo bežiaca služba držiaca databázy v pamäti. Odpovedá rýchlo, ale zaberá zhruba gigabajt operačnej pamäte. Na VPS s jedným či dvomi gigabajtmi je to neprijateľné: služba vytlačí databázu a PHP-FPM a server začne viaznuť bez viditeľnej príčiny. Spoznáte to podľa free -m a podľa aktívneho odkladacieho priestoru.

Alternatívou je clamscan podľa rozvrhu. Je pomalší (načítava databázy pri každom spustení, asi minútu), ale pracuje len počas skenovania:

sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www

Prepínač -i vypisuje len nálezy; inak má výstup státisíce riadkov.

Skenovať adresáre, nie disk

Úplné skenovanie disku na slabom serveri trvá hodiny a zaťažuje stroj, kvôli čomu sa nastaví na noc a potom sa vypne úplne. Praktickejšie je skenovať to, čo sa naozaj mení zvonka:

0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads

Tri veci sú na tomto riadku podstatné. ionice a nice odstraňujú vplyv na web. --move namiesto --remove — súbor ide do karantény, nemaže sa: falošné poplachy sa stávajú a omylom zmazaný súbor zákazníka niet odkiaľ vziať. A skenovaný adresár je ten, do ktorého sa nahráva, nie koreň webu.

Signatúry na webshelly

Štandardné databázy ClamAV si so zadnými vrátkami v PHP poradia zle — sú zamerané najmä na poštovú prevádzku. Výrazne lepšie to zvláda Linux Malware Detect (maldet): má vlastnú sadu signatúr postavenú práve okolo webshellov a skenuje enginom ClamAV, ak je nainštalovaný. Obvyklá kombinácia je ClamAV ako engine a aktualizovaná databáza, maldet ako zdroj špecializovaných signatúr.

Čo urobiť s nálezom

Nájdený webshell nie je koniec vyšetrovania, ale jeho začiatok. Súbor v adresári nahraných súborov znamená, že tam niekto dokázal zapísať, a zmazanie súboru túto možnosť neodoberá.

  1. Nemazať hneď — uložiť kópiu a poznamenať čas zmeny súboru.
  2. Podľa tohto času nájsť v logoch webového servera požiadavku, ktorá ho tam umiestnila. To je zraniteľnosť.
  3. Hľadať susedov: zadné vrátka sa takmer nikdy nenechávajú v jedinom exemplári.
  4. Overiť, čo ďalšie sa v rovnakom období na disku zmenilo a či sa neobjavili nové úlohy cronu a kľúče SSH.

Zvlášť o falošných poplachoch. Knižnice šablón a minifikovaný JavaScript občas pod signatúry spadnú. Preto karanténa, a nie mazanie, a preto tiež nemá zmysel bez rozmyslu pripájať všetky nájdené cudzie sady signatúr: dôvera v správu, v ktorej je polovica riadkov šum, sa stratí za týždeň a potom sa už nečíta vôbec.

Praktická hodnota skenera spočíva v tom, aby jeho výsledky padli do oka: kedy bolo posledné skenovanie, aké staré sú databázy, čo sa našlo. Je to jeden riadok, ale bez neho sa z nainštalovaného antivírusu stane odškrtnutá položka. Ako tento riadok vyzerá, ukazuje ukážková stránka nižšie.