„Unter Linux braucht man keinen Virenschutz“ ist eine verbreitete Ansicht, und in ihrer ursprünglichen Form stimmt sie: Viren, die Linux-Systemdateien infizieren, gibt es kaum. ClamAV hat auf einem Server eine andere Aufgabe, und die lautet: finden, was durch Ihre Website hochgeladen wurde. Vor allem Web-Shells.

Wonach genau gesucht wird

Eine Web-Shell ist eine kleine PHP-Datei, mit der sich über den Browser Befehle ausführen lassen. Sie kommt über ein Upload-Formular, ein verwundbares Plugin oder ein erratenes Administratorpasswort auf den Server, legt sich zwischen die Bilder im Upload-Verzeichnis und lebt dort monatelang. Weder Firewall noch Fail2ban sehen sie: Anfragen an sie sehen aus wie gewöhnliche Anfragen an die Website.

Darüber hinaus findet ClamAV:

  • schädliche Dateien, die Nutzer hochgeladen haben und die von Ihrem Server weiterverteilt werden — darum geht es meist im Schreiben des Hosters;
  • Mail-Anhänge, sofern der Server Mail bearbeitet;
  • Windows-Schadsoftware in Dateiablagen — den Server interessiert sie nicht, den Mitarbeiter, der die Datei herunterlädt, schon.

Gleich zu den Grenzen: ClamAV verhindert keinen Einbruch und erkennt ihn auch nicht von sich aus. Er erkennt Spuren. Eine feine Hintertür, die an eine bestehende Theme-Datei angehängt wurde, übersieht ein signaturbasierter Scanner — dafür gibt es die Integritätsüberwachung.

Installation und die eine Einstellung, auf die es ankommt

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

Der zweite Befehl ist wichtiger als der erste. freshclam ist der Dienst für Signaturaktualisierungen, und läuft er nicht, wird ClamAV nutzlos — meldet aber weiterhin erfolgreiche Prüfungen. Das Alter der Datenbanken prüfen Sie so:

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

Datenbanken, die älter als eine Woche sind, bedeuten einen defekten Mechanismus. Häufige Ursachen sind blockierte ausgehende Verbindungen oder ein von Hand als root gestarteter freshclam, nach dem der Dienst wegen der Rechte nicht mehr in seine eigene Datei schreiben kann.

Speicher: Dienst oder einmaliger Lauf

Es gibt zwei Nutzungsarten, und die Wahl sollte bewusst erfolgen.

clamd ist ein dauerhaft laufender Dienst, der die Datenbanken im Speicher hält. Er antwortet schnell, belegt aber rund ein Gigabyte Arbeitsspeicher. Auf einem VPS mit ein bis zwei Gigabyte ist das nicht hinnehmbar: Der Dienst verdrängt Datenbank und PHP-FPM, und der Server wird ohne sichtbaren Grund zäh. Erkennbar an free -m und an aktivem Swap.

Die Alternative ist clamscan nach Zeitplan. Er ist langsamer (lädt bei jedem Lauf die Datenbanken, etwa eine Minute), arbeitet aber nur während der Prüfung:

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

Der Schalter -i gibt nur Funde aus; andernfalls umfasst die Ausgabe Hunderttausende Zeilen.

Verzeichnisse prüfen, nicht die Platte

Eine vollständige Plattenprüfung dauert auf einem schwachen Server Stunden und erzeugt Last, weshalb sie auf die Nacht gelegt und dann ganz abgeschaltet wird. Praktischer ist es, das zu prüfen, was sich tatsächlich von außen ändert:

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

Drei Dinge in dieser Zeile sind wesentlich. ionice und nice nehmen die Auswirkung auf die Website weg. --move statt --remove — die Datei wandert in Quarantäne statt gelöscht zu werden: Fehlalarme kommen vor, und eine irrtümlich gelöschte Kundendatei ist nirgendwoher zurückzuholen. Und geprüft wird das Verzeichnis, in das hochgeladen wird, nicht die Wurzel.

Signaturen für Web-Shells

Die mitgelieferten ClamAV-Datenbanken sind bei PHP-Hintertüren schwach — sie zielen vor allem auf Mail-Verkehr. Deutlich besser ist Linux Malware Detect (maldet): Es hat einen eigenen Signatursatz, der genau um Web-Shells herum aufgebaut ist, und prüft mit der ClamAV-Engine, sofern diese installiert ist. Die übliche Kombination ist ClamAV als Engine und aktualisierbare Datenbank, maldet als Quelle der spezialisierten Signaturen.

Was tun mit einem Fund

Eine gefundene Web-Shell ist nicht das Ende der Untersuchung, sondern ihr Anfang. Eine Datei im Upload-Verzeichnis bedeutet, dass jemand dorthin schreiben konnte, und das Löschen der Datei nimmt diese Möglichkeit nicht.

  1. Nicht sofort löschen — eine Kopie behalten und die Änderungszeit notieren.
  2. Anhand dieser Zeit in den Webserver-Protokollen die Anfrage finden, die sie dorthin gebracht hat. Das ist die Schwachstelle.
  3. Nach Nachbarn suchen: Eine Hintertür wird fast nie in einem einzigen Exemplar hinterlassen.
  4. Prüfen, was sich sonst im selben Zeitraum auf der Platte geändert hat und ob neue Cron-Aufträge und SSH-Schlüssel hinzugekommen sind.

Ein eigenes Wort zu Fehlalarmen. Template-Bibliotheken und minifiziertes JavaScript treffen mitunter auf Signaturen. Daher Quarantäne statt Löschen, und daher auch der Rat, nicht wahllos jeden auffindbaren fremden Signatursatz einzubinden: Das Vertrauen in einen Bericht, in dem die Hälfte der Zeilen Rauschen ist, verfliegt binnen einer Woche, und dann wird er nicht mehr gelesen.

Der praktische Wert eines Scanners liegt darin, dass seine Ergebnisse ins Auge fallen: wann die letzte Prüfung lief, wie alt die Datenbanken sind, was gefunden wurde. Das ist eine einzige Zeile, aber ihr Fehlen macht aus einem installierten Virenschutz ein Häkchen. Wie diese Zeile aussieht, zeigt die Demo-Seite unten.