SSH-Schlüssel bieten sichere, passwortlose Authentifizierung. Sie sind sicherer als Passwörter und ermöglichen automatisierte Verbindungen.
Grundlagen
Asymmetrische Verschlüsselung
Privater Schlüssel: Bleibt auf Ihrem Computer (geheim!)
Öffentlicher Schlüssel: Wird auf Server kopiert
Client Server
┌──────────┐ ┌──────────┐
│ Private │ ──Challenge──→ │ Public │
│ Key │ ←──Response─── │ Key │
└──────────┘ └──────────┘
Schlüsseltypen
| Typ | Sicherheit | Kompatibilität |
|---|
| Ed25519 | Sehr hoch | Modern |
| RSA (4096) | Hoch | Universell |
| ECDSA | Hoch | Gut |
| DSA | Veraltet | Legacy |
Schlüssel erstellen
Ed25519 (empfohlen)
ssh-keygen -t ed25519 -C "user@example.com"
RSA (4096 Bit)
ssh-keygen -t rsa -b 4096 -C "user@example.com"
Interaktive Erstellung
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
Ohne Interaktion
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" -C "user@example.com"
Schlüssel auf Server kopieren
ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Manuell
# Öffentlichen Schlüssel anzeigen
cat ~/.ssh/id_ed25519.pub
# Auf Server einfügen
ssh user@server
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ÖFFENTLICHER_SCHLÜSSEL" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Einzeiler
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Verbindung testen
# Mit Schlüssel verbinden
ssh -i ~/.ssh/id_ed25519 user@server
# Verbose-Modus (Debugging)
ssh -v user@server
SSH-Config
Basis-Konfiguration
# ~/.ssh/config
Host server1
HostName 192.168.1.10
User admin
IdentityFile ~/.ssh/id_ed25519
Host server2
HostName server2.example.com
User root
Port 2222
IdentityFile ~/.ssh/server2_key
Host *.internal.example.com
User deploy
IdentityFile ~/.ssh/deploy_key
ProxyJump bastion
Verwendung
# Statt: ssh -i ~/.ssh/id_ed25519 admin@192.168.1.10
ssh server1
# SCP
scp file.txt server1:/home/admin/
Erweiterte Optionen
Host production
HostName prod.example.com
User deploy
IdentityFile ~/.ssh/prod_key
IdentitiesOnly yes # Nur angegebenen Schlüssel nutzen
ForwardAgent no # Agent-Forwarding deaktivieren
StrictHostKeyChecking yes # Host-Key-Überprüfung
ServerAliveInterval 60 # Keep-Alive
ServerAliveCountMax 3 # Max. Versuche
Compression yes # Komprimierung aktivieren
Mehrere Schlüssel
Verschiedene Schlüssel für verschiedene Server
# Arbeit
ssh-keygen -t ed25519 -f ~/.ssh/work_key -C "work@company.com"
# Privat
ssh-keygen -t ed25519 -f ~/.ssh/personal_key -C "personal@email.com"
# GitHub
ssh-keygen -t ed25519 -f ~/.ssh/github_key -C "github@email.com"
Config für mehrere Schlüssel
# ~/.ssh/config
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_key
IdentitiesOnly yes
Host gitlab.company.com
HostName gitlab.company.com
User git
IdentityFile ~/.ssh/work_key
IdentitiesOnly yes
Host *
IdentityFile ~/.ssh/personal_key
SSH-Agent
Agent starten
# Manuell
eval "$(ssh-agent -s)"
# In .bashrc/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)"
fi
Schlüssel hinzufügen
# Standard-Schlüssel
ssh-add
# Bestimmter Schlüssel
ssh-add ~/.ssh/id_ed25519
# Mit Timeout (8 Stunden)
ssh-add -t 8h ~/.ssh/id_ed25519
# Alle Schlüssel anzeigen
ssh-add -l
# Alle Schlüssel entfernen
ssh-add -D
Keychain (persistenter Agent)
apt install keychain
# In .bashrc
eval $(keychain --eval --agents ssh id_ed25519)
Passphrase verwalten
Passphrase ändern
ssh-keygen -p -f ~/.ssh/id_ed25519
Passphrase entfernen (unsicher!)
ssh-keygen -p -f ~/.ssh/id_ed25519 -N ""
Mit SSH-Agent (empfohlen)
# Passphrase einmal eingeben
ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/user/.ssh/id_ed25519: ****
# Weitere Verbindungen ohne Passphrase
ssh server1
ssh server2
Berechtigungen
Korrekte Berechtigungen
# .ssh-Verzeichnis
chmod 700 ~/.ssh
# Private Schlüssel
chmod 600 ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_rsa
# Öffentliche Schlüssel
chmod 644 ~/.ssh/id_ed25519.pub
# authorized_keys
chmod 600 ~/.ssh/authorized_keys
# config
chmod 600 ~/.ssh/config
# known_hosts
chmod 644 ~/.ssh/known_hosts
Skript für Berechtigungen
#!/bin/bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_* 2>/dev/null
chmod 644 ~/.ssh/*.pub 2>/dev/null
chmod 600 ~/.ssh/authorized_keys 2>/dev/null
chmod 600 ~/.ssh/config 2>/dev/null
Server-Konfiguration
Passwort-Login deaktivieren
# /etc/ssh/sshd_config
# Nur Schlüssel-Authentifizierung
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
# Root-Login verbieten (oder nur mit Schlüssel)
PermitRootLogin prohibit-password
# Leere Passwörter verbieten
PermitEmptyPasswords no
# Konfiguration testen
sshd -t
# SSH neu starten
systemctl restart sshd
Bestimmte Schlüssel erlauben
# /etc/ssh/sshd_config
# Nur Ed25519 und RSA erlauben
PubkeyAcceptedKeyTypes ssh-ed25519,rsa-sha2-256,rsa-sha2-512
authorized_keys-Optionen
Einschränkungen pro Schlüssel
# ~/.ssh/authorized_keys
# Nur bestimmten Befehl erlauben
command="/usr/local/bin/backup-script" ssh-ed25519 AAAA... backup@example.com
# IP-Einschränkung
from="192.168.1.0/24,10.0.0.5" ssh-ed25519 AAAA... admin@example.com
# Kein Port-Forwarding
no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA... restricted@example.com
# Kombiniert
from="192.168.1.0/24",command="/usr/bin/rsync --server",no-pty ssh-ed25519 AAAA... rsync@example.com
Verfügbare Optionen
command="..." # Nur bestimmten Befehl ausführen
from="pattern" # IP-Einschränkung
no-port-forwarding # Kein Port-Forwarding
no-X11-forwarding # Kein X11-Forwarding
no-agent-forwarding # Kein Agent-Forwarding
no-pty # Kein Terminal
environment="VAR=val" # Umgebungsvariable setzen
Jump-Host (Bastion)
SSH-Config
Host bastion
HostName bastion.example.com
User admin
IdentityFile ~/.ssh/bastion_key
Host internal-server
HostName 10.0.0.50
User admin
ProxyJump bastion
Manuell
ssh -J admin@bastion admin@10.0.0.50
Mehrere Jump-Hosts
Host deep-internal
HostName 10.0.0.100
User admin
ProxyJump bastion,middle-server
Schlüssel rotieren
Neuen Schlüssel erstellen
# Neuen Schlüssel generieren
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_new -C "user@example.com"
# Auf Server kopieren
ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server
# Verbindung testen
ssh -i ~/.ssh/id_ed25519_new user@server
Alten Schlüssel entfernen
# Auf Server: alte Zeile aus authorized_keys entfernen
vim ~/.ssh/authorized_keys
# Lokal: alten Schlüssel löschen
rm ~/.ssh/id_ed25519_old ~/.ssh/id_ed25519_old.pub
Automatisiertes Skript
#!/bin/bash
# rotate-ssh-key.sh
OLD_KEY="$HOME/.ssh/id_ed25519"
NEW_KEY="$HOME/.ssh/id_ed25519_new"
SERVER="user@server"
# Neuen Schlüssel erstellen
ssh-keygen -t ed25519 -f "$NEW_KEY" -N "" -C "$(whoami)@$(hostname)"
# Auf Server kopieren
ssh-copy-id -i "${NEW_KEY}.pub" "$SERVER"
# Testen
if ssh -i "$NEW_KEY" "$SERVER" "exit"; then
echo "Neuer Schlüssel funktioniert"
mv "$OLD_KEY" "${OLD_KEY}.backup"
mv "${OLD_KEY}.pub" "${OLD_KEY}.pub.backup"
mv "$NEW_KEY" "$OLD_KEY"
mv "${NEW_KEY}.pub" "${OLD_KEY}.pub"
echo "Schlüssel rotiert"
else
echo "Fehler: Neuer Schlüssel funktioniert nicht"
rm "$NEW_KEY" "${NEW_KEY}.pub"
fi
Backup und Recovery
Schlüssel sichern
# Verschlüsseltes Backup
tar -czf - ~/.ssh | gpg -c > ssh-backup.tar.gz.gpg
# Mit Passwort
zip -e ssh-backup.zip ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
Wiederherstellen
# Entschlüsseln
gpg -d ssh-backup.tar.gz.gpg | tar -xzf -
# Berechtigungen setzen
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
Troubleshooting
Verbindung wird abgelehnt
# Verbose-Modus
ssh -vvv user@server
# Häufige Ursachen:
# - Falsche Berechtigungen
# - Falscher Schlüssel
# - Server akzeptiert Schlüsseltyp nicht
Berechtigungsfehler
# Meldung: "Permissions 0644 for '~/.ssh/id_ed25519' are too open"
chmod 600 ~/.ssh/id_ed25519
Host-Key-Warnung
# Host-Key entfernen
ssh-keygen -R server.example.com
# Fingerprint manuell prüfen
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Agent-Probleme
# Agent läuft?
echo $SSH_AUTH_SOCK
# Agent neu starten
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Zusammenfassung
| Befehl | Funktion |
|---|
ssh-keygen | Schlüssel erstellen |
ssh-copy-id | Schlüssel auf Server kopieren |
ssh-add | Schlüssel zum Agent hinzufügen |
ssh-agent | Agent starten |
ssh-keygen -p | Passphrase ändern |
| Datei | Beschreibung |
|---|
| ~/.ssh/id_ed25519 | Privater Schlüssel |
| ~/.ssh/id_ed25519.pub | Öffentlicher Schlüssel |
| ~/.ssh/authorized_keys | Erlaubte Schlüssel (Server) |
| ~/.ssh/config | Client-Konfiguration |
| ~/.ssh/known_hosts | Bekannte Server |
Fazit
SSH-Schlüssel sind die sicherste Methode zur Server-Authentifizierung. Ed25519 ist der empfohlene Algorithmus für neue Schlüssel. Schützen Sie private Schlüssel mit einer Passphrase und nutzen Sie den SSH-Agent für komfortable Verwendung. Deaktivieren Sie Passwort-Login auf Produktivservern und rotieren Sie Schlüssel regelmäßig.