Skip to main content

sshd config - gehärtet

###############################################################################
# OpenSSH Server – gehärtete Baseline
#
# Zielplattform:
#   - Rocky Linux 10 / RHEL 10
#   - OpenSSH 9.9 oder neuer
#
# Sicherheitsmodell:
#   - ausschließlich Public-Key-Authentifizierung
#   - keine Root-Anmeldung
#   - keine Legacy-Algorithmen
#   - keine Port-, Agent-, X11- oder Socket-Weiterleitung
#   - keine SSH-Tunnel
#
# Vor produktiver Aktivierung:
#   sshd -t
#   sshd -T
###############################################################################


###############################################################################
# Netzwerk
###############################################################################

# Standardport. Eine Änderung des Ports ist keine wesentliche
# Sicherheitsmaßnahme und erschwert häufig nur Betrieb und Monitoring.
Port 22

# Nur SSH-Protokoll 2 wird von aktuellen OpenSSH-Versionen unterstützt.

# Auf allen IPv4- und IPv6-Adressen lauschen.
# Bei Management-Netzen besser auf konkrete Management-IP-Adressen begrenzen.
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

# Für Systeme mit ausschließlich IPv4 alternativ:
#
# AddressFamily inet
# ListenAddress 192.0.2.10

# Reverse-DNS-Abfragen bei der Anmeldung deaktivieren.
# Verhindert Verzögerungen und Abhängigkeiten von funktionierendem DNS.
UseDNS no

###############################################################################
# Hostschlüssel
###############################################################################

# Ausschließlich Ed25519 als Server-Hostschlüssel.
HostKey /etc/ssh/ssh_host_ed25519_key

# Ausschließlich Ed25519 als Hostkey-Signaturverfahren.
HostKeyAlgorithms ssh-ed25519

# Fingerprints immer als SHA-256 darstellen.
FingerprintHash sha256

# Mindestgröße für eventuell verwendete RSA-Schlüssel.
# Diese Einstellung greift beispielsweise auch bei AuthorizedKeysCommand
# oder abweichenden Match-Blöcken.
RequiredRSASize 3072

###############################################################################
# Kryptografische Verfahren
###############################################################################

# Rekeying nach dem cipherabhängigen Datenlimit und spätestens nach einer Stunde.
RekeyLimit default 1h

# Ausschließlich moderne AEAD-Cipher.
#
# ChaCha20-Poly1305:
#   Besonders performant auf Systemen ohne AES-Hardwarebeschleunigung.
#
# AES-GCM:
#   Besonders performant auf moderner x86-Hardware mit AES-NI.
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com

# MAC-Verfahren sind bei den oben eingesetzten AEAD-Ciphers technisch nicht
# separat erforderlich. Die explizite Liste verhindert jedoch, dass bei einer
# späteren Erweiterung unsichere oder klassische MAC-then-Encrypt-Verfahren
# zugelassen werden.
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# Ausschließlich moderne Key-Exchange-Verfahren:
#
# mlkem768x25519-sha256:
#   Hybrid aus ML-KEM-768 und Curve25519.
#
# sntrup761x25519-sha512:
#   Alternatives hybrides Post-Quantum-Verfahren.
#
# curve25519-sha256:
#   Klassisches modernes elliptisches Diffie-Hellman-Verfahren als Fallback.
KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,curve25519-sha256

###############################################################################
# Benutzerschlüssel und Signaturverfahren
###############################################################################

# Erlaubte Verfahren für die Benutzerauthentifizierung.
#
# ssh-ed25519:
#   normaler Ed25519-Schlüssel
#
# sk-ssh-ed25519@openssh.com:
#   FIDO2-/Security-Key-gestützter Ed25519-Schlüssel
#
# Zertifikatsvarianten:
#   relevant, falls später eine OpenSSH-CA eingesetzt wird
PubkeyAcceptedAlgorithms ssh-ed25519,sk-ssh-ed25519@openssh.com,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com

# Standardpfad für autorisierte Benutzerschlüssel.
AuthorizedKeysFile .ssh/authorized_keys

