Good to Know Database

CentOS 5: SSH vor Brute-Force-Angriffen schützen


Wie ich unter www.gtkdb.de/index_7_744.html beschrieben habe, können Sie mit BruteSSH sehr leicht einen Brute-Force-Angriff auf einen SSH-Server durchführen. Es gibt verschiedene Methoden wie man sich gegen einen SSH-Brute-Force-Angriff schützen kann. Hierzu zählen unter anderem die Python-Skripte DenyHosts und fail2ban, welche die Logdatei /var/log/auth.log nach fehlgeschlagenen Anmeldeversuchen durchsuchen und die IP-Adresse des Angreifers in die Datei /etc/hosts.deny eintragen beziehungsweise bei fail2ban eine Firewall-Regel erstellen um den Angreifer zu blockieren.

Eine andere Methode sich vor SSH-Brute-Force-Angriffen zu schützen bietet das iptables-Modul recent welches Bestandteil des Linux-Kernels ist und zur Laufzeit geladen wird. Damit können Verbindungsversuche von einer IP-Adresse zu einem bestimmten Service mitgezählt und beim Überschreiten einer gewissen Anzahl geblockt werden.

Weil das iptables-Modul recent auf der Paketebene arbeitet, kann es nicht zwischen erfolgreichen und fehlgeschlagenen Anmeldeversuchen unterscheiden. Dies kann eventuell zu einem Problem führen, wenn von einem System mehrere SSH-Sitzungen in einem kurzen Zeitraum aufgebaut werden. Das Problem lässt sich aber durch einen sorgfälltig gewählten Schwellwert vermeiden. Als Schwellwert wird die maximale Anzahl von Verbindungsversuchen in einem festgelegten Zeitintervall festgelegt.

Im folgenden Beispiel sollen innerhalb von einer Stunde maximal 5 Verbindungsversuche zugelassen werden. Weiterhin soll eine sogenannte Whitelist angelegt werden, in welcher Clients eingetragen werden, welche dieser Beschränkung nicht unterliegen sollen.

Zuerst erstellen Sie für die SSH-Firewall-Regeln und die SSH-Whitelist jeweils eine eigene Firewall-Chain.

[root@centos5 ~]# iptables -N SSH-BruteForce
[root@centos5 ~]# iptables -N SSH-Whitelist

Die erste Regel welche wir der Firewall-Chain SSH-BruteForce hinzufügen, schreibt bei einem neuen Verbindungsaufbau mit dem TCP-Port 22 die IP-Adresse des Clients mit einem Zeitstempel in die Datei /proc/net/ipt_recent/SSH.

[root@centos5 ~]# iptables -A SSH-BruteForce -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

Durch die zweite Regel wird die Whitelist eingebunden. Sollte dort eine Regel für die IP-Adresse des Clients existieren, wird diesem Zugang gewährt.

[root@centos5 ~]# iptables -A SSH-BruteForce -p tcp --dport 22 -m state --state NEW -j SSH-Whitelist

Wenn ein weiterer SSH-Verbindungsaufbau von einem Client eingeht, welcher nicht in der Whitelist aufgeführt ist, fügt die dritte Regel einen weiteren Zeitstempel in die Datei /proc/net/ipt_recent/SSH ein (--update) und überprüft, ob die maximale Anzahl von Verbindungsversuchen (--hitcount) innerhalb des definierten Intervalls (--seconds) erreicht wurde. Sollte der Schwellwert erreicht worden sein, werden alle weiteren Pakete des Clients an den TCP-Port 22 ohne Rückmeldung verworfen.

[root@centos5 ~]# iptables -A SSH-BruteForce -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 6 --rttl --name SSH -j DROP

Damit die Firewall-Chain SSH-BruteForce aktiv wird, müssen Sie diese in die Firewall-Chain INPUT einbinden. Beachten Sie hierbei bitte unbedingt die Reihenfolge der einzelnen Regeln. Sollte bereits eine vorhergehende Regel alle Pakete an den TCP-Port 22 erlauben, wird der gewünschte Effekt ausbleiben.

[root@centos5 ~]# iptables -I INPUT -j SSH-BruteForce

Wenn Sie einem Client den unbeschränkten Zugang auf den SSH-Server gewähren wollen, fügen Sie für dessen IP-Adresse (-s) die folgende Regel in die Firewall-Chain SSH-Whitelist ein.

[root@centos5 ~]# iptables -A SSH-Whitelist -s 192.168.10.10 -m recent --remove --name SSH -j ACCEPT

Mit dem folgenden Befehl können sie die Firewall-Regeln überprüfen.

[root@centos5 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
SSH-BruteForce  all  --  anywhere             anywhere
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain SSH-BruteForce (1 references)
target     prot opt source               destination
           tcp  --  anywhere             anywhere            tcp dpt:ssh state NEW recent: SET name: SSH side: source
SSH-Whitelist  tcp  --  anywhere             anywhere            tcp dpt:ssh state NEW
DROP       tcp  --  anywhere             anywhere            tcp dpt:ssh state NEW recent: UPDATE seconds: 60 hit_count: 4 TTL-Match name: SSH side: source

Chain SSH-Whitelist (1 references)
target     prot opt source               destination
ACCEPT     all  --  192.168.10.10        anywhere            recent: REMOVE name: SSH side: source

Die Einträge in der Datei /proc/net/ipt_recent/SSH sehen wie folgt aus.

[root@centos5 ~]# cat /proc/net/ipt_recent/SSH
src=192.168.10.11 ttl: 64 last_seen: 2739621 oldest_pkt: 13 2739510, 2739511, 2739511, 2739511, 2739511, 2739511, 2739511, 2739511, 2739511, 2739612, 2739612, 2739621, 2739621, 2732764, 2732764, 2739365, 2739365, 2739365, 2739365, 2739510

Der folgende Befehl löscht die gesamte Liste mit den IP-Adressen und den gespeicherten Zeitstempeln.

[root@centos5 ~]# echo clear > /proc/net/ipt_recent/SSH

Eine einzelne IP-Adresse und die dazugehörigen Zeitstempel löschen Sie wie folgt aus der Liste.

[root@centos5 ~]# echo -192.168.10.11 > /proc/net/ipt_recent/SSH

Weiterführende Tutorials

iptables: IPv4-Firewall-Regeln dauerhaft speichern


Dieser Eintrag wurde am 01.09.2009 erstellt und zuletzt am 24.01.2016 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_33_745.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer