Wer einen Server betreibt, muss sich leider auch mit drölftausend Bots herumschlagen. Um für ein bisschen mehr Ruhe in seinen Logs zu sorgen, kann Geoblocking ganz hilfreich sein. Sprich: nur IPs aus bestimmten Ländern überhaupt für den SSH Login Versuch zu zu lassen.
Um dies auf einem Ubuntu Server einzurichten, sind folgende Schritte nötig:
1.) Auf dem Server die nötigen Pakete installieren:
$ apt install mmdb-bin geoipupdate
2.) sich bei maxmind.com einen Account für den Zugriff auf die Geo-Datenbanken zu beschaffen:
https://www.maxmind.com/en/geolite2/signup
Dort muss man sich dann einen License Key anlegen und in der Datei /etc/GeoIp.conf seine Credentials hinterlegen.
https://dev.maxmind.com/geoip/geoipupdate/
3.) Auf dem Server geoipupdate starten:
$ geoipupdate -v
4.) Ein Shell Skript erstellen, dass man über die /etc/hosts.deny aufrufen kann. Für meinen Ubuntu Server habe ich das Skript von hier verwendet und an meine Bedürfnisse angepasst unter /usr/local/bin/check_country.sh abgespeichert.
#!/bin/bash
# Requires mmdblookup and the new db type "mmdb".
# exit 1 = allow (false)
# exit 0 = block (true)
# use with tcpwrap in /etc/hosts.deny
GEODB='/var/lib/GeoIP/GeoLite2-Country.mmdb'
ALLOW=('DE')
if [ $# -ne 1 ]
then
exit 1
fi
if [ ! -f $GEODB ]
then
exit 1
fi
IP4PAT='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
IP6PAT='^[0-9a-f]{1,4}:[0-9a-f]{1,4}:[0-9a-f]{1,4}:[0-9a-f]{1,4}:[0-9a-f:]+$'
VALID=$(echo $1 | grep -E "(${IP4PAT}|${IP6PAT})")
if [ -z "$VALID" ]
then
exit 1
fi
CNTRY=$(mmdblookup -f $GEODB -i $1 country iso_code 2>/dev/null| grep utf8_string | cut -d '"' -f 2)
if [ -z "$CNTRY" ]
then
exit 1
fi
for i in "${ALLOW[@]}"
do
if [ "$i" == "$CNTRY" ]
then
logger -t 'CheckCountry' "Permitting $1 ($CNTRY) to authenticate."
exit 1
fi
done
# allowed and unknown got sortet out, slow down and block the rest
sleep 1
exit 0
5.) In der Datei /etc/hosts.deny folgende Zeile hinzufügen:
sshd: ALL : aclexec /usr/local/bin/check_country.sh %a
Danach ist dann erst einmal Ruhe im Karton, bzw. IPs aus anderen Ländern werden grundsätzlich von der Nutzung des SSH Zugangs ausgeschlossen. Bzw. weitere Hacking Versuche irgendwelcher Bots werden im Log in einer Zeile abgefrühstückt. Den Erfolg der Aktion kann man im Log begutachten:
$ cat /var/log/auth.log | grep 'refused'