SSH-Tarpit im Docker einrichten

Wie man (im Docker) ein SSH-Tarpit einrichtet und wozu das ganze überhaupt.

Im folgenden wird das Synology DSM Docker genutzt, funktioniert natürlich so (oder so ähnlich) in jedem anderen Linux auch.

Zuerst einmal möchte ich das „Wozu“ erklären.

Das Tarpit „fängt“ SSH anfragen ein und lässt diese dann „versumpfen“ bis der Angreifer die Verbindung trennt.

Dieser Vorgang kann seitens tarpit unendlich lange dauern und verschwendet damit Bot Zeit. In dieser Zeit in der er gefangen ist im tarpit kann er mit dieser resource niemand anderen versuchen zu hacken. Ob man das machen möchte ist also rein optional. Das beste ist: es frisst eigentlich fast keine Resourcen.

Setze ich mich dadurch eine Gefahr aus gehackt zu werden ?
Kurzum: Nein.
In Lang: Endlessh schickt unendlich lange und sehr langsam an den Client pseudo Daten für den Verbindungsaufbau. Der Verbinundsaufbau wird nie zustande kommen und, wenn der Client es mitmacht, ewig im Verbindungsaufbau stehen bleiben. Aber selbst wenn er auf magische Weise irgendwie die Verbindung hacken würde: Er wäre in einem Docker Container ohne alles. Er käme da eh nicht raus oder könnte irgendwas machen. Aber wie gesagt, das ist unmöglich das es passieren kann.

siehe auch: https://www.youtube.com/watch?v=EJdobdjI3xg

Jetzt das „Wie“:

Wir öffnen in der DSM das Docker und suchen bei „Registrierung“ folgendes Paket: harshavardhanj/endlessh

hier der Link zum Projekt:
https://registry.hub.docker.com/r/harshavardhanj/endlessh/

und für die Leute Compose.yml Leute:

version: "3.4"
services:
    endlessh:
        image: harshavardhanj/endlessh:latest
        ports:
        - "2222:2222"
        restart: always

Wir brauchen allerdings noch folgende Umgebungsvariable:

TZ: Europe/Berlin

damit stellen wir die Timezone auf unsere Breitengrade.

Ich empfehle ausserdem ein Volume für die Config zu erstellen, das kann so aussehen

Damit bleiben unsere Einstellungen auch nach einem evtl Containerupdate bestehen und erleichtert und ggfs. die Config zu editieren (wenn Bedarf besteht, z.b. nur IPv4 zu nutzen oder der Container soll einen anderen Port nutzen oder was auch immer). Eigentlich ist das aber nicht notwendig.

Dann sollten wir noch den Port für den Docker-Container definieren:

haben wir das alles eingestellt können wir den Container starten. Er nimmt kaum Resourcen ein, ein Raspberry PI der ersten generation würde den auch schultern können und sich langweilen wie ihr seht.

Last but noch least müssen wir im Router, in folgenden eine Fritzbox noch einen Port 22 auf machen und ihn an den Docker host mit dem Port 2222 weiterleiten. Wir wollen ja so tun als hätten wir ein verwundbares Gerät im Internetz.

das Netzwerkgerät auswählen und auf „Neue Freigabe“

Fertig ist eure Teergrube um Bots zu fangen und zu nerven. Damit macht ihr das Internet ein stück sicherer.
Viele Bots verlieren mit der Zeit auch das Interesse an der IP wenn sie merken das sie hier nicht weiterkommen, noch ein Pluspunkt.

So, wenn ihr jetzt aber auch zu den Menschen gehört die jetzt wissen wollen wieviel Zeit hab ich denn bei den Bots jetzt verschwendet ? Dann geht in euren DSM Aufgaben Planer:

Lasst den task als „root“ laufen, lasst euch das Ergebnis per E-Mail zusenden und gebt bei Benutzerdefiniertes Script folgendes ein:

docker logs tarpit > /volume1/docker/ssh-tarpit/log/endlessh.log && echo „7 Tage Auswertung des ssh-tarpit:“ && echo „—————————“ && grep -i ‚time‘ /volume1/docker/ssh-tarpit/log/endlessh.log | echo „Angreifer:“ $(awk -v date=“$(date +’%Y-%m-%d‘ –date ‚7 days ago‘)“ -F, ‚{if($1>date){print $0}}‘ | wc -l) &&grep -i ‚time‘ /volume1/docker/ssh-tarpit/log/endlessh.log | awk -v date=“$(date +’%Y-%m-%d‘ –date ‚7 days ago‘)“ -F, ‚{if($1>date){print $0}}‘ | cut -f6 -d “ “ | cut -f2 -d „=“ | awk ‚{ SUM += $1; print $1 } END {print SUM/60}‘ | awk ‚{printf „Verschwendete Zeit in Minuten: “ „%.2f\n“, $1}’| tail -1 && grep -i ‚time‘ /volume1/docker/ssh-tarpit/log/endlessh.log | awk -v date=“$(date +’%Y-%m-%d‘ –date ‚7 days ago‘)“ -F, ‚{if($1>date){print $0}}‘ | cut -f6 -d “ “ | cut -f2 -d „=“ | awk ‚{ SUM += $1; print $1 } END {print SUM/60/60}‘ | awk ‚{printf „Verschwendete Zeit in Stunden: “ „%.2f\n“, $1}’| tail -1 && grep -i ‚time‘ /volume1/docker/ssh-tarpit/log/endlessh.log | awk -v date=“$(date +’%Y-%m-%d‘ –date ‚7 days ago‘)“ -F, ‚{if($1>date){print $0}}‘ | cut -f6 -d “ “ | cut -f2 -d „=“ | awk ‚{ SUM += $1; print $1 } END {print SUM/60/60/24}‘ | awk ‚{printf „Verschwendete Zeit in Tage: “ „%.2f\n“, $1}’| tail -1
echo “ „

ggfs müsst ihr die Pfade anpassen. Das sieht dann so aus:

Was macht der Monstertext da ?

Zuerst mal holt er sich die Log files und schreibt sie ins Docker Verzeichnis und sucht mit „grep“ nach im Logfile nach Anzahl der Angreifer, Verbindungszeiten und rechnet das ganze in Minuten, Stunden und Tage um.

Das Ergenis sieht etwa so aus:

In meinen Fall lass ich die letzten 7 Tage nur auswerten. Bei bedarf kann man den „Monstertext“ leicht anpassen auf jeden anderen Zeitraum, z.b. alle 28 tage. alle 31 tage. Der genutzte Befehl „AWK“ würde auch 1 Month ago verstehen oder 4 weeks ago.