»På Linux er antivirus ikke nødvendigt« er en udbredt opfattelse, og i sin oprindelige form er den rigtig: virus, der inficerer Linux' systemfiler, findes praktisk talt ikke. På en server har ClamAV en anden opgave, og den lyder: find det, der er uploadet via din hjemmeside. Frem for alt webshells.
Hvad vi egentlig leder efter
En webshell er en lille PHP-fil, der lader nogen køre kommandoer via browseren. Den havner på serveren gennem en uploadformular, en sårbar udvidelse eller en gættet administratoradgangskode, lægger sig i uploadmappen blandt billederne og lever der i månedsvis. Hverken firewallen eller Fail2ban ser den: forespørgslerne til den ligner almindelige forespørgsler til hjemmesiden.
Derudover finder ClamAV:
- skadelige filer, som brugere har uploadet, og som derefter spredes videre fra din server — det er som regel da brevet fra hostingudbyderen kommer;
- e-mailvedhæftninger, hvis serveren håndterer post;
- Windows-skadesoftware i fillagre — serveren selv tager ingen skade, men den medarbejder, der henter filen, gør.
Og straks om grænserne: ClamAV forhindrer ikke et indbrud og opdager heller ikke selve indbruddet. Det opdager spor. En diskret bagdør tilføjet i en eksisterende temafil overses af en signaturscanner — det er integritetskontrollens opgave.
Installation og den vigtigste indstilling
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
Den anden kommando er vigtigere end den første. freshclam er tjenesten, der opdaterer signaturerne, og virker den ikke, bliver ClamAV meningsløst, mens det fortsætter med at rapportere vellykkede scanninger. Databasernes alder kontrolleres sådan:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Databaser ældre end en uge betyder en ødelagt mekanisme. En almindelig årsag er blokerede udgående forbindelser, eller at freshclam er kørt manuelt som root, hvorefter tjenesten ikke længere kan skrive til sin egen fil på grund af rettighederne.
Hukommelse: fast tjeneste eller engangskørsel
Der er to måder at bruge det på, og valget mellem dem skal træffes bevidst.
clamd er en tjeneste, der kører hele tiden og holder databaserne i hukommelsen. Den svarer hurtigt, men optager omkring en gigabyte arbejdshukommelse. På en VPS med en eller to gigabyte er det uacceptabelt: tjenesten fortrænger databasen og PHP-FPM, og serveren begynder at hakke uden synlig grund. Det genkendes på free -m og på, at swappen er aktiv.
Alternativet er clamscan efter en plan. Det er langsommere (indlæser databaserne ved hver kørsel, cirka et minut), men arbejder kun under scanningen:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
Flaget -i udskriver kun fundene; ellers bliver outputtet hundredtusindvis af linjer.
Scan mapper, ikke hele disken
En fuld diskscanning på en svag server tager timer og belaster maskinen, hvilket gør, at man lægger den til natten og derefter slår den helt fra. Praktisk er at scanne det, der rent faktisk ændres udefra:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Tre ting i den linje er vigtige. ionice og nice fjerner påvirkningen af hjemmesiden. --move i stedet for --remove — filen havner i karantæne og slettes ikke: falske udslag forekommer, og en kundefil, der er slettet ved en fejl, findes ingen steder at hente tilbage. Og mappen, der scannes, er den, man uploader til, ikke rodmappen.
Signaturer til webshells
ClamAV's standarddatabaser klarer PHP-bagdøre dårligt — de er hovedsagelig rettet mod e-mailtrafik. Betydeligt bedre er Linux Malware Detect (maldet): det har sit eget signatursæt bygget netop omkring webshells og scanner med ClamAV som motor, hvis den er installeret. Den sædvanlige kombination er ClamAV som motor og opdateret database, maldet som kilde til specialiserede signaturer.
Hvad du gør med et fund
En fundet webshell er ikke slutningen på undersøgelsen, men begyndelsen. En fil i uploadmappen betyder, at nogen kunne skrive derhen, og at slette filen fjerner ikke den mulighed.
- Slet ikke med det samme — gem en kopi og notér filens ændringstidspunkt.
- Led i webserverens logfiler efter forespørgslen på det tidspunkt, der lagde den der. Det er sårbarheden.
- Led efter naboer: bagdøre efterlades næsten aldrig i ét enkelt eksemplar.
- Kontrollér, hvad der ellers er ændret på disken i samme periode, og om nye cron-job og SSH-nøgler er dukket op.
Særskilt om falske udslag. Skabelonbiblioteker og minificeret JavaScript falder undertiden ind under signaturerne. Derfor karantæne og ikke sletning, og derfor er det heller ikke klogt uden videre at tilkoble alle fremmede signatursæt, man finder: tilliden til en rapport, hvor halvdelen af linjerne er støj, forsvinder på en uge, og så læser man den slet ikke.
Scannerens praktiske værdi ligger i, at resultaterne er synlige: hvornår sidste scanning var, hvor gamle databaserne er, hvad der blev fundet. Det er én linje, men uden den bliver et installeret antivirus et afkrydset punkt. Hvordan den linje ser ud, viser demonstrationssiden nedenfor.