# Besitzer und Berechtigungen von Home-Verzeichnis, .ssh und authorized_keys
# strikt prüfen.
StrictModes yes

###############################################################################
# Authentifizierung
###############################################################################

# Public-Key-Authentifizierung aktivieren.
PubkeyAuthentication yes

# Explizit ausschließlich einen Public Key als Authentifizierungsmethode
# zulassen.
AuthenticationMethods publickey

# Kennwortbasierte Anmeldung vollständig deaktivieren.
PasswordAuthentication no
PermitEmptyPasswords no

# Keyboard-Interactive umfasst unter anderem PAM-basierte Kennwort- und
# Challenge-Response-Verfahren.
KbdInteractiveAuthentication no

# Historische Bezeichnung für Challenge-Response.
ChallengeResponseAuthentication no

# Hostbasierte Authentifizierung deaktivieren.
HostbasedAuthentication no
IgnoreUserKnownHosts yes
IgnoreRhosts yes

# Kerberos- und GSSAPI-Authentifizierung deaktivieren.
# Nur aktivieren, wenn bewusst eine AD-/Kerberos-Integration genutzt wird.
KerberosAuthentication no
GSSAPIAuthentication no

# PAM bleibt für Account-, Session-, SELinux-, Ressourcenlimit- und
# Zugriffskontrollen aktiv.
#
# UsePAM yes aktiviert nicht automatisch Kennwortauthentifizierung, solange
# PasswordAuthentication und KbdInteractiveAuthentication deaktiviert sind.
UsePAM yes


###############################################################################
# Root und administrative Konten
###############################################################################

# Direkte Root-Anmeldung vollständig verhindern.
PermitRootLogin no

# Anmeldung nur für Mitglieder dieser Gruppe zulassen.
#
# Gruppe vor Aktivierung anlegen:
#   groupadd ssh-access
#
# Benutzer hinzufügen:
#   usermod -aG ssh-access <benutzer>
#
# ACHTUNG:
# Erst aktivieren, nachdem mindestens ein funktionierendes Administratorkonto
# Mitglied der Gruppe ist.
AllowGroups ssh-access

# Alternativ könnte eine explizite Benutzerliste verwendet werden:
#
# AllowUsers admin ansible
#
# AllowGroups und AllowUsers wirken kumulativ. Ein Benutzer müsste dann beide
# Bedingungen erfüllen.


###############################################################################
# Anmeldeversuche und Verbindungsbegrenzung
###############################################################################

# Zeitspanne für eine noch nicht authentifizierte Anmeldung.
LoginGraceTime 30

# Maximale Anzahl fehlerhafter Authentifizierungsversuche pro Verbindung.
MaxAuthTries 3

# Maximal vier parallele Sessions innerhalb einer SSH-Verbindung.
# Relevant bei SSH-Multiplexing.
MaxSessions 4

# Begrenzung paralleler, noch nicht authentifizierter Verbindungen:
#
# 10       = bis zehn Verbindungen ohne zufälliges Verwerfen
# 30       = ab zehn Verbindungen mit 30 % Drop-Wahrscheinlichkeit
# 60       = ab 30 Verbindungen mit 100 % Drop-Wahrscheinlichkeit
MaxStartups 10:30:30

# Maximal drei gleichzeitig nicht authentifizierte Verbindungen
# aus derselben Quelladresse.
PerSourceMaxStartups 3

# IPv4-Adressen einzeln, IPv6-Adressen als /64-Netz bewerten.
PerSourceNetBlockSize 32:64


###############################################################################
# Verbindungserkennung und Keepalive
###############################################################################

# Alle fünf Minuten eine Protokoll-Keepalive-Anfrage senden.
ClientAliveInterval 300

# Verbindung nach zwei unbeantworteten Anfragen beenden.
# Totalausfallzeit damit ungefähr zehn Minuten.
ClientAliveCountMax 2

# Zusätzlich TCP-Keepalives verwenden.
TCPKeepAlive yes

# Bereits authentifizierte Verbindungen ohne geöffneten Channel schließen.
# Verhindert ungenutzte ControlMaster-/Multiplexing-Verbindungen.
UnusedConnectionTimeout 5m


