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.