OpenSSH absichern

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

Standardkonfiguration von OpenSSH

Standardkonfiguration von OpenSSH

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:

Optimierte Verschlüsselungskonfiguration für OpenSSH

Optimierte Verschlüsselungskonfiguration für OpenSSH

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
Das könnte dich auch interessieren:
  1. GitHub + SSH unter Windows 10
  2. OpenSSH nach PPK unter Windows
  3. Ubuntu Server 20.04 installieren
  4. BitLocker unter Windows 10
  5. Windows 2019 per SSH fernsteuern
Teile diesen Artikel
comments powered by Disqus