sshd_config härten: eine Checkliste zum Testen

Legen Sie Ihre Einstellungen in eine Drop-in-Datei wie /etc/ssh/sshd_config.d/10-hardening.conf: PermitRootLogin no, PasswordAuthentication no, KbdInteractiveAuthentication no, AllowUsers mit Ihrem Login sowie niedrigere Werte für MaxAuthTries und LoginGraceTime. Prüfen Sie mit sudo sshd -t, laden Sie sshd neu und testen Sie eine neue Anmeldung, während Ihre aktuelle Sitzung offen bleibt.

Brauchen Sie einen funktionierenden Schlüssel-Login, bevor Passwörter abgeschaltet werden? Wardterm installiert Ihren Schlüssel in einem Schritt auf dem Server. Zeigen

Aktualisiert am . Konfiguration, sshd -t, sshd -T, sshd -T -C und jede hier gezeigte Ablehnung wurden mit OpenSSH 10.0p1 unter Debian 13 in einem Wegwerf-Container ausgeführt, mit einem OpenSSH-10.3-Client unter macOS.

Sitzung beim Testen offen halten

Das Neuladen von sshd beendet bestehende Verbindungen nicht. In unserem Test lief eine vor dem Reload geöffnete Sitzung weiter und endete danach normal. Lassen Sie also eine Sitzung mit root-Fähigkeit offen und testen Sie alles aus einem zweiten Terminal. Sperrt eine Einstellung Sie aus, beheben Sie das aus dem ersten.

Bevor Sie PasswordAuthentication no setzen, stellen Sie sicher, dass eine Schlüssel-Anmeldung funktioniert. Siehe SSH-Passwort-Anmeldung deaktivieren.

Drop-in-Datei nutzen und wissen, dass der erste Wert gewinnt

