„Na Linuxu není antivirus potřeba“ je rozšířený názor a v původní podobě je správný: viry nakažující systémové soubory Linuxu prakticky neexistují. Na serveru má ClamAV jiný úkol a zní takto: najít to, co bylo nahráno přes váš web. Především webshelly.
Co přesně hledáme
Webshell je nevelký soubor PHP, který umožňuje spouštět příkazy přes prohlížeč. Na server se dostane přes formulář pro nahrávání, zranitelné rozšíření nebo uhodnuté heslo administrátora, uloží se do adresáře nahraných souborů mezi obrázky a žije tam měsíce. Ani firewall, ani Fail2ban ho neuvidí: požadavky na něj vypadají jako běžné požadavky na web.
Kromě toho ClamAV najde:
- škodlivé soubory nahrané uživateli a dál rozdávané z vašeho serveru — o tom obvykle přichází dopis od poskytovatele hostingu;
- poštovní přílohy, pokud server obsluhuje poštu;
- malware pro Windows v souborových úložištích — samotnému serveru neuškodí, ale zaměstnanec, který si soubor stáhne, na to doplatí.
A hned o hranicích: ClamAV průniku nezabrání a sám ho ani neodhalí. Odhaluje stopy. Nenápadná zadní vrátka dopsaná do existujícího souboru šablony signaturnímu skeneru uniknou — od toho je kontrola integrity.
Instalace a nejdůležitější nastavení
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
Druhý příkaz je důležitější než první. freshclam je služba aktualizace signatur, a pokud neběží, stává se ClamAV zbytečným, přičemž dál hlásí úspěšná skenování. Stáří databází se ověří takto:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Databáze starší než týden znamenají rozbitý mechanismus. Častou příčinou jsou zablokovaná odchozí spojení nebo ruční spuštění freshclam pod rootem, po němž už služba nemůže kvůli právům zapisovat do vlastního souboru.
Paměť: trvalá služba, nebo jednorázový běh
Způsoby použití jsou dva a volit mezi nimi je třeba uvědoměle.
clamd je trvale běžící služba držící databáze v paměti. Odpovídá rychle, ale zabírá zhruba gigabajt operační paměti. Na VPS s jedním či dvěma gigabajty je to nepřijatelné: služba vytlačí databázi a PHP-FPM a server začne váznout bez viditelné příčiny. Poznáte to podle free -m a podle aktivního odkládacího prostoru.
Alternativou je clamscan podle rozvrhu. Je pomalejší (načítá databáze při každém spuštění, asi minutu), ale pracuje jen po dobu skenování:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
Přepínač -i vypisuje jen nálezy; jinak má výstup statisíce řádků.
Skenovat adresáře, ne disk
Úplné skenování disku na slabém serveru trvá hodiny a zatěžuje stroj, kvůli čemuž se nastaví na noc a pak se vypne úplně. Praktičtější je skenovat to, co se skutečně mění zvenčí:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Tři věci jsou na tomto řádku podstatné. ionice a nice odstraňují vliv na web. --move místo --remove — soubor jde do karantény, nemaže se: falešné poplachy se stávají a omylem smazaný soubor zákazníka není odkud vzít. A skenovaný adresář je ten, do kterého se nahrává, ne kořen webu.
Signatury na webshelly
Standardní databáze ClamAV si se zadními vrátky v PHP poradí špatně — jsou zaměřené hlavně na poštovní provoz. Výrazně lépe to zvládá Linux Malware Detect (maldet): má vlastní sadu signatur postavenou právě kolem webshellů a skenuje enginem ClamAV, pokud je nainstalovaný. Obvyklá kombinace je ClamAV jako engine a aktualizovaná databáze, maldet jako zdroj specializovaných signatur.
Co udělat s nálezem
Nalezený webshell není konec vyšetřování, ale jeho začátek. Soubor v adresáři nahraných souborů znamená, že tam někdo dokázal zapsat, a smazání souboru tuto možnost neodebírá.
- Nemazat hned — uložit kopii a poznamenat čas změny souboru.
- Podle tohoto času najít v logách webového serveru požadavek, který ho tam umístil. To je zranitelnost.
- Hledat sousedy: zadní vrátka se téměř nikdy nenechávají v jediném exempláři.
- Ověřit, co dalšího se ve stejném období na disku změnilo a zda se neobjevily nové úlohy cronu a klíče SSH.
Zvlášť o falešných poplaších. Knihovny šablon a minifikovaný JavaScript občas pod signatury spadnou. Proto karanténa, a ne mazání, a proto také nemá smysl bez rozmyslu připojovat všechny nalezené cizí sady signatur: důvěra ve zprávu, v níž je polovina řádků šum, se ztratí za týden a pak už se nečte vůbec.
Praktická hodnota skeneru spočívá v tom, aby jeho výsledky padly do oka: kdy bylo poslední skenování, jak staré jsou databáze, co se našlo. Je to jeden řádek, ale bez něj se z nainstalovaného antiviru stane odškrtnutá položka. Jak tento řádek vypadá, ukazuje ukázková stránka níže.