← Zurück

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