«Op Linux is een virusscanner niet nodig» is een verbreide opvatting, en in haar oorspronkelijke vorm klopt ze: virussen die Linux-systeembestanden infecteren bestaan vrijwel niet. Op een server heeft ClamAV een andere taak, en die luidt: vinden wat er via uw site is geüpload. Webshells in de eerste plaats.
Waarnaar precies wordt gezocht
Een webshell is een klein PHP-bestand waarmee via de browser commando's kunnen worden uitgevoerd. Het belandt op de server via een uploadformulier, een kwetsbare uitbreiding of een geraden beheerderswachtwoord, nestelt zich tussen de afbeeldingen in de uploadmap en leeft daar maanden. Noch de firewall noch Fail2ban ziet het: verzoeken eraan zien eruit als gewone verzoeken aan de site.
Daarnaast vindt ClamAV:
- schadelijke bestanden die gebruikers hebben geüpload en die vanaf uw server verder worden verspreid — daarover gaat doorgaans de brief van de hoster;
- mailbijlagen, als de server mail verwerkt;
- Windows-malware in bestandsopslag — de server heeft er niets aan, maar de medewerker die het bestand downloadt wel.
Meteen over de grenzen: ClamAV verhindert een inbraak niet en ontdekt die ook niet uit zichzelf. Hij ontdekt sporen. Een subtiele achterdeur die aan een bestaand themabestand is toegevoegd, ontgaat een handtekeningenscanner — daarvoor is integriteitscontrole.
Installatie en de instelling die ertoe doet
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
Het tweede commando doet er meer toe dan het eerste. freshclam is de dienst voor handtekeningupdates, en draait die niet, dan wordt ClamAV nutteloos terwijl hij geslaagde scans blijft melden. De ouderdom van de databases controleert u zo:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Databases ouder dan een week betekenen een kapot mechanisme. Veelvoorkomende oorzaken zijn geblokkeerde uitgaande verbindingen, of een handmatig als root gestarte freshclam, waarna de dienst door de rechten niet meer in zijn eigen bestand kan schrijven.
Geheugen: daemon of eenmalige run
Er zijn twee gebruikswijzen, en de keuze moet bewust zijn.
clamd is een permanent draaiende daemon die de databases in het geheugen houdt. Hij antwoordt snel maar neemt ongeveer een gigabyte geheugen in beslag. Op een VPS met één of twee gigabyte is dat onaanvaardbaar: de daemon verdringt de database en PHP-FPM, en de server wordt traag zonder zichtbare aanleiding. Te herkennen aan free -m en aan actieve swap.
Het alternatief is clamscan volgens schema. Die is trager (laadt de databases bij elke run, ongeveer een minuut) maar werkt alleen tijdens het scannen:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
De optie -i drukt alleen de vondsten af; anders is de uitvoer honderdduizenden regels lang.
Mappen scannen, niet de schijf
Een volledige schijfscan op een bescheiden server duurt uren en veroorzaakt belasting, waardoor men hem ’s nachts inplant en daarna helemaal uitzet. Praktischer is te scannen wat werkelijk van buitenaf verandert:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Drie dingen in die regel doen ertoe. ionice en nice nemen de invloed op de site weg. --move in plaats van --remove — het bestand gaat in quarantaine in plaats van te worden verwijderd: vals alarm bestaat, en een per ongeluk verwijderd klantbestand haalt u nergens terug. En de gescande map is die waarin wordt geüpload, niet de hoofdmap.
Handtekeningen voor webshells
De meegeleverde ClamAV-databases zijn zwak op PHP-achterdeuren — ze mikken vooral op mailverkeer. Linux Malware Detect (maldet) doet dat merkbaar beter: die heeft een eigen handtekeningenset die juist rond webshells is opgebouwd, en scant met de ClamAV-motor als die is geïnstalleerd. De gebruikelijke combinatie is ClamAV als motor en bij te werken database, maldet als bron van gespecialiseerde handtekeningen.
Wat te doen met een vondst
Een gevonden webshell is niet het einde van het onderzoek maar het begin. Een bestand in de uploadmap betekent dat iemand daar kon schrijven, en het verwijderen van het bestand neemt die mogelijkheid niet weg.
- Verwijder het niet meteen — bewaar een kopie en noteer de wijzigingstijd van het bestand.
- Zoek met die tijd in de webserverlogboeken het verzoek dat het daar heeft neergezet. Dat is de kwetsbaarheid.
- Zoek naar buren: een achterdeur wordt vrijwel nooit in één exemplaar achtergelaten.
- Controleer wat er in dezelfde periode nog meer op schijf is veranderd en of er nieuwe cron-taken en SSH-sleutels zijn bijgekomen.
Nog iets apart over vals alarm. Sjabloonbibliotheken en verkleinde JavaScript vallen soms onder een handtekening. Vandaar quarantaine in plaats van verwijderen, en vandaar ook het advies niet zonder onderscheid elke gevonden externe handtekeningenset aan te koppelen: het vertrouwen in een rapport waarvan de helft van de regels ruis is, verdwijnt binnen een week, en dan wordt het niet meer gelezen.
De praktische waarde van een scanner zit erin dat zijn uitkomsten opvallen: wanneer de laatste scan was, hoe oud de databases zijn, wat er is gevonden. Dat is één regel, maar het ontbreken ervan maakt van een geïnstalleerde virusscanner een vinkje. Hoe die regel eruitziet, toont de demopagina hieronder.