«På Linux trengs ikke antivirus» er en utbredt oppfatning, og i sin opprinnelige form er den riktig: virus som infiserer Linux' systemfiler, finnes praktisk talt ikke. På en server har ClamAV en annen oppgave, og den lyder: finn det som er lastet opp via nettstedet ditt. Framfor alt webskall.

Hva vi egentlig leter etter

Et webskall er en liten PHP-fil som lar noen kjøre kommandoer via nettleseren. Det havner på serveren gjennom et opplastingsskjema, en sårbar utvidelse eller et gjettet administratorpassord, legger seg i opplastingskatalogen blant bildene og lever der i måneder. Verken brannmuren eller Fail2ban ser det: forespørslene til det ser ut som vanlige forespørsler til nettstedet.

I tillegg finner ClamAV:

  • skadelige filer som brukere har lastet opp, og som deretter spres videre fra serveren din — det er som regel da brevet fra hostingleverandøren kommer;
  • e-postvedlegg, dersom serveren håndterer post;
  • Windows-skadevare i fillagre — serveren selv tar ingen skade, men den ansatte som laster ned filen, gjør det.

Og straks om grensene: ClamAV hindrer ikke et innbrudd og oppdager heller ikke selve innbruddet. Det oppdager spor. En diskret bakdør lagt til i en eksisterende temafil overses av en signaturskanner — det er integritetskontrollens oppgave.

Installasjon og den viktigste innstillingen

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

Den andre kommandoen er viktigere enn den første. freshclam er tjenesten som oppdaterer signaturene, og virker den ikke, blir ClamAV meningsløst mens det fortsetter å rapportere vellykkede skanninger. Databasenes alder kontrolleres slik:

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

Databaser eldre enn en uke betyr en ødelagt mekanisme. En vanlig årsak er blokkerte utgående forbindelser eller at freshclam er kjørt manuelt som root, hvoretter tjenesten ikke lenger kan skrive til sin egen fil på grunn av rettighetene.

Minne: fast tjeneste eller engangskjøring

Det finnes to måter å bruke det på, og valget mellom dem skal tas bevisst.

clamd er en tjeneste som kjører hele tiden og holder databasene i minnet. Den svarer raskt, men tar rundt en gigabyte arbeidsminne. På en VPS med én eller to gigabyte er det uakseptabelt: tjenesten fortrenger databasen og PHP-FPM, og serveren begynner å hakke uten synlig grunn. Det kjennes igjen på free -m og på at swappen er aktiv.

Alternativet er clamscan etter en plan. Det er langsommere (leser inn databasene ved hver kjøring, omtrent ett minutt), men arbeider bare mens skanningen pågår:

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

Flagget -i skriver bare ut funnene; ellers blir utdataene hundretusenvis av linjer.

Skann kataloger, ikke hele disken

En full diskskanning på en svak server tar timer og belaster maskinen, noe som gjør at man legger den til natten og deretter slår den av helt. Praktisk er å skanne det som faktisk endres utenfra:

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

Tre ting i den linjen er viktige. ionice og nice fjerner påvirkningen på nettstedet. --move i stedet for --remove — filen havner i karantene og slettes ikke: falske utslag forekommer, og en kundefil som er slettet ved en feil, finnes ingen steder å hente tilbake fra. Og katalogen som skannes, er den man laster opp til, ikke rotkatalogen.

Signaturer for webskall

ClamAVs standarddatabaser takler PHP-bakdører dårlig — de er hovedsakelig rettet mot e-posttrafikk. Betydelig bedre er Linux Malware Detect (maldet): det har et eget signatursett bygget nettopp rundt webskall og skanner med ClamAV som motor dersom den er installert. Den vanlige kombinasjonen er ClamAV som motor og oppdatert database, maldet som kilde til spesialiserte signaturer.

Hva du gjør med et funn

Et funnet webskall er ikke slutten på undersøkelsen, men begynnelsen. En fil i opplastingskatalogen betyr at noen klarte å skrive dit, og å slette filen fjerner ikke den muligheten.

  1. Ikke slett med en gang — ta vare på en kopi og noter filens endringstidspunkt.
  2. Let i webserverens logger etter forespørselen på det tidspunktet som la den dit. Det er sårbarheten.
  3. Let etter naboer: bakdører legges nesten aldri igjen i ett eneste eksemplar.
  4. Kontroller hva mer som er endret på disken i samme periode, og om nye cron-jobber og SSH-nøkler har dukket opp.

Særskilt om falske utslag. Malbiblioteker og minifisert JavaScript faller iblant inn under signaturene. Derfor karantene og ikke sletting, og derfor er det heller ikke klokt å koble til alle fremmede signatursett man finner, uten videre: tilliten til en rapport der halvparten av linjene er støy, forsvinner på en uke, og da leser man den ikke i det hele tatt.

Skannerens praktiske verdi ligger i at resultatene er synlige: når siste skanning var, hvor gamle databasene er, hva som ble funnet. Det er én linje, men uten den blir et installert antivirus et avkrysset punkt. Hvordan den linjen ser ut, viser demonstrasjonssiden nedenfor.