Zu Hause hängt an meiner DSL-Leitung ein kleiner Server. Per DynDNS ist die Kiste immer da. Es ist einfach praktisch, sein Zeug immer in der Nähe zu wissen, sobald man online ist. Und Backups nicht mit einem Stick, sondern per SSH heimwärts zu senden, möchte ich einfach nicht mehr vermissen.
Ich weiß nicht genau, was gerade umgeht. Jedenfalls verzeichne ich das letzte halbe Jahr mehrmals die Woche Wörterbuchattacken gegen meinen Server. Das auth.log schwillt an durch Versuche, einen gültigen SSH-Account ohne Passwort zu finden. Die Gegner sind da auch nicht zimperlich, mehrere Anfragen pro Sekunde hämmern auf den sshd ein.
Auf der Suche nach Abhilfe kam mir eine naheliegende Idee: Wenn zu viele Verbindungen innerhalb einer bestimmten Zeit von einer IP aufgebaut werden, wird die IP gesperrt. Da muss sich doch was mit iptables machen lassen! Faul bin ich auch, Fabian hat es nämlich schon gelöst, danke. Er hat das „recent“-Modul von iptables eingespannt.
Die Regeln sorgen dafür, das iptables sich zu jeder neuen Verbindung zu SSH die IP merkt. Ab der vierten neuen Verbindung innerhalb von 60 Sekunden werden alle weiteren Pakete von dieser IP weggeworfen. Es wird dann ein Eintrag im Syslog erzeugt. In die Whitelist kann man IPs eintragen, bei denen der Mechanismus nicht greifen soll.
iptables -N SSH_WHITELIST
iptables -A SSH_WHITELIST -s $GUTE_IP -m recent --remove --name SSH -j sperre
iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A exlog -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix SSH_brute_force_
iptables -A exlog -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Hier ist mein komplettes Firewall-Script: firewall.sh
Jetzt herrscht weitestgehend Ruhe im Karton! Aber schon interessant, womit es so diese Nacht probiert wurde:
Jun 14 18:56:21 localhost sshd[688]: Invalid user deutch from 62.103.159.236
Jun 14 18:56:23 localhost sshd[690]: Invalid user german from 62.103.159.236
Jun 14 18:56:24 localhost sshd[692]: Invalid user hitler from 62.103.159.236
Jun 15 04:26:13 localhost sshd[2437]: Invalid user deutch from 62.103.159.236
Jun 15 04:26:17 localhost sshd[2439]: Invalid user german from 62.103.159.236
(swg)
Da stimme ich dir zu, die lsg. ist definitiv eleganter als die Holzhammermethode mitm Port.
Hätteste…
Ich bin aber nicht der Einzige, der den Server benutzt, da ist es schon ganz gut, wenn der Dienst auf seinem Standardport läuft. Im übrigen sind die Versuche schon auf nur einen pro Woche zurückgegangen. Und elegant gelöst ist es allemal, oder?
Warum einfach wenns auch umständlich geht XD
hättest doch einfach einen Port weit über 15000 genommen, die Brute-Force-Heinis scannen doch eh nich wirklich sondern schnuddeln nur an den Staniports rum, ich habs damit geschafft die angriffe aufn Server innerhalb eines Tages auf null zu schießen und der Brute-Force Wurm ward nie mehr gesehen………
Ach und Henning, MOIN! Winke Winke nach Peter seiner Burg, schick mir doch mal Eiskonfekt oder en Stein…. :)