Bei den meisten Einstellungen behält sshd den ersten Wert, den es liest. Debian und Ubuntu haben Include /etc/ssh/sshd_config.d/*.conf am Anfang von sshd_config, ein Drop-in schlägt also eine Zeile weiter unten in der Hauptdatei. Auf unserem Testsystem hatte die Hauptdatei PasswordAuthentication yes in Zeile 125, und das Drop-in mit no gewann.

Dateien in diesem Ordner werden in der Reihenfolge ihrer Namen gelesen, und manche Cloud-Images bringen eigene mit, eine niedrige Nummer wie 10- ist also eine sichere Wahl. Hat Ihr System keine Include-Zeile, bearbeiten Sie sshd_config direkt und setzen die Einstellungen vor jeden Match-Block.

Die Einstellungen

# /etc/ssh/sshd_config.d/10-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers deploy
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
EinstellungUpstream-StandardWas die Änderung bewirkt
PermitRootLogin noprohibit-passwordroot kann sich gar nicht anmelden, auch nicht mit Schlüssel. Man meldet sich als man selbst an und nutzt sudo, was festhält, wer was getan hat.
PasswordAuthentication noyesBeseitigt das Passwort-Raten als Angriff.
KbdInteractiveAuthentication noyesSchließt den anderen Weg zu einer Passwortabfrage. Lassen Sie es an, wenn Sie Einmalcodes über PAM nutzen.
AllowUsers deployNicht gesetzt: jedes Konto kann es versuchenNur die aufgeführten Konten können sich anmelden. Ein Tippfehler hier sperrt alle aus, deshalb bleibt die erste Sitzung offen.
MaxAuthTries 36Weniger Versuche pro Verbindung. Jeder von einem Client angebotene Schlüssel zählt, ein Client mit vielen Schlüsseln kann also an die Grenze stoßen. Siehe Too many authentication failures.
LoginGraceTime 30120 SekundenNicht authentifizierte Verbindungen werden früher getrennt.
X11Forwarding nono, aber die Datei von Debian setzt yesSchaltet eine Funktion ab, die die meisten Server nie nutzen.
AllowAgentForwarding noyesSiehe die Risiken von Agent-Forwarding.
AllowTcpForwarding noyesVerhindert SSH-Tunnel über diesen Server und seine Nutzung als Jump-Host. Setzen Sie es nicht, wenn Sie eines von beidem nutzen.

Das Handbuch ist bei einer Grenze eindeutig: Das Abschalten von TCP-Forwarding verbessert die Sicherheit nicht, solange Benutzern nicht auch die Shell verweigert wird, denn wer eine Shell hat, kann seinen eigenen Forwarder ausführen. Betrachten Sie es als Aufräumen für Konten mit Shell und als echte Einschränkung nur für Konten ohne.

Lassen Sie MaxStartups und PerSourcePenalties auf ihren Standardwerten, wenn Sie keinen Grund haben. Sie bremsen in aktuellen Versionen bereits Verbindungsfluten.

Vor dem Neuladen prüfen

sshd -t prüft Syntax und Host-Schlüssel. Es gibt nichts aus, wenn alles in Ordnung ist. Ein Tippfehler liefert einen Fehler und einen Exit-Code ungleich null:

$ sudo sshd -t
/etc/ssh/sshd_config.d/99-typo.conf: line 1: Bad configuration option: PermitRootLogn
/etc/ssh/sshd_config.d/99-typo.conf: terminating, 1 bad configuration options

sshd -T gibt die Werte aus, die sshd nach dem Zusammenführen aller Dateien wirklich verwenden wird. Die Namen erscheinen in Kleinbuchstaben:

sudo sshd -T | grep -iE '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication|allowusers|maxauthtries|logingracetime|x11forwarding|allowagentforwarding|allowtcpforwarding) '

Nutzen Sie Match-Blöcke, ergänzen Sie -C, um das Ergebnis für eine bestimmte Verbindung zu sehen:

sudo sshd -T -C user=deploy,host=example.com,addr=203.0.113.10 | grep -i allowtcpforwarding

sshd -T liest die Dateien auf der Platte, nicht das, was der laufende Daemon geladen hat. Es zeigt, was Sie nach dem Reload erhalten.

Neu laden und aus einem zweiten Terminal testen

# Debian, Ubuntu
sudo systemctl reload ssh
# Red Hat family
sudo systemctl reload sshd

Probieren Sie dann jeden dieser Befehle. Der erste muss gelingen, die anderen müssen scheitern:

ssh deploy@server 'echo ok'
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password deploy@server
ssh root@server
ssh -N -L 8022:127.0.0.1:22 deploy@server

Der letzte Befehl scheitert nicht bei der Anmeldung. Er verbindet sich, und der Forward wird abgelehnt, sobald Sie den lokalen Port nutzen. Das Server-Log zeigt dann eine Zeile wie diese:

refused local port forward: originator 127.0.0.1 port 63434, target 127.0.0.1 port 22

Ein abgelehnter Root-Login erscheint im Log als User root from 203.0.113.10 not allowed because not listed in AllowUsers.

Moderne Algorithmen: nur wenn Sie sie einschränken müssen

Die aktuellen OpenSSH-Standards sind gut. Unter OpenSSH 10.0 beginnt die Standardliste für den Schlüsselaustausch mit dem hybriden Post-Quanten-Verfahren mlkem768x25519-sha256. Eigene Listen bedeuten, dass Sie sie pflegen müssen, tun Sie es also, wenn ein Audit es verlangt oder Ihr System alt ist. Dieser Satz behält nur moderne Optionen:

KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

Ältere OpenSSH-Versionen kennen einige dieser Namen nicht. Führen Sie auf dem Server ssh -Q kex, ssh -Q cipher und ssh -Q mac aus und entfernen Sie, was nicht aufgeführt ist. Prüfen Sie, was ein Client wirklich aushandelt:

ssh -v deploy@server true 2>&1 | grep -E 'kex: algorithm|server->client cipher'

Alte Clients und Geräte scheitern mit dieser Meldung, für die es eine eigene Anleitung gibt:

Unable to negotiate with 203.0.113.10 port 22: no matching key exchange method found.

Diese Liste entfernt auch die NIST-Kurve und Diffie-Hellman-Austausche, testen Sie also jedes Gerät und jedes Skript, das sich mit dem Server verbindet, bevor Sie sie behalten.

Was das nicht abdeckt

Diese Einstellungen verkleinern, was gegen sshd versucht werden kann. Sie patchen OpenSSH nicht, halten Sie es also aktuell. Sie begrenzen auch nicht, was ein angemeldeter Benutzer tun kann. Bei wiederholten Angriffen in Ihren Logs siehe fail2ban für SSH.

Wer es versucht, zeigt SSH-Anmeldeversuche prüfen.

Fragen

Beendet ein Reload von sshd meine offene SSH-Sitzung?

Nein. Bestehende Sitzungen laufen nach dem Reload weiter. Nur neue Anmeldungen nutzen die neuen Einstellungen, deshalb testen Sie in einem zweiten Terminal.

Wohin gehören eigene sshd-Einstellungen?

In eine Datei unter /etc/ssh/sshd_config.d/ mit niedriger Nummer, etwa 10-hardening.conf. sshd behält den ersten gelesenen Wert, eine früh gelesene Drop-in-Datei gewinnt also.

Wie prüfe ich sshd_config auf Fehler?

Führen Sie sudo sshd -t aus. Bei gültiger Konfiguration gibt es nichts aus, sonst einen Fehler mit einem Exit-Code ungleich null.

Quellen

Mehr zu Server absichern

Alle Anleitungen