SSH Hardening Guide
security ssh hardening linux
SSH Hardening Guide
SSH ist der wichtigste Remote-Zugang zu Linux-Servern. Dieses Guide zeigt, wie du SSH maximal absicherst.
Grundlegende Absicherung
1. SSH-Key Authentication einrichten
Auf dem Client (deinem Rechner):
# Ed25519-Key generieren (modern, sicher)
ssh-keygen -t ed25519 -C "user@hostname"
# Oder RSA mit 4096 Bit
ssh-keygen -t rsa -b 4096 -C "user@hostname"
# Key-Paar wird erstellt:
# ~/.ssh/id_ed25519 (Private Key - GEHEIM!)
# ~/.ssh/id_ed25519.pub (Public Key)
Public Key zum Server kopieren:
# Automatisch
ssh-copy-id user@server
# Oder manuell
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Berechtigungen auf dem Server:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
2. Password-Login deaktivieren
Erst testen ob Key-Login funktioniert!
# /etc/ssh/sshd_config
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
3. Root-Login verbieten
# /etc/ssh/sshd_config
PermitRootLogin no
# Oder nur mit Key
PermitRootLogin prohibit-password
4. SSH-Port ändern
# /etc/ssh/sshd_config
Port 2222 # oder ein anderer Port > 1024
Firewall anpassen:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
Verbinden:
ssh -p 2222 user@server
Erweiterte Absicherung
Erlaubte Benutzer einschränken
# /etc/ssh/sshd_config
# Nur bestimmte User erlauben
AllowUsers admin deploy
# Oder Gruppen
AllowGroups sshusers admins
# Bestimmte User sperren
DenyUsers root guest
Verbindungs-Limits
# /etc/ssh/sshd_config
# Login-Zeit begrenzen
LoginGraceTime 30
# Max. Versuche pro Verbindung
MaxAuthTries 3
# Max. gleichzeitige Verbindungen (unauthenticated)
MaxStartups 10:30:60
# Max. Sessions pro Verbindung
MaxSessions 3
Idle-Timeout
# /etc/ssh/sshd_config
# Client alle 300 Sekunden pingen
ClientAliveInterval 300
# Nach 2 erfolglosen Pings trennen
ClientAliveCountMax 2
IP-Adressen einschränken
# /etc/ssh/sshd_config
# Nur auf bestimmter IP lauschen
ListenAddress 192.168.1.100
# Oder via Firewall
sudo ufw allow from 192.168.1.0/24 to any port 22
Kryptographie härten
# /etc/ssh/sshd_config
# Nur sichere Key-Typen
HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256
# Sichere Key-Exchange
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
# Sichere Ciphers
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
# Sichere MACs
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
Weitere Optionen
# /etc/ssh/sshd_config
# X11-Forwarding deaktivieren (wenn nicht benötigt)
X11Forwarding no
# Agent-Forwarding deaktivieren
AllowAgentForwarding no
# TCP-Forwarding deaktivieren (wenn nicht benötigt)
AllowTcpForwarding no
# Banner anzeigen
Banner /etc/ssh/banner.txt
# Logging verbessern
LogLevel VERBOSE
# Kompression deaktivieren (Sicherheit > Performance)
Compression no
Fail2Ban einrichten
Automatisch IPs sperren nach fehlgeschlagenen Login-Versuchen.
Installation
sudo apt install fail2ban
Konfiguration
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22 # Oder dein Port
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600 # Zeitraum in Sekunden
bantime = 3600 # Sperrzeit in Sekunden
ignoreip = 127.0.0.1/8 192.168.1.0/24
Verwalten
# Status
sudo fail2ban-client status
sudo fail2ban-client status sshd
# Gebannte IPs anzeigen
sudo fail2ban-client get sshd banned
# IP entsperren
sudo fail2ban-client set sshd unbanip 1.2.3.4
2-Faktor-Authentifizierung (2FA)
Mit Google Authenticator oder anderer TOTP-App.
Installation
sudo apt install libpam-google-authenticator
Einrichten
# Als normaler User ausführen
google-authenticator
# Fragen beantworten:
# - Time-based tokens? → y
# - Update .google_authenticator? → y
# - Disallow multiple uses? → y
# - Rate limiting? → y
PAM konfigurieren
# /etc/pam.d/sshd
# Am Anfang hinzufügen:
auth required pam_google_authenticator.so
SSH konfigurieren
# /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Jetzt braucht man: SSH-Key + TOTP-Code
Port Knocking (Optional)
Versteckt den SSH-Port, bis eine bestimmte Port-Sequenz "angeklopft" wird.
Installation
sudo apt install knockd
Konfiguration
# /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Verbinden
# Auf Client: Ports anklopfen
knock server.com 7000 8000 9000
# Dann verbinden
ssh user@server.com
# Nach Verbindung: Ports schließen
knock server.com 9000 8000 7000
SSH-Konfiguration ändern
Syntax prüfen
sudo sshd -t
SSH-Dienst neu starten
# Neue Verbindung in anderem Terminal offen halten!
sudo systemctl restart sshd
# Oder nur reload
sudo systemctl reload sshd
Änderungen testen
# Verbose-Verbindung
ssh -v user@server
ssh -vvv user@server # Sehr verbose
Empfohlene sshd_config
# /etc/ssh/sshd_config - Hardened
# Netzwerk
Port 2222
ListenAddress 0.0.0.0
AddressFamily inet
# Authentifizierung
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
# Nur bestimmte User
AllowUsers admin deploy
# Limits
MaxAuthTries 3
MaxSessions 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
# Features deaktivieren
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PermitTunnel no
# Logging
LogLevel VERBOSE
# Kryptographie
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
Monitoring
Login-Versuche überwachen
# Erfolgreiche Logins
grep "Accepted" /var/log/auth.log
# Fehlgeschlagene Versuche
grep "Failed password" /var/log/auth.log
grep "Invalid user" /var/log/auth.log
# Aktuelle Verbindungen
who
w
# SSH-Verbindungen
ss -tn | grep :22
Logging mit journalctl
# SSH-Logs
journalctl -u sshd -f
# Nur Fehler
journalctl -u sshd -p err
Checkliste
- [ ] SSH-Keys statt Passwörter
- [ ] Root-Login deaktiviert
- [ ] Standard-Port geändert
- [ ] Fail2Ban installiert
- [ ] Nur bestimmte User erlaubt
- [ ] Verbindungs-Limits gesetzt
- [ ] Idle-Timeout konfiguriert
- [ ] Firewall angepasst
- [ ] Konfiguration getestet
- [ ] Backup-Zugang sichergestellt