”På Linux behövs inget antivirus” är en spridd uppfattning och i sin ursprungliga form är den riktig: virus som infekterar Linux systemfiler finns praktiskt taget inte. På en server har ClamAV en annan uppgift, och den lyder: hitta det som laddats upp via din sajt. Framför allt webbskal.

Vad vi egentligen letar efter

Ett webbskal är en liten PHP-fil som låter någon köra kommandon via webbläsaren. Det hamnar på servern genom ett uppladdningsformulär, ett sårbart tillägg eller ett gissat administratörslösenord, lägger sig i uppladdningskatalogen bland bilderna och lever där i månader. Varken brandväggen eller Fail2ban ser det: förfrågningarna till det ser ut som vanliga förfrågningar till sajten.

Dessutom hittar ClamAV:

  • skadliga filer som användare laddat upp och som sedan sprids vidare från din server — det är oftast då brevet från hostingleverantören kommer;
  • e-postbilagor, om servern hanterar post;
  • Windows-skadeprogram i fillager — servern själv tar ingen skada, men den anställda som hämtar filen gör det.

Och genast om gränserna: ClamAV hindrar inte ett intrång och upptäcker inte heller själva intrånget. Det upptäcker spår. En diskret bakdörr som lagts till i en befintlig temafil missar en signaturskanner — det är integritetskontrollens uppgift.

Installation och den viktigaste inställningen

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

Det andra kommandot är viktigare än det första. freshclam är tjänsten som uppdaterar signaturerna, och fungerar den inte blir ClamAV meningslöst medan det fortsätter rapportera lyckade skanningar. Databasernas ålder kontrolleras så här:

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

Databaser äldre än en vecka betyder en trasig mekanism. En vanlig orsak är blockerade utgående anslutningar eller att freshclam körts manuellt som root, varefter tjänsten inte längre kan skriva till sin egen fil på grund av rättigheterna.

Minne: ständig tjänst eller engångskörning

Det finns två sätt att använda det, och valet mellan dem ska göras medvetet.

clamd är en ständigt körande tjänst som håller databaserna i minnet. Den svarar snabbt men tar omkring en gigabyte arbetsminne. På en VPS med ett eller två gigabyte är det oacceptabelt: tjänsten tränger ut databasen och PHP-FPM, och servern börjar kärva utan synbar orsak. Det känns igen på free -m och på att swappen är aktiv.

Alternativet är clamscan enligt schema. Det är långsammare (läser in databaserna vid varje körning, omkring en minut) men arbetar bara under skanningen:

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

Flaggan -i skriver bara ut fynden; annars blir utdatan hundratusentals rader.

Skanna kataloger, inte hela disken

En full diskskanning på en svag server tar timmar och belastar maskinen, vilket gör att man lägger den på natten och sedan stänger av den helt. Praktiskt är att skanna det som faktiskt ändras utifrån:

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

Tre saker i den raden är viktiga. ionice och nice tar bort påverkan på sajten. --move i stället för --remove — filen hamnar i karantän och raderas inte: falska larm förekommer, och en av misstag raderad kundfil finns ingenstans att hämta tillbaka. Och katalogen som skannas är den man laddar upp till, inte rotkatalogen.

Signaturer för webbskal

ClamAV standarddatabaser klarar PHP-bakdörrar dåligt — de är främst inriktade på e-posttrafik. Betydligt bättre är Linux Malware Detect (maldet): det har en egen signaturuppsättning byggd just kring webbskal och skannar med ClamAV som motor om den är installerad. Den vanliga kombinationen är ClamAV som motor och uppdaterad databas, maldet som källa till specialiserade signaturer.

Vad du gör med ett fynd

Ett funnet webbskal är inte slutet på utredningen utan dess början. En fil i uppladdningskatalogen betyder att någon lyckades skriva dit, och att radera filen tar inte bort den möjligheten.

  1. Radera inte direkt — spara en kopia och notera filens ändringstid.
  2. Leta i webbserverns loggar efter förfrågan vid den tidpunkten som lade den där. Det är sårbarheten.
  3. Leta efter grannar: bakdörrar lämnas nästan aldrig i ett enda exemplar.
  4. Kontrollera vad mer som ändrats på disken under samma period och om nya cron-jobb och SSH-nycklar dykt upp.

Särskilt om falska larm. Mallbibliotek och minifierad JavaScript faller ibland under signaturerna. Därför karantän och inte radering, och därför är det heller inte klokt att urskillningslöst koppla in alla främmande signaturuppsättningar man hittar: förtroendet för en rapport där hälften av raderna är brus försvinner på en vecka, och sedan läser man den inte alls.

Skannerns praktiska värde ligger i att dess resultat syns: när den senaste skanningen var, hur gamla databaserna är, vad som hittades. Det är en rad, men utan den blir ett installerat antivirus en avbockad punkt. Hur den raden ser ut visar demonstrationssidan nedan.