###############################################################################
# Weiterleitungen und Tunnel
###############################################################################

# Global sämtliche SSH-Forwarding-Funktionen deaktivieren.
#
# Umfasst insbesondere:
#   - TCP Forwarding
#   - Agent Forwarding
#   - X11 Forwarding
#   - StreamLocal Forwarding
#   - Tunnel
DisableForwarding yes

AllowAgentForwarding no
AllowTcpForwarding no
AllowStreamLocalForwarding no

GatewayPorts no
PermitTunnel no

X11Forwarding no
X11DisplayOffset 10
X11UseLocalhost yes

# Änderungen an Unix-Socket-Zielen nicht zulassen.
StreamLocalBindUnlink no


###############################################################################
# Benutzerumgebung
###############################################################################

# Keine Umgebungsvariablen aus ~/.ssh/environment oder aus environment=
# Optionen in authorized_keys übernehmen.
PermitUserEnvironment no

# Benutzerdefinierte ~/.ssh/rc-Skripte nicht ausführen.
PermitUserRC no

# Keine Client-Umgebungsvariablen übernehmen.
#
# Auch LANG und LC_* werden bewusst nicht übernommen. Dadurch können Programme
# auf dem Server eine andere Sprache oder Locale verwenden als der Client.
#
# Falls benötigt:
# AcceptEnv LANG LC_*


###############################################################################
# Session-Einstellungen
###############################################################################

# Interaktive Terminals zulassen.
# Erforderlich für normale administrative Shell-Sitzungen und häufig auch
# für sudo mit TTY-Anforderungen.
PermitTTY yes

# Benutzer dürfen ihre letzte Anmeldung nicht unterdrücken.
PrintLastLog yes

# MOTD wird z.B. auf RHEL/Rocky normalerweise über PAM ausgegeben.
PrintMotd no

# Keine benutzerdefinierten Umgebungsvariablen aus ~/.ssh/environment
# oder environment= Optionen in authorized_keys übernehmen.
PermitUserEnvironment no

# Kompression deaktivieren.
# Bei verschlüsselten oder bereits komprimierten Daten meist ohne Nutzen.
Compression no


###############################################################################
# Dateirechte und Benutzerprüfungen
###############################################################################

# Konten ohne gültige Login-Shell beziehungsweise gesperrte Konten werden
# zusätzlich durch PAM und die Systemkontenverwaltung behandelt.

# Keine .rhosts- oder hosts.equiv-Dateien berücksichtigen.
IgnoreRhosts yes

# Keine benutzerspezifischen known_hosts-Dateien für Hostbased Authentication
# verwenden.
IgnoreUserKnownHosts yes


###############################################################################
# Logging und Auditing
###############################################################################

# Authentifizierungsnachrichten in AUTHPRIV schreiben.
SyslogFacility AUTHPRIV

# VERBOSE protokolliert unter anderem Fingerprints verwendeter Schlüssel.
# Das ist für Auditierung und Incident Response sinnvoll.
LogLevel VERBOSE

# Keine zusätzlichen Authentifizierungsinformationen in einer
# benutzersichtbaren Datei bereitstellen.
ExposeAuthInfo no


###############################################################################
# Banner
###############################################################################

# Optionaler rechtlicher beziehungsweise organisatorischer Login-Banner.
# Die Datei darf keine vertraulichen Systemdetails enthalten.
Banner /etc/issue.net


###############################################################################
# SFTP
###############################################################################

# Internen SFTP-Server verwenden.
# Vermeidet einen separaten externen Prozess und ist für Chroot-Konfigurationen
# besser geeignet.
Subsystem sftp internal-sftp


###############################################################################
# Distributionseigene Drop-ins
###############################################################################

# Bewusst am Ende eingebunden:
#
# OpenSSH verwendet bei vielen Parametern den zuerst gefundenen Wert.
# Dadurch haben die Werte dieser Hauptdatei Vorrang vor später eingebundenen
# Drop-ins.
#
# ACHTUNG:
# Match-Blöcke in Drop-ins können weiterhin benutzerabhängige Einstellungen
# setzen.
Include /etc/ssh/sshd_config.d/*.conf