SSH-Zugang auf Linux-VMs absichern

Motivation

Der OpenSSH- bzw. SSH-Port 22/tcp eines Linux-Systems ist häufiges Angriffsziel. Angreifer versuchen durch Eingabe unsicherer Passwörter meist direkt, aber auch indirekt über "gängige" lokale Kennungen 'root'-Zugang und damit Vollzugriff auf den jeweiligen Host zu erlangen. Zu den unsicheren Passwörtern zählen nicht nur die einfach zu erratenden Ziffern- und Textfolgen, wie '12345678', 'abcdefgh', Datumsangaben, Wörter aus dem Lexikon u.s.w., sondern auch komplexere Zeichenketten, die durch erfolgreiches Ausspionieren ungenügend gesicherter Systeme (weltweit) Bekanntheitsgrad erlangt haben. Meist erfolgen Angriffe automatisiert, indem bestimmte Listen an Passwörtern sukzessive "abgearbeitet" werden.

In der Praxis sind täglich bis zu 10.000 Angriffsversuche auf einen weltweit "sichtbaren" SSH-Port 22/tcp zu beobachten, also etwa alle 10 Sekunden ein Loginversuch! Auch wenn ein komplexes 'root'-Passwort verwendet wird, sollte dieser "Angriffsvektor" soweit wie möglich minimiert werden. Dies verringert zudem "Datenmüll" und somit Unübersichtlichkeit in den Logdateien, weil in der Regel jeder Loginversuch protokolliert wird.

Die empfehlenswerten zwei Schritte zur Absicherung des SSH-Ports sehen wie folgt aus:

Minimieren der SSH-Zugangswege

Bitte setzen Sie, sofern nicht bereits konfiguriert, folgende Lösung für den SSH-Zugang auf Ihr Linux-System (Zielrechner) um:

Der SSH-Zugang ist

  • nur von bestimmten Arbeitsplätzen – Desktops, Laptops, Workstations – mit statischen IP-Adressen oder
  • nur über ein sogenanntes SSH-Gateway mit statischer IP-Adresse oder
  • nur über IP-Adressen aus speziellen Subnetzen¹ möglich.

¹) Zu den speziellen Subnetzen zählt auch der Aufbau einer VPN-Verbindung ins Münchner Wissenschaftsnetz (MWN) mit Zuweisung einer IP-Adresse aus den VPN-Subnetzen. Mittels VPN ist grundsätzlich ein weltweiter Zugriff möglich. Die Liste der VPN-Subnetze ist auf der Seite über die VPN-Technik abrufbar.

Ist die eingeschränkte Auswahl an IP-Adressen oder Subnetzen definiert, wird die Firewall des Zielrechners entsprechend konfiguriert. Ein generelles Öffnen des OpenSSH- bzw. SSH-Ports 22/tcp ist unbedingt zu vermeiden. In der Praxis sind selbst Dienste, wie SSH-Gateways, nur per VPN erreichbar.

Bemerkung: Zusätzlich oder alternativ zur Firewall kann auch ein Netzwerk-Routing konfiguriert werden, indem die sogenannte Default-Route durch Routen zu den notwendigen IP-Adressen ersetzt wird. Dies empfiehlt sich für den Fall, dass alle betriebenen Dienste, also auch Dienste auf anderen Ports, nur für bestimmte IP-Adressen oder Subnetze erreichbar sein müssen.

Login mit 'root'-Kennung unterbinden

Bitte verwenden Sie für den Zugang auf Ihr Linux-System möglichst nicht den 'root'-Login, sondern lokale Kennungen, für die Sie dann mittels 'sudo'-Kommando 'root'-Berechtigung erlangen können. Wie Sie dies einrichten können, erklären die folgenden Schritte:

Einrichten einer lokalen Kennung

Falls noch nicht vorhanden, richten Sie sich bitte eine lokale Kennung für die Administration Ihres Linux-Systems ein. Im folgenden Beispiel lautet die Kennung 'srvadm', eine Kurzform für 'Server-Administrator'. Der lokale User 'srvadm' benötigt u.a. eine User- und Group-ID, abgekürzt UID und GID. Als UID empfiehlt sich eine noch nicht genutzte ID ≥ 1000; als GID kann 100, d.h. die ID für die Gruppe 'users' verwendet werden.

Zur Erforschung, welche UID noch ungenutzt ist, genügt ein Blick auf die dritte, mittels ':' separierte Spalte in '/etc/passwd'. Mit folgendem Bash-Kommando lässt sich der Wert einfach ermitteln:

root@myhost:~> ID=1000; while true; do grep -q ^[^:]*:[^:]*:$ID: /etc/passwd && ((ID++)) || break; done; echo "UID=$ID"
UID=1003

