Nachdem ich fail2ban installiert habe und eine Weile das Logging per Mail aktiv gelassen habe und der Schwall an fehlgeschlagenen Versuchen über den ssh Port in meine Server einzubrechen nicht geringer wurde, habe ich beschlossen die betreffenden Länder für den ssh Port komplett zu sperren. Dies galt im besonderen China und Russland, von wo aus die meisten Angriffe stammten.
Glücklicherweise gibt es einige Listen mit Subnetzlisten die man zum Filtern von Traffic aus verschiedenen Ländern verwenden kann. Um diesen Filter zu realisieren benötigt man das xtables-addons-common package sowie die xt_geoip Datenbank.
Außerdem müssen die Kernel Sourcen und die Build-Tools installiert sein, da die Module bei der Installation gebaut werden.
Die folgenden Befehle müssen alle mit root Berechtigungen durchgefürt werden.
Das Paket xtables-addons-common ist in den offiziellen Repositories zu finden. Zusätzlich benötigt man für das Parsen der GeoIP Datenbank das Paket libtext-csv-xs-perl.
Damit wird xtables aus den Quellen erzeugt und die entsprechenden Module erzeugt.
Ob die Installation erfolgreich war, kann man testen, indem man folgenden Befehl ausführt:
Wenn der Befehl erfolgreich ausgeführt werden konnte und die Hilfeseite angezeigt wird, hat die Installation sehr warscheinlich funktioniert.
Im nächsten Schritt laden wir die GeoIP CSV Datenbank herunter.
Am 02.01.2019 wurde die Pflege der GeoLite Legacy Datenbank eingestellt. Beim Versuch die Datei GeoIPCountryCSV.zip herunterzuladen bekommt man einen 404 Not Found.
Glücklicherweise gibt es die neue GeoLite2 Database, die man mit Hilfe des Projektes GeoLite2xtables zu der alten GeoLite Legacy Datenbank kovertieren kann. Dazu müssen die Pakete
- curl
- unzip
- per
- Perl Modul NetAddr::IP
installiert sein.
Die neuen Scripte installiert man sich in dem man das Git Repository cloned:
Dabei werden die Datenbanken nicht mehr mit /usr/lib/xtables-addons/xt_geoip_dl heruntertgeladen sondern mit den Scripten 00_download_geolite2 und 10_download_countryinfo. Die Konvertierung übernimmt das Script 20_convert_geolite2.
Seit dem 30.12.2019 gibt es mal wieder Änderungen was den Download der Dateien angeht. Die Dateien sind aufgrund einer Gesetzesänderung in den USA nicht mehr offen zugänglich. Glücklicherweise hat MaxMind einen Weg gefunden die Dateien trotzdem bereitzustellen. Dazu muss man folgende Dinge tun:
- Einen kostenlosen Account bei MaxMind erstellen.
- Den Link in der E-Mail anklicken und das Passwort setzen
- Einen Lizenz-Key erstellen
- Das Downloadscript 00_download_geolite2 aus dem GeoLite2xtables Git-Repository händisch anpassen
In der Datei 00_download_geolite2 muss die Zeile
gegen diese ersetzt werden:
Der Marker [Lizenz-Key] muss mit dem gerade erzeugten Lizenz-Key von MaxMind ersetzt werden. Anschließend funktioniert das Script wieder wie vor den Änderungen von Dezember 2019.
Um die Datenbank regelmäig zu aktualiseren fasst man die benötigten Befehle zu einem Script zusammen:
und lässt dieses über einen Cronjob regelmäßig laufen:
Im folgenden ist die alte Vorgehensweise zu finden, diese ist nur der Vollständikeit halber drin, wird aber nicht mehr funktionieren.
Damit werden zwei Dateien in das aktuelle Verzeichnis heruntergeladen, eine für IPv4 und eine für IPv6. Auf einem meiner Server wurde die IPv4 Datei nicht automatisch entpackt. Sollte das passieren, muss diese noch manuell entpackt werden:
Im letzten Schritt werden diese Daten in xtables importiert damit man diese mit iptables verwenden kann. In diesem Schritt benötigen wir übrigens das Paket libtext-csv-xs-perl, welches wir oben installiert haben.
Hier sollte man darauf achten, ob sowohl bei IPv6 also auch bei IPv4 mehr als 0 ranges angezeigt werden. Sind z.B. alle IPv4 ranges 0, dann hat man ggf. vergessen die zip Datei zu entpacken.
Zum Schluss können wir die CSV/ZIP Dateien wieder löschen, da die Daten jetzt importiert sind.
Damit man sich nun nicht versehentlich aussperrt kann man eine Rule anlegen die einem auf jeden Fall den Zugriff ermöglicht.
Zum Testen benötigt man dann aber ein weiteres System mit einer anderen externen IP-Adresse.
Um nun alle IP-Adressen bestimmter Länder für einen Port wie z.B. ssh zu blockieren führt man folgendes aus:
Damit werden jetzt Verbindungsversuche über das tcp Protokoll auf den Port 22 (ssh) aus den genannten Ländern verworfen.
Leider gibt es eine Einschränkung bei iptables. Man kann nicht mehr als 10 Länder angeben. Daher muss man ggf. die Regel invertieren und Länder angeben aus denen der Zugriff erlaubt sein soll.
Um die Regel persistent zu machen, kann man das Paket iptables-persistent benutzen. Vor der Installation sollte man aber fail2ban stopppen, da man bei der Installation die Möglichkeit hat aktuell bestehende Filterregeln dauerhaft zu sichern. Da fail2ban diese dynamisch anlegt, macht es Sinn dies vorher zu deaktivieren.
Für die Installation führt man dann folgenden Befehl aus:
Das Abspeichern der aktuell verwendeten Regeln kann man mittels iptables-save jederzeit erneut durchführen:
Aus der Datei entfernt man dann alles was man nicht braucht und speichert diese wieder ab.
Die Datei könnte im einfachsten Fall so aussehen:
Das Paket iptables-persistent kümmert sich jetzt darum dass diese Regeln bei jedem Neustart wieder geladen werden.
Benutzt man Ufw, dann kann man die Regel z.B. in die Datei /etc/ufw/before.rules eintragen:
Damit sollte die Regel bei jedem Systemstart geladen werden.
Welches Land welchen Ländercode hat, sieht man übrigens wenn man xt_geoip_build ausführt. Außerdem kann man diese in der CSV Datei einsehen. Alternativ kann man diese auch auf https://www.iso.org/obp/ui/#search suchen.
Wenn man fail2ban so einstellt, dass man bei jedem Block eine Mail mit den whois Daten des Angreifers bekommt, kann man die Liste mit den Länderkürzeln so sukzessive erweitern bis man endlich wieder beruhigt schlafen kann.
Auf meiner JiffiyBox wollte die Installation nicht so richtig klappen. Das xtables Paket lies sich ohne Probleme installieren und auch die Hilfeseite von iptables zu geoip wurde korrekt angezeigt. Wenn ich aber versucht habe eine Regel anzulegen welche die Option --source-country verwendet hatte kam es immer zu der Fehlermeldung:
No chain/target/match by that name.
Es hat sich herausgestellt dass die notwendigen Kernel-Module, darunter auch das xt_geoip Modul, nicht erzeugt werden konnten, weil die JiffyBox einen speziell angepassten Kernel verwendet für den DomainFactory keine Sourcen bereitstellt.
Die Lösung war den Server auf den Distributionskernel umzustellen, die Kernel header herunterzuladen, das Paket xtables-addons-common zu deinstallieren und wieder neu zu installieren.
Bei dieser Installation dann wurden die Module gebaut und das GeoIP Modul lies sich erfolgreich laden mit: