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.pubOhne 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@serverManuell
# Ö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_keysEinzeiler
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@serverSSH-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 bastionVerwendung
# 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 aktivierenMehrere 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_keySSH-Agent
Agent starten
# Manuell
eval "$(ssh-agent -s)"
# In .bashrc/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)"
fiSchlü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 -DKeychain (persistenter Agent)
apt install keychain
# In .bashrc
eval $(keychain --eval --agents ssh id_ed25519)Passphrase verwalten
Passphrase ändern
ssh-keygen -p -f ~/.ssh/id_ed25519Passphrase 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 server2Berechtigungen
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_hostsSkript 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/nullServer-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 sshdBestimmte Schlüssel erlauben
# /etc/ssh/sshd_config
# Nur Ed25519 und RSA erlauben
PubkeyAcceptedKeyTypes ssh-ed25519,rsa-sha2-256,rsa-sha2-512authorized_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.comVerfü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 setzenJump-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 bastionManuell
ssh -J admin@bastion admin@10.0.0.50Mehrere Jump-Hosts
Host deep-internal
HostName 10.0.0.100
User admin
ProxyJump bastion,middle-serverSchlü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@serverAlten 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.pubAutomatisiertes 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"
fiBackup 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.pubWiederherstellen
# Entschlüsseln
gpg -d ssh-backup.tar.gz.gpg | tar -xzf -
# Berechtigungen setzen
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519Troubleshooting
Verbindung wird abgelehnt
# Verbose-Modus
ssh -vvv user@server
# Häufige Ursachen:
# - Falsche Berechtigungen
# - Falscher Schlüssel
# - Server akzeptiert Schlüsseltyp nichtBerechtigungsfehler
# Meldung: "Permissions 0644 for '~/.ssh/id_ed25519' are too open"
chmod 600 ~/.ssh/id_ed25519Host-Key-Warnung
# Host-Key entfernen
ssh-keygen -R server.example.com
# Fingerprint manuell prüfen
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pubAgent-Probleme
# Agent läuft?
echo $SSH_AUTH_SOCK
# Agent neu starten
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519Zusammenfassung
| 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.