OpenSSH ist ein beliebtes Software-Werkzeug, um sichere SSH-Infrastrukturen aufzubauen. Ich zeige in diesem Blog-Artikel, wie Du die Standardkonfiguration von OpenSSH sowohl unter Ubuntu Server als auch unter Windows Server 2022 und 2019 weiter absichern kannst.
Diskussion
Secure Shell (SSH) ist ein Netzwerkprotokoll zum sicheren Fernsteuern von Netzwerkdiensten über ein unsicheres Netzwerk (z.B. das Internet). OpenSSH ist eine Sammlung von Server- und Client-Komponenten zum Aufbau einer SSH-Infrastruktur. OpenSSH kann sowohl unter Linux als auch unter Windows installiert und genutzt werden.
Die Standardinstallation von OpenSSH versucht einen guten Kompromiss zu finden zwischen maximaler Kompatibilität und maximaler Sicherheit. Man tut gut daran, seine eigene, konkrete OpenSSH-Installation auf mögliche Schwachstellen zu untersuchen. Ziel ist es, die Angriffsfläche des OpenSSH-Dienstes so weit wie möglich zu verkleinern. Wir schauen uns deshalb folgende Maßnahmen genauer an:
- Keinen direkten Root-Zugriff per SSH zulassen
- Keine Kennwort-Authentifizierung bzw. wenn doch, dann nur sehr eingeschränkt.
- Nur wirklich sichere Verschlüsselungsalgorithmen verfügbar machen
- SSH-Port-Forwarding unterbinden
- Diffie-Hellman-Backdoor unterbinden
Die Konfiguration des OpenSSH-Servers ist in einer zentralen Datei gespeichert.
Unter Ubuntu Server 20.04 LTS und 18.04 LTS:
/etc/ssh/sshd_config
Unter Windows Server 2022 und 2019:
C:\ProgramData\ssh\sshd_config
Nach Änderung der Konfiguration muss ein Neustart des OpenSSH-Servers erfolgen.
Unter Ubuntu Server 20.04 LTS und 18.04 LTS:
sudo systemctl restart ssh.service
Unter Windows Server 2022 und 2019 per PowerShell:
Restart-Service sshd
Root-Zugriff unterbinden
Der root user ist unter Linux ein stets vorhandenes Benutzerkonto, das den Super-Administrator des Gesamtsystems repräsentiert. Er hat umfassende Rechte und kann auf alle Dateien, Daten und Kommandos zugreifen. root ist daher prädestiniert für Brute-Force-Attacken auf die Benutzeranmeldung. Unter Ubuntu kann man sich standardmäßig nicht als root
anmelden. Man kann sich nur mit seinem persönlichen Konto anmelden, das weniger Rechte besitzt. Möchte man administrative Aufgaben in Ubuntu übernehmen, muss man sich mittels des Befehls sudo
Administrationsrechte (root privileges) zuweisen lassen.
Auch unter SSH sollte das Anmelden per root
auf alle Fälle deaktiviert werden:
PermitRootLogin no
Unter Windows wird diese Einstellung ignoriert, weil es das root-Benutzerkonzept unter Windows so nicht gibt. Windows besitzt standardmäßig ein Benutzerkonto namens Administrator
. Dieses Konto besitzt volle Administratorenrechte und legt darüber hinaus ein spezielles Verhalten an den Tag:
- Die RID (Relative Identifier) des Kontos ist stets 500.
- Es kann nicht gelöscht werden
- Es kann sich nicht aussperren (z.B. weil zu oft das falsch Kennwort eingetippt wurde).
Auch dieses Konto steht im Fokus von möglichen Brute-Force-Attacken. Aus diesem Grund empfiehlt es sich, das Administratorkonto unabhängig von OpenSSH in der Windows-Benutzerverwaltung zu deaktiveren. Stattdessen legt man für jeden Administrator ein eigenes Konto mit den jeweils notwendigen Rechten an.
Keine Kennwort-Authentifizierung zulassen
Die meisten Tutorials empfehlen eine Anmeldung nur mit SSH-Schlüssel als sicherste Alternative. Bei dieser Methode verlässt der SSH-Schlüssel nicht Deinen Rechner, kann also weder abgefangen noch durch einen Brute-Force-Angriff erraten werden. Folgende Einstellungen sind daher zu empfehlen:
PubkeyAuthentication yes
PasswordAuthentication no
Das Deaktivieren von PasswordAuthentication
unterbindet das Anmelden per Kennwort für alle Benutzer.
Veraltete Verschlüsselung rausschmeißen
Jetzt schauen wir uns die von OpenSSH standardmäßig aktivierten Verschlüsselungsalgorithmen näher an. Ein Test auf SshCheck.com ergibt folgendes Bild (für Ubuntu Server 20.04 LTS):
Das sieht nicht so gut aus. Zahlreiche Algorithmen werden als schwach (weak) gekennzeichnet oder stehen im Verdacht, dass die NSA ein Hintertürchen (backdoor) besitzt. Wir sollten also etwas tun.
Im Prinzip müssen wir nur die Verschlüsselungsalgorithmen abschreiben, die als wirklich sicher gekennzeichnet sind. Wer etwas tiefer in die Materie einsteigen möchte, dem sei der folgende Blog-Artikel empfohlen, der die Verschlüsselungsalgorithmen von OpenSSH diskutiert und auch Konfigurationsempfehlungen abgibt (allerdings: Artikel ist von 2015).
Die folgende explizite Konfiguration sieht auf alle Fälle vielversprechend aus:
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com
Ein erneuter Test auf SshCheck.com ergibt nun folgendes Ergebnis:
SSH-Port-Forwarding unterbinden
SSH-Port-Forwarding bietet die Möglichkeit, unsichere Protokolle (z.B. HTTP) mittels SSH-Tunneling zu schützen. Dieses an sich nützliche Feature birgt einige potentielle Risiken in sich, die gegen den Nutzen von SSH-Port-Forwarding abgewogen werden müssen. Eine ausführliche Erläuterung des Themas findet sich hier.
Daher gilt, wird SSH-Port-Forwarding nicht explizit benötigt, sollte es deaktiviert werden. Folgende Einstellungen sind zu empfehlen:
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no
Diffie-Hellman-Moduli absichern
Laut Empfehlung von Mozilla sollen alle verwendeten Diffie-Hellman-Moduli mindestens 3072 Bit lang sein (sie werden für diffie-hellman-group-exchange-sha256 verwendet).
Kürzere Moduli können unter Ubuntu mit folgendem Doppelbefehl deaktiviert werden:
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.tmp && mv /etc/ssh/moduli.tmp /etc/ssh/moduli
Unter Windows sieht das etwas komplexer aus:
$A = Import-Csv -Path "C:\ProgramData\ssh\moduli" -Delimiter " " -Header '1','2','3','4','5','6','7','8' | Where-Object {($_.5 -match '^\d+$') -and ([int]$_.5 -ge 3071)}
$A | convertto-csv -Delimiter " " -UseQuotes Never | select-object -skip 1 | out-file "C:\ProgramData\ssh\moduli"
Bitte überprüfe die resultierende Datei kurz und starte anschließend den OpenSSH-Server neu. Und ja, Du hättest die Datei moduli
auch einfach in einem Texteditor selber editieren können ;-)
Noch Fragen?
Mehr Infos zur OpenSSH-Konfiguration findest Du natürlich in den OpenSSH-Manpages. Auch das Bundesamt für Sicherheit in der Informationstechnik (BSI) hat einen Technischen Leitfaden zur sicheren Nutzung von SSH herausgegeben.
Artikelhistorie
- 12.03.2021
- Erstveröffentlichung
- 21.01.2022
- Liste der empfohlenen Algorithmen aktualisiert
- Neuer Abschnitt SSH-Port-Forwarding unterbinden
- Neuer Abschnitt Diffie-Hellman-Moduli absichern