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:~>