in Linux

SSH Zugriffe mit GeoIP blocken

Die nervigen Brute – Force Attacken auf SSH kennt wohl jeder Admin. Ein sehr wirksames Mittel zum Schutz ist natürlich fail2ban, noch effektiver ist das Deaktivieren der Passwort – Authentifizierung in der sshd_config, aber beide Methoden verhindern nicht die massigen Log-Einträge, die aus den Versuchen resultieren.

Leider bringt SSH von Hause aus keinen Schutzmechanismus mit, der Zugriffe basierend auf den Standort ermöglicht. Mit den Xtable-Addons und ein paar iptables-Regeln lässt sich ein wirksamer Schutz basierend auf den GeoIP – Datenbanken realisieren.

Eine Möglichkeit, das zu implemtieren, zeige ich hier.

Wie immer werde ich das unter Gentoo machen, aber auch alle anderen Distributionen bringen die entsprechenden Pakete mit.

Vorraussetzungen:

  • ein laufendes Linux mit SSH
  • iptables Support im Kernel
  • (empfohlen) ein System-Logger wie syslog-ng oder rsyslog

Notwendige Installationen:

  • Unter Gentoo: Installation der notwendigen Pakete:
    • iptables
    • xtables-addons

Installation unter Gentoo:

Die xtable-addons bringen eine ganze Reihe Addons mit, die man dafür nicht braucht. Welche Module aktiviert werden sollen kann man über die Variable XTABLES_ADDONS in der make.conf angeben:

XTABLES_ADDONS="account condition fuzzy geoip iface ipmark ipv4options length2 logmark lscan psd quota2 rawnat steal sysrq"

Anschließend einfach wie üblich die Pakete installieren:

emerge -av net-firewall/iptables net-firewall/xtables-addons

Nach der Installation der Pakete muss als erstes die Geo-IP Datenbank für die xtable-Addons vorbereitet werden. Die iptables – Plugins erwarten die GeoIP – Daten unter /usr/share/xt_geoip/:

mkdir /usr/share/xt_geoip/
mkdir /tmp/xt_geoip
cd /tmp/xt_geoip
/lib64/xtables-addons/xt_geoip_dl
/lib64/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
cd /tmp
rm -rf /tmp/xt_geoip

Es bietet sich an, aus den Befehlen gleich ein kleines Cron – Script zu basteln, dass die Datenbanken regelmäßig aktualisiert.

Damit ist die Installation auch schon abgeschlossen.

Einrichtung der iptables – Regeln:

Der einfachste Anwendungsbereich ist wohl, alle Zugriffe auf SSH blocken, die nicht aus einem bestimmten Land kommen:

iptables -I INPUT -p tcp --dport 22 -m geoip ! --src-cc DE -j DROP

Natürlich geht auch der umgekehrte Weg, alle Zugriffe blocken, die aus bestimmten Ländern kommen:

iptables -I INPUT -p tcp --dport 22 -m geoip --src-cc CN,KR,UA,RU -j DROP

Ich nutze das in Kombination mit einem eigenen iptables Filter und logge für statistische Auswertungen die jeweiligen Blocks im Syslog:

iptables -N Geo-Filter
iptables -t filter -I INPUT -j Geo-Filter
iptables -A Geo-Filter -m geoip --src-cc CN -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban CN: '
iptables -A Geo-Filter -m geoip --src-cc HK -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban HK: '
iptables -A Geo-Filter -m geoip --src-cc KR -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban KR: '
iptables -A Geo-Filter -m geoip --src-cc UA -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban UA: '
iptables -A Geo-Filter -m geoip --src-cc RU -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban RU: '
iptables -A Geo-Filter -m geoip --src-cc PL -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban PL: '
iptables -A Geo-Filter -m geoip --src-cc US -m limit \
 --limit 3/minute -j LOG --log-prefix 'GeoIP Ban US: '
iptables -A Geo-Filter -p tcp --dport 22 -m geoip --src-cc CN,HK,KR,UA,RU,PL,US -j DROP
iptables -A Geo-Filter -j RETURN

Welche Country – Codes verwendet werden können kann man hier nachlesen: http://dev.maxmind.com/geoip/legacy/codes/iso3166/

Schreibe einen Kommentar

Kommentar