wenn noch kein SSH-Server installiert ist
sudo apt install -y openssh-server
Diese Dokumentation beschreibt ein modulares, update-sicheres SSH-Hardening-System
für Debian/Ubuntu-Server. Es basiert auf Best Practices (CIS, NIST, NSA, OpenSSH).
OpenSSH liest Konfigurationen in folgender Reihenfolge:
/etc/ssh/sshd_config/etc/ssh/sshd_config.d/, alphabetisch sortiert👉 Letzte Definition gewinnt, additive Parameter werden kombiniert.
/etc/ssh/sshd_config.d/
├── 01-hardening.conf
├── 10-access.conf
├── 20-audit.conf
├── 50-custom.conf
└── 99-local.conf
| Datei | Zweck | Verhalten |
|---|---|---|
01-hardening.conf |
Basissicherheit (Port, RootLogin, Crypto) | Grundlage |
10-access.conf |
Benutzer/Gruppenzugriff | Ergänzt Hardening |
20-audit.conf |
Logging, PAM, Session Limits | Ergänzt Hardening |
50-custom.conf |
Standort-/Projektanpassungen | Optional |
99-local.conf |
Lokale Overrides | ⚠️ Nur für Tests! |
sudo nano /etc/ssh/sshd_config.d/01-hardening.conf
# =====================================================
# SSH Hardening – Basissicherheit
# =====================================================
# Port ändern (Standard: 22)
Port 22
# Root-Login komplett deaktivieren
PermitRootLogin no
# Nur Public-Key Login erlauben
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
# Gültige User definieren
AllowUsers alice bob
# Krypto-Standards
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# Fehlversuche begrenzen
MaxAuthTries 3
LoginGraceTime 20
# IPv6 aktiv lassen, falls genutzt
AddressFamily any
# DNS-Abfragen für Logins vermeiden (schneller)
UseDNS no
===
sudo nano /etc/ssh/sshd_config.d/10-access.conf
# Zugriffskontrolle – Benutzer & Gruppen
# AllowGroups admins devops
# DenyUsers test backup
# DenyGroups guests
# Einschränkung nach Quellnetz
# Match Address 192.168.179.*,10.0.0.*
# PasswordAuthentication no
# AllowTcpForwarding no
# X11Forwarding no
# # for vscode remote-ssh
# AllowTcpForwarding yes
# AllowAgentForwarding yes
# PermitTunnel yes
# X11Forwarding no
sudo nano /etc/ssh/sshd_config.d/20-audit.conf
# =====================================================
# Audit & Logging
# =====================================================
# Login-Versuche und Channel-Aktivität loggen
LogLevel VERBOSE
SyslogFacility AUTH
# Session-Überwachung (PAM Hooks)
# → PAM-Module wie pam_exec.so triggern z. B. dein Login-Mail-Alert
UsePAM yes
# X11 und Agent-Forwarding deaktivieren
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
# ClientKeepAlive – beendet tote Sessions
ClientAliveInterval 300
ClientAliveCountMax 2
sudo nano /etc/ssh/sshd_config.d/50-custom.conf
# Standort-/Projektbezogene SSH-Settings
# Match User sftpuser
# ChrootDirectory /srv/sftp
# ForceCommand internal-sftp
# X11Forwarding no
# AllowTcpForwarding no
# PermitTunnel no
# PasswordAuthentication no
sudo nano /etc/ssh/sshd_config.d/99-local.conf
# Lokale Overrides / Debugging
# Port 22
# LogLevel DEBUG
# PasswordAuthentication yes
⚠️ Wird zuletzt geladen, überschreibt alles!
In Produktivsystemen löschen oder auf 600 setzen:sudo chmod 600 /etc/ssh/sshd_config.d/99-local.conf
| Parameter | Verhalten |
|---|---|
Port, PermitRootLogin, PasswordAuthentication |
Letzte Definition zählt |
AllowUsers, AllowGroups, DenyUsers |
Additiv außerhalb von Match; innerhalb Match → ersetzt |
Match |
Alle zutreffenden Blöcke sind aktiv — spätere überschreiben frühere und globale Werte (Reihenfolge entscheidend) |
Subsystem sftp |
Letzte Definition zählt |
UsePAM, Ciphers, MACs |
Letzte Definition zählt |
Vor Neustart immer prüfen:
sudo sshd -t
Wenn keine Ausgabe erfolgt → Syntax korrekt ✅
Dann:
sudo systemctl restart sshd
sudo systemctl status sshd
ss -tlnp | grep ssh
/etc/ssh/sshd_config99-local.conf in Cloud- oder Produktivsystemen nicht verwendenAutorenhinweis:
Diese Vorlage wurde speziell für modulare Server-Hardening-Konzepte entwickelt und ist mit Debian 12+ getestet worden.