Heute mussten einige Veränderungen an meinem SSH-Daemon vorgenommen werden. Diese Gelegenheit habe ich gleich genutzt, um diverse Sicherheitsverbesserungen einzuführen.

1. Port ändern

Streng betrachtet verbessert dieser Schritt die Sicherheit des SSH-Daemons nicht. Andererseits werden durch diese Maßnahme 98% aller automatisierten script kiddy Attacken abgewehrt. SSH läuft standardmäßig auf Port 22.
In /etc/ssh/sshd_config ändert man die Zeile

Port 22

in einen beliebig anderen Port über 1024 und schon laufen die meisten Brute-Force Attacken in Leere. (Nicht vergessen die Firewall entsprechend anzupassen)

2. Root Zugriff verbieten

Durch die Zeile

PermitRootLogin no

in der /etc/ssh/sshd_config verhindert man, dass sich der Root-User per SSH anmelden kann. Es können sich also nur noch normale User anmelden, wodurch eine weitere Barriere entsteht, beziehungsweise ein weiteres Passwort nötig ist, um Root-Zugang zu erhalten.

3. Verbindungsaufbau beschränken per SSH

Ebensfalls in der /etc/ssh/sshd_config ist die Direktive MaxStartups zu finden. Der Standardwert liegt bei 10. Das heißt es können zehn (noch unauthentifizierte) Verbindungen zum SSH-Server aufgebaut werden. Alle weiteren Verbindungen werden von SSH automatisch abgelehnt. Abhängig von der Anzahl der User, die sich auf dem System regelmäßig anmelden, kann man diese Direktive nun anpassen.

MaxStartups 3:30:10

Die drei durch Doppelpunkt getrennten Zahlen stehen für start:rate:full.
Die erste Zahl bestimmt, ab wann die Zugriffe beschränkt werden sollen. Die zweite Zahl, wie viel Prozent der Verbindungen abgelehnt werden sollen und die dritte Zahl bestimmt, ab wann 100% der Verbindungen abgelehnt werden. Die obenstehende Zeile bewirkt also, dass ab drei noch unauthentifizierten Verbindungen 30% weiterer Verbindungen zufällig abgelehnt werden. Die Rate steigt linear und sobald zehn unauthentifizierte Verbindungen bestehen, werden alle weiteren Verbindungen automatisch abgelehnt.
Gleichzeitig sollte man die

LoginGraceTime 120

reduzieren. Dies ist die Zeit in Sekunden, die ein User hat um sich erfolgreich zu authentifizieren, also sein Passwort einzugeben. 120 Sekunden ist viel zu großzügig bemessen. Ein Wert von 30 sollte hier mehr als ausreichen.

Ich habe mich allerdings gegen diese Methode Verbindungen zu beschränken entschieden. Denn wenn ein Angreifer entscheidet den SSH-Port zu hammern, können sich auch wohlgesonnene Benutzer nicht mehr am System anmelden. Stattdessen habe ich mich für die nun folgende Lösung entschieden.

4. Verbindungsaufbau beschränken per iptables

iptables kann dazu benutzt werden Verbindungsversuche die von einer bestimmten IP kommen zu zählen und nach Erreichen einer bestimmten Anzahl weitere Verbindungsversuche zu verbieten. Dies geht mit Hilfe des Moduls recent sogar recht einfach.

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP

1. Zeile: -m state –state NEW bewirkt, dass nur neue Verbindungen betrachtet werden. -m recent –set bewirkt, dass die IP des Rechners der die Verbindung aufbauen wollte in der recent list gespeichert wird. Diese wird dann in der zweiten Zeile verwendet.

2. Zeile: –update überprüft, ob die IP des Zugriffs bereits in der recent list steht. –seconds 60 betrachtet nur Verbindungen innerhalb der letzten Sekunden. –hitcount 3 trifft zu, wenn drei oder mehr Verbindungsversuche gemacht wurden.
Zusammengenommen wird diese Regel also ausgeführt, wenn:
Die IP des verbindungsaufbauenden Rechners bereits in der recent list steht und
der letzte Verbindungsaufbau von dieser IP nicht länger als 60 Sekunden her ist und
drei oder mehr Verbindungsversuche geschehen sind.

Trifft die Regel zu wird das Paket gedropt.

5. Sichere Passwörter

Dies ist eigentlich so selbstverständlich, dass ich es fast nicht erwähnen möchte. Ein sicheres Passwort sollte folgenden Bedingungen entsprechen.

  • Acht oder mehr Zeichen
  • Groß- und Kleinbuchstaben enthalten
  • Zahlen enthalten
  • Sonderzeichen (wie &,”,€,µ,?,µ) enthalten

Ob die gewählten Passwörter gut genug sind, kann mit Programmen wie john the ripper getestet werden.

6. Weitere Absicherungen

Je nach Anwendungsfall gibt es noch weitere Möglichkeiten, die ich zumindest erwähnen möchte:

  • Zugriff auf bestimmte IP beschränken (per sshd und/oder iptables)
  • Zugriff auf bestimmte User oder Usergruppen beschränken
  • Passwortauthentifizierung deaktivieren – Login per public/private key
  • IP blacklisten über denyhosts

Quellen

Using iptables to rate-limit incoming connections
Security Paranoia – restricting ssh access
Securing SSH
HOWTO: Five steps to a more secure SSH

Tags: , , , , , , , ,

Written by Tister | Author's Website