Geekzeug

Darknet-Monitoring mit Checkmk

Darknet-Seiten gehen immer wieder mal offline und dann wieder online - das lässt sich einfach überwachen

Wie haben etliche Artikel rund um das Darknet und auch zur Open-Source-Monitoring-Lösung Checkmk. Und die kann man auch schön kombinieren! Einer der populärsten Checks in Checkmk ist der HTTP-Check: Dieser fragt eine Webseite an und zeigt dann je nach Status in Checkmk ein OK, WARN oder CRIT. Leider funktioniert das nicht mit Darknet-Seiten, denn Onion-Links brauchen natürlich eine Tor-Verbindung. Aber erfreulicherweise ist Checkmk ja einfach erweiterbar!

Darknet-Monitoring mit Checkmk

Ausgangspunkt ist im Grunde unser äußerst beliebter Artikel mit 50+ aktuell gehaltenen Darknet-Links. All diese Links ständig manuell aufzurufen war mir nach dem ersten mal zu lästig, also habe ich kleines Skript geschrieben, dass all diese Seiten anfragt und die Status ausgibt. Dazu haben gibt's auch einen eigenen Artikel.

Der Kniff dahinter: torify. Das kleine Kommandozeilen-Tool baut schlicht eine Tor-Verbindung auf und führt dann nachfolgende Befehle aus, hier zum Beispiel ein schlichtes curl-Kommando, das eben den Status einer Darknet-Seite zurückgibt.

Auf Checkmk-Seite gibt es nun ein Feature namens Local Check: Damit lassen sich quasi Light-Plugins betreiben, beliebige Skripte, die einfach nur Daten im Format Status Name Metriken Beschreibung ausgeben, also beispielsweise 0 Meinservice - Meine Beschreibung. Die anfängliche Ziffer steht dabei für den Status und der Bindestrich in diesem Fall für die ausbleibenden Metriken. Metriken wären beispielsweise prozentuale Auslastungen von CPU oder RAM, brauchen wir hier nicht. Auch zu lokalen Checks haben wir einen einen Artikel sowie ein Video.

Soll heißen: Das Skript wird so umgebaut, dass es Daten so zurückgibt, dass Checkmk sie als eigenen Service interpretieren kann, also etwa 0 http://123abc.onion - foobar.

Das Skript

Hier das Skript:

urls=$(curl -L https://www.tutonaut.de/darknet-links/ | html2text | grep 'http.*onion')

for f in $urls; do
    status=$(torify curl -Is $f | grep HTTP | cut -d ' ' -f2)
    if [ "$status" != "200" ]
    then
            echo "1 $f - Status ist 1 also warn also: $status"
    else
            echo "0 $f - Status ist 0 also okay also: $status"
    fi
    ((i++))
    sleep 1
done

Zunächst besorgt sich das Skript alle URLs aus dem Darknet-Links-Artikel und speichert sie in der Variablen url.

Die for-Schleife führt dann für jede URL eine torifizierte curl-Abfrage durch, schneidet den Status aus und gibt dann bei Status 200 (alles okay) einen Service mit führender 0 (OK) aus und bei allen anderen Status einen Service mit führender 1 (WARN). Das könnte man nun natürlich für diverse HTTP-Status anpassen, um etwa dauerhaft gelöschte Seiten mit einem CRIT zu markieren.

Die Ausgabe sieht dann in etwa so aus:

0 http://flamiuqldrsnkle2vwtoylbixov2gfru34fkrsnjrxuanogkd55yzsqd.onion/ - Status ist 0 also okay also: 200
0 http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion - Status ist 0 also okay also: 200
0 http://vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd.onion/ - Status ist 0 also okay also: 200

Die URL selbst dient hier also als Titel für jeden einzelnen Service, der aus jeder einzelnen Zeile in Checkmk generiert wird.

Checkmk-Konfiguration

Das Einbauen eines Local-Checks in Checkmk ist ganz furchbar einfach, es muss lediglich in das richtige Verzeichnis auf einem beliebigen Checkmk-Host - zum Beispiel auf dem Checkmk-Server selbst: /usr/lib/check_mk_agent/local. Fast! Das Blöde mit diesem Skript: Es läuft ewig ..., hier kommen schnell 10 Minuten zusammen. Und wenn Checkmk versucht, diese generierten Services zu erkennen, geht das garantiert in die Hose.

Die Lösung: Das Skript wird asynchron ausgeführt, also nicht bei jedem Durchlauf des Checkmk-Agenten, sondern zum Beispiel nur alle 20 Minuten oder alle 2 Tage. Die so generierten Daten werden dann gecachet und vom Agenten beim nächsten Durchlauf abgeholt. Und darum lautet der richtige Pfad: /usr/lib/check_mk_agent/local/1200 - wobei die 1200 für 1.200 Sekunden stehen. Entsprechende Ordner könnt Ihr einfach selbst erstellen.

In Checkmk müsst Ihr dann nur wie gewohnt eine Service-Erkennung durchführen und schon bekommt Ihr einen Haufen neuer Services:

services mit darknet-adressen in checkmk.
Darknet-Monitoring in Checkmk via Local-Check

Ideen

Das ganze Konzept lässt sich natürlich noch ausweiten und verfeinern. Wie schon erwähnt, könnten die unterschiedlichen HTTP-Status differenzierte berücksichtigt werden. In Checkmk wiederum ließen sich zudem Dashboards oder Ansichten bauen, die nur Seiten auf WARN oder CRIT zeigen, schließlich sind funktionierende Seiten ja nur mäßig interessant. Noch mehr Komfort kämen dann über Benachrichtigungen, so dass Ihr schlicht nur noch eine Mail oder eine Telegram-Nachricht bekommt, wenn eine Seite mal nicht mehr erreichbar ist.

Der Checkmk-eigene HTTP-Check kann zudem auch prüfen, ob bestimmte Texte auf der Seite vorhanden sind. Und auch das ließe sich ziemlich fix erledigen, indem die Seiten eben nicht nur mit curl abgerufen, sondern auch noch mit grep durchsucht werden. Und schon könntet Ihr zum Beispiel Darknet-Seiten, auf denen geklaute Accounts angeboten werden, auf Eure eigenen Nutzernamen oder Mail-Adressen überwachen.

×
Produktpreise und -verfügbarkeit sind zum angegebenen Datum / Uhrzeit korrekt und können sich ändern. Alle Preis- und Verfügbarkeitsinformationen auf https://www.amazon.de/ zum Zeitpunkt des Kaufs gelten für den Kauf dieses Produkts.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"