Die Frage kommt selten aus dem Nichts. Der Server wurde langsamer, der Hoster hat wegen ausgehendem Datenverkehr geschrieben, oder im Postfach liegt die Benachrichtigung über eine Anmeldung, die Sie nie vorgenommen haben. Danach beginnt der unangenehme Teil: Es ist unklar, was in welcher Reihenfolge zu prüfen ist, und der erste Impuls — alles löschen und neu aufsetzen — kommt fast immer zu früh.
Nachfolgend eine Prüfreihenfolge, die etwa zwanzig Minuten dauert und in den meisten Fällen eine eindeutige Antwort liefert. Sie geht vom Billigsten zum Teuersten: zuerst das, was sofort sichtbar ist, dann das, was einen Abgleich erfordert.
Schritt eins: wer sich angemeldet hat
Beginnen Sie bei den Anmeldungen. Wenn jemand Fremdes hineingekommen ist, dann mit hoher Wahrscheinlichkeit über SSH — und es gibt eine Spur.
last -20
lastb | head -20
who
last zeigt die letzten erfolgreichen Anmeldungen, lastb die fehlgeschlagenen, who, wer gerade verbunden ist. Entscheidend ist nicht die Anzahl, sondern die Form. Tausende Fehlversuche von Adressen, die nie wiederkehren, sind gewöhnliches Hintergrundrauschen; das läuft gegen jede öffentliche Adresse ununterbrochen und bedeutet nichts.
Beunruhigend ist etwas anderes:
- eine erfolgreiche Anmeldung von einer Adresse, an der niemand von Ihnen sitzt;
- eine Anmeldung unter einem Benutzernamen, den Sie nie angelegt haben;
- Fehlversuche unter einem Namen, den es auf dieser Maschine tatsächlich gibt — dann hat jemand Ihre Benutzerliste in Erfahrung gebracht und arbeitet nicht bloß ein Wörterbuch ab;
- eine Sitzung, die gerade offen ist und die Sie nicht geöffnet haben.
Prüfen Sie außerdem, ob fremde Schlüssel hinzugekommen sind. Die Datei ~/.ssh/authorized_keys ist der häufigste Weg, sich festzusetzen: Das Passwort lässt sich beliebig oft ändern, der Schlüssel bleibt.
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
Jede Zeile dort ist der Zugang von jemandem. Wenn Sie nicht sagen können, von wem, betrachten Sie ihn als fremd.
Schritt zwei: was sich im System geändert hat
Ein Einbruch hinterlässt fast immer Spuren auf der Festplatte: eine ausgetauschte Programmdatei, eine ergänzte Konfiguration, eine neue Datei im Verzeichnis des Webservers. Das mit bloßem Auge zu prüfen ist aussichtslos — es braucht eine Referenz.
Unter Debian und Ubuntu ist die Referenz bereits vorhanden: Jedes Paket kennt die Prüfsummen seiner eigenen Dateien.
sudo apt install debsums
sudo debsums -c
Der Befehl listet die Dateien auf, die von dem abweichen, was die Distribution installiert hat. Ein Teil der Funde ist legitim — Konfigurationsdateien unter /etc sind genau dafür da, bearbeitet zu werden. Eine veränderte ausführbare Datei in /usr/bin, /usr/sbin oder /bin auf einem Server, den Sie nie von Hand angefasst haben, ist dagegen ein Thema.
Die zweite Quelle sind frische Dateien dort, wo keine sein sollten. Eine Web-Shell liegt meist im Upload-Verzeichnis und sieht aus wie eine harmlose .php:
find /var/www -type f -name '*.php' -mtime -14 -ls
Vierzehn Tage sind nur ein Ausgangspunkt; setzen Sie den Zeitraum ein, in dem Sie sicher nichts veröffentlicht haben.
Schritt drei: was nach außen geht
Ein gehackter Server wird selten um seiner selbst willen übernommen. Er wird benutzt: für Spam, zum Schürfen, als Sprungbrett in fremde Netze, als Ablage fremder Dateien. All das erzeugt ausgehende Verbindungen, die es vorher nicht gab.
ss -tulpn
ss -tp state established
Der erste Befehl zeigt, was auf eingehende Verbindungen wartet, der zweite, was gerade besteht. Zu lesen ist die Spalte mit dem Prozess. Fragen wirft auf: ein unbekannter Prozess, der auf 0.0.0.0 lauscht; ausgehende Verbindungen auf hohe Ports zu Adressen, mit denen Ihre Anwendung nichts zu tun hat; und vor allem ein Prozess, der aus /tmp oder /dev/shm gestartet wurde — aus diesen Verzeichnissen läuft nichts Legitimes.
Sehen Sie sich gleich auch die Auslastung an. Ein Miner verrät sich dadurch, dass der Prozessor dauerhaft beschäftigt ist, während sich die Website keinerlei Beliebtheit erfreut.
Wenn sich Anzeichen finden
Der erste Impuls ist, schnell aufzuräumen: den fremden Schlüssel löschen, den Prozess beenden, die Datei entfernen. Tun Sie das nicht — Sie vernichten damit genau das, woran sich später erkennen ließe, wie er hereinkam. Und bleibt das ungeklärt, kommt er wieder, womöglich morgen.
Eine Reihenfolge, die sowohl die Daten als auch das Bild bewahrt:
- Beim Hoster einen Snapshot der Festplatte anlegen, sofern das möglich ist. Das ist der einzige Schritt, der sich später nicht nachholen lässt.
- Die Maschine vom Netz trennen oder alles außer Ihrer eigenen IP schließen — aber nicht ausschalten. Beim Ausschalten verlieren Sie die Prozessliste und die offenen Verbindungen, und das ist die Hälfte der Spuren.
- Die Protokolle nach außen sichern:
/var/log/auth.log, die Webserver-Protokolle, die Ausgabe der drei Befehle oben. - Erst jetzt klären, wie der Zugang zustande kam.
Eine Neuinstallation ist der richtige Abschluss, wenn der Zugriff mit Root-Rechten erfolgte. Keine Bereinigung garantiert, dass nichts zurückgeblieben ist. Neu aufzusetzen, ohne die Ursache verstanden zu haben, ist allerdings sinnlos: Sie holen dieselbe Lücke auf ein frisches System zurück.
Damit die Frage nicht plötzlich auftaucht
All das oben ist eine einmalige Prüfung von Hand, und sie beantwortet die Frage „was passiert gerade jetzt“. Das Problem ist, dass sie meist spät gestellt wird: wenn der Hoster bereits geschrieben hat oder die Website ausgefallen ist.
Jede dieser Prüfungen existiert als eigenes Werkzeug, das dauerhaft beobachten kann: fehlgeschlagene Anmeldungen — fail2ban, Dateiänderungen — AIDE, Paketintegrität — debsums, offene Ports — ein regelmäßiger Schnappschuss von ss. Sie einzeln zu installieren ist nicht schwer; schwer ist es, sich anzugewöhnen, jeden Tag sechs verschiedene Ausgaben zu lesen — weshalb sie in der Praxis nicht gelesen werden.
Genau darin liegt der Sinn eines zusammengeführten Panels: dieselben Daten, aber auf einer Seite und mit Verlauf, damit „das war gestern anders“ sichtbar wird, ohne dass man eigens danach suchen muss. Unten die Demo-Seiten, die zeigen, wie das zusammengesetzt aussieht.