Das vorgenannte Beispiel ergibt die noch ungenutzte UID = 1003. Zusammen mit GID = 100 kann nun der Account wie folgt aktiviert und ein "sicheres" Passwort für 'srvadm' gesetzt werden:

root@myhost:~> useradd -u 1003 -g 100 -c 'Server-Admin' -m -d /home/srvadm -s /bin/bash -p 123 srvadm
root@myhost:~> passwd srvadm
New password: *******
Retype new password: *******
passwd: password updated successfully

Jetzt kann ein SSH-Login mit dem neu angelegten Account 'srvadm' getestet werden. Im Erfolgsfall ist im Beispiel folgendes Ergebnis sichtbar:

me@mypc:~> ssh srvadm@myhost
srvadm@myhost's password: *******
[...]
srvadm@myhost:~>

Bemerkung: Wenn Sie mit dem Einrichten eines passwortfreien SSH-Zugangs mittels Public-Key-Authentifizieruzng vertraut sind, können Sie die entsprechende Anpassung und Ergänzung der o.g. Schritte vornehmen und anschließend wiederum den Login testen.

Zuweisen einer 'sudo'-Berechtigung

Damit der lokale User 'srvadm' nach erfolgreichem Login Administrationsrechte erlangen kann, kommt das 'sudo'-Kommando zum Einsatz. Hierzu genügt es, wenn die Regeln in der Konfigurationsdatei '/etc/sudoers' erweitert werden oder eine Datei mit entsprechender Regel im Unterverzeichnis '/etc/sudoers.d/' platziert wird.

Bemerkung: Falls die Datei '/etc/sudoers' fehlt, muss vorab das 'sudo'-Paket installiert werden.

Im hier beschriebenen Beispiel wird eine zusätzliche Datei namens '/etc/sudoers.d/srvadm' generiert und anschließend die Zugriffsberechtigung reglementiert. Zu beachten ist, dass im Falle eines passwortfreien SSH-Zugangs in der Praxis auch die 'sudo'-Validierung mittels Passwort vermieden und die sogenannte 'NOPASSWD:'-Direktive gesetzt wird. Erfolgt der SSH-Zugang mittels Passwort, kann die sicherere Variante durch Weglassen dieser Direktive konfiguriert werden:

Mit 'sudo'-Validierung:

root@myhost:~> echo "srvadm ALL = (ALL) ALL" > /etc/sudoers.d/srvadm
root@myhost:~> chmod 440 /etc/sudoers.d/srvadm

Ohne 'sudo'-Validierung:

root@myhost:~> echo "srvadm ALL = (ALL) NOPASSWD: ALL" > /etc/sudoers.d/srvadm
root@myhost:~> chmod 440 /etc/sudoers.d/srvadm

Jetzt erfolgt der Test, zur Veranschaulichung mit 'id'-Abfrage und 'sudo'-Validierung; ohne 'sudo'-Validierung entfällt die Passwortabfrage:

srvadm@myhost:~> id
uid=1003(srvadm) gid=100(users) groups=100(users)
srvadm@myhost:~> sudo -i
[...]
[sudo] password for srvadm: *******
root@myhost:~> id
uid=0(root) gid=0(root) groups=0(root)

Deaktivieren des SSH-'root'-Zugangs

Wenn Sie sich erfolgreich mit Ihrer lokalen Kennung anmelden und mittels 'sudo'-Kommando die gewünschte 'root'-Berechtigung erlangen können, wird im letzten Schritt der 'root'-Zugang deaktiviert. Hierzu passen Sie die Datei '/etc/ssh/sshd_config' dahingehend an, dass die Variable 'PermitRootLogin no' gesetzt wird. Im Anschluss wird die geänderte Konfiguration mittels 'reload'-Option aktiviert:

root@myhost:~> systemctl reload sshd.service

Ab jetzt ist ein SSH-Login mit 'root'-Kennung nicht mehr möglich. Trotz Eingabe des korrekten 'root'-Passworts wird ein Login geblockt:

me@mypc:~> ssh root@myhost
Password: *******
Password: *******
Password: *******
root@myhost: Permission denied (publickey,keyboard-interactive).
me@mypc:~>

Ergebnis

Insgesamt ergibt sich aus den vorgenannten Schritten folgender Zugang mit Erlangen der Administrations- bzw. 'root'-Berechtigung:

me@mypc:~> ssh srvadm@myhost
srvadm@myhost's password: *******
[...]
srvadm@myhost:~> sudo -i
[...]
[sudo] password for srvadm: *******
root@myhost:~>