„Na Linuksie antywirus nie jest potrzebny” to rozpowszechniona opinia i w pierwotnej postaci jest słuszna: wirusów zarażających pliki systemowe Linuksa praktycznie nie ma. Na serwerze ClamAV ma inne zadanie i brzmi ono tak: znaleźć to, co wgrano przez naszą witrynę. Przede wszystkim webshelle.
Czego dokładnie szukamy
Webshell to niewielki plik PHP, który pozwala wykonywać polecenia przez przeglądarkę. Trafia na serwer przez formularz przesyłania plików, podatną wtyczkę albo odgadnięte hasło administratora, kładzie się w katalogu przesyłanych plików wśród obrazków i żyje tam miesiącami. Ani zapora, ani Fail2ban go nie zobaczą: żądania do niego wyglądają jak zwykłe żądania do witryny.
Poza tym ClamAV znajduje:
- szkodliwe pliki wgrane przez użytkowników i rozdawane dalej z naszego serwera — o tym zwykle jest list od hostingodawcy;
- załączniki pocztowe, jeśli serwer obsługuje pocztę;
- szkodliwe oprogramowanie dla Windowsa w magazynach plików — samemu serwerowi nie zaszkodzi, ale pracownik, który plik pobierze, ucierpi.
Od razu o granicach: ClamAV nie przeszkadza włamaniu i sam go nie wykrywa. Wykrywa ślady. Subtelną furtkę dopisaną do istniejącego pliku motywu skaner sygnaturowy przeoczy — do tego służy kontrola integralności.
Instalacja i najważniejsze ustawienie
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
Drugie polecenie jest ważniejsze od pierwszego. freshclam to usługa aktualizacji sygnatur i jeśli nie działa, ClamAV staje się bezużyteczny, nadal raportując udane skanowania. Wiek baz sprawdza się tak:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Bazy starsze niż tydzień oznaczają zepsuty mechanizm. Częsta przyczyna to zablokowane połączenia wychodzące albo ręczne uruchomienie freshclam jako root, po którym usługa nie może już pisać do własnego pliku przez prawa dostępu.
Pamięć: usługa stała czy jednorazowe uruchomienie
Są dwa sposoby użycia i wybierać między nimi trzeba świadomie.
clamd to stale działająca usługa trzymająca bazy w pamięci. Odpowiada szybko, ale zajmuje około gigabajta pamięci operacyjnej. Na VPS-ie z jednym czy dwoma gigabajtami to nie do przyjęcia: usługa wypchnie bazę danych i PHP-FPM, a serwer zacznie mulić bez widocznej przyczyny. Rozpoznaje się to po free -m i po aktywnym swapie.
Alternatywa to clamscan według harmonogramu. Jest wolniejszy (wczytuje bazy przy każdym uruchomieniu, około minuty), ale pracuje tylko w czasie skanowania:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
Przełącznik -i wypisuje tylko znaleziska; inaczej wynik ma setki tysięcy wierszy.
Skanować katalogi, a nie dysk
Pełne skanowanie dysku na słabym serwerze trwa godzinami i obciąża maszynę, przez co ustawia się je na noc, a potem wyłącza całkowicie. Praktyczniej skanować to, co naprawdę zmienia się z zewnątrz:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Trzy rzeczy w tym wierszu są istotne. ionice i nice zdejmują wpływ na witrynę. --move zamiast --remove — plik trafia do kwarantanny, a nie jest kasowany: fałszywe trafienia się zdarzają, a omyłkowo usuniętego pliku klienta nie ma skąd odzyskać. A skanowany katalog to ten, do którego się wgrywa, a nie katalog główny.
Sygnatury na webshelle
Standardowe bazy ClamAV słabo radzą sobie z furtkami w PHP — nastawione są głównie na ruch pocztowy. Wyraźnie lepiej robi to Linux Malware Detect (maldet): ma własny zestaw sygnatur zbudowany właśnie wokół webshelli, a skanuje silnikiem ClamAV, jeśli ten jest zainstalowany. Zwykłe połączenie to ClamAV jako silnik i aktualizowana baza, maldet jako źródło specjalistycznych sygnatur.
Co zrobić ze znaleziskiem
Znaleziony webshell to nie koniec dochodzenia, lecz jego początek. Plik w katalogu przesyłanych plików oznacza, że ktoś zdołał tam zapisać, a usunięcie pliku tej możliwości nie odbiera.
- Nie usuwać od razu — zachować kopię i zapisać czas modyfikacji pliku.
- Po tym czasie odnaleźć w dziennikach serwera WWW żądanie, które go tam umieściło. To jest podatność.
- Poszukać sąsiadów: furtki prawie nigdy nie zostawia się w jednym egzemplarzu.
- Sprawdzić, co jeszcze zmieniło się na dysku w tym samym okresie i czy nie pojawiły się nowe zadania crona i klucze SSH.
Osobno o fałszywych trafieniach. Biblioteki szablonów i zminifikowany JavaScript czasem podpadają pod sygnatury. Dlatego kwarantanna, a nie usuwanie, i dlatego też nie warto podłączać bez wyboru wszystkich znalezionych obcych zestawów sygnatur: zaufanie do raportu, w którym połowa wierszy to szum, traci się w tydzień i przestaje się go czytać.
Praktyczna wartość skanera polega na tym, żeby jego wyniki rzucały się w oczy: kiedy było ostatnie skanowanie, ile lat mają bazy, co znaleziono. To jeden wiersz, ale jego brak zamienia zainstalowany antywirus w odhaczoną pozycję. Jak ten wiersz wygląda, pokazuje strona demonstracyjna poniżej.