Intern
  • Außenansicht des Rechenzentrums
Rechenzentrum

Absichern des Zugangs

Absichern des Zugangs

OpenSSH ermöglicht in der Grundkonfiguration den Zugang zum System von beliebigen IP-Adressen aus. Des weiteren können sowohl Passwörter als auch Public Keys gleichermaßen verwendet werden. Je nach Voreinstellungen der Distribution kann ein Angreifer somit versuchen Schwachstellen im SSH-Dienst selbst oder in schwachen / fehlenden Nutzerpassworten (incl. dem Root-Account) über das Netz abzuklappern. Da insbesondere Server i.d.R. nur von einem kleinen Nutzerkreis gepflegt werden und diese wiederum nur von wenigen Clienten aus zugreifen, empfiehlt es sich, durch einfache Maßnahmen die Angriffsfläche einzuschränken.

Einschränkungen können dabei sowohl systemweit als auch auf Nutzerbasis eingerichtet werden. Folgende Maßnahmen sind hierbei unter Unix/Linux-Systemen möglich:

Einschränken auf Public-Key-Zugang

Die sicherste Möglichkeit, einen SSH-Server öffentlich zugänglich zu machen, besteht in der Einschränkung der Authentifizierung auf Public-Key-Authentifizierung. Somit laufen Bruteforce-Wörterbuchattacken ins Leere. Die Einstellungen dazu werden in der SSH-Konfigurationsdatei sshd_config im Verzeichnis /etc/ssh gesetzt. Dort müssen unter anderem folgende Zeilen existieren:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePam no

Damit diese Einstellungen auch übernommen werden, muss der SSH-Dämon noch per "sudo /etc/rc.d/sshd restart" neugestartet werden.

Mehr Informationen und Anleitungen zum Thema Public-Key-Authentisierung und SSH finden Sie hier.

Verwendung der Dateien "/etc/hosts.allow" und "/etc/hosts.deny"

Voraussetzung ist das Paket tcp-wrappers welches bei heutigen Distributionen standardmäßig mitinstalliert wird. Der TCP-Wrapper nimmt bei entsprechend in hosts.allow/hosts.deny eingetragenen Diensten die Verbindungsanfrage vorab entgegen und reicht sie nur dann an den eigentlichen Dienst weiter, falls die anfragende IP unter keine Sperrklausel fällt. Eine abgelehnte Verbindungsanfrage wird im Systemlog protokolliert und die Anfrage ignoriert.

Sinnvolle Einstellungen sehen z.B. wie folgt aus:

/etc/hosts.deny:

sshd: ALL EXCEPT LOCAL

/etc/hosts.allow:

sshd: 132.187.123.1
sshd: 132.187.123.5
sshd: 132.187.125.0/255.255.255.0

Somit kann nur noch von den direkt angegebenen IPs, den IPs aus dem Subnetz und vom lokalen Rechner selbst aus zugegriffen werden. Wird einem Client-Rechner der Zugriff auf den SSH-Server nicht gestattet, so wird die Meldung "ssh_exchange_identification: Connection closed by remote host" clientseitig ausgegeben.

Hinweis: Änderungen in den beiden Dateien hosts.allow und hosts.deny werden sofort auf neue Verbindungen angewandt. Ein Neustart des SSH-Dämons ist nicht notwendig. Bestehende Verbindungen sind jedoch nicht davon betroffen, da der tcp-wrapper diese an den SSH-Dienst weitergereicht hat.

Deaktivieren des direkten Root-Zugangs

In der SSH-Konfigurationsdatei /etc/ssh/sshd_config:
„PermitRootLogin“ auf no ändern

Danach muss der SSH-Dienst neu gestartet werden.

Direkte Root-Logins sind nicht notwendig, da auch nicht-privilegierte Nutzer nach ihrem Login per "su" die Möglichkeit haben, auf den Root-Account bei Bedarf zu wechseln. Dies hat zudem den Vorteil, dass bei mehreren Nutzern mit Zugriff auf den Root-Account nachvollzogen werden kann, wer wann Root gewesen ist. Die Administration eines System wird dadurch deutlich transparenter.

Verlagerung des SSH-Ports

Um den automatisierten SSH-Scans effektiv aus dem Weg zu gehen, kann der SSH-Dienst, der standardmäßig auf dem TCP-Port 22 horcht, auf einen zufälligen höheren Port (z.B. 12345) verlagert werden. Zu beachten ist hierbei, dass dann beim Verbindungsaufbau im SSH-Client dieser Port explizit mit angegeben werden muss. Dies kann z.B. beim OpenSSH-Clienten mit dem Parameter "-p 12345" oder durch folgenden Eintrag in der Datei ~/.ssh/config erfolgen:

Host servername
Port 12345
...

Rate-Limiting per Personal Firewall

Mit dem iptables-Modul "recent" läßt sich relativ einfach ein Rate-Limiting für SSH-Verbindungsversuche erstellen. WIrd innerhalb eines bestimmten Zeitraums von einer IP-Adresse eine festgelegte Zahl von Verbindungsversuchen überschritten, sollen weitere Versuche durch eine Firewall-Regel für eine bestimmte Zeit verhindert werden. In folgendem Beispiel dürfen innerhalb einer Minute nur maximal 3 Verbindungsversuche zum SSH-Port 22 aufgebaut werden. Wird diese Zahl überschritten, wird die Quell-IP-Adresse für eine Minute daran gehindert, weitere Verbindungen aufzubauen.

Setzen der Option MaxAuthTries 3 in der Datei /etc/ssh/sshd_config.

Erstellen folgender (zusätzlicher) iptables-Regeln:
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state ESTABLISHED -m recent --update --seconds 60 --hitcount 2 -j REJECT --reject-with tcp-reset

Weiterführende Informationen

Unter Heise Security gibt es einen Artikel, der sich mit diesem Thema beschäftigt.