SSH
Warum SSH
Abschnitt betitelt „Warum SSH“Um auf einem entfernten Linux-System zu arbeiten, brauchst du dort eine Shell. Früher lieferten telnet und rsh («remote shell») diese Shell, und zwar im Klartext: Jeder im selben Netz konnte Passwörter und Befehle mitlesen. SSH («secure shell») löste beide in den späten Neunzigern ab und ist seither der Standard für den Serverzugriff: Die ganze Verbindung ist verschlüsselt, der Server weist sich mit einem Schlüssel aus, und du kannst dich statt mit einem Passwort mit einem Schlüsselpaar anmelden.
SSH ist mehr als eine Shell. Über dieselbe Verbindung laufen Dateitransfer (scp, sftp, rsync), Git (git clone git@...), die Editor-Erweiterung Remote - SSH und bei Bedarf ganze Dateisysteme (sshfs).
Verbinden
Abschnitt betitelt „Verbinden“Das Programm auf deiner Seite heisst ssh (Client), auf der Server-VM läuft sshd (Daemon). Du gibst Benutzer und Host an:
ssh alice@10.0.0.42Beim ersten Verbinden erscheint diese Frage:
The authenticity of host '10.0.0.42 (10.0.0.42)' can't be established.ED25519 key fingerprint is SHA256:Xr3kT9q...Are you sure you want to continue connecting (yes/no/[fingerprint])?Das ist keine Fehlermeldung. Jeder SSH-Server hat einen eigenen Host-Schlüssel, und dein Client kennt ihn noch nicht. Mit yes speicherst du den Fingerabdruck in ~/.ssh/known_hosts. Ab jetzt prüft der Client bei jeder Verbindung, ob der Server noch derselbe ist. Ändert sich der Schlüssel, zum Beispiel weil du die VM neu installiert hast, warnt SSH laut (REMOTE HOST IDENTIFICATION HAS CHANGED) und verweigert die Verbindung. In dem Fall löschst du den alten Eintrag mit ssh-keygen -R 10.0.0.42. Siehst du die Warnung, ohne dass du etwas am Server geändert hast, ist Misstrauen angebracht.
Hands-on:
ssh alice@10.0.0.42hostnamewhoamiexitcat ~/.ssh/known_hostsAchte auf den Prompt: Nach dem Login zeigt er alice@server-vm statt deines lokalen Rechners. Alles, was du jetzt tippst, läuft dort. exit (oder Ctrl+D) beendet die Sitzung.
Schlüssel statt Passwort
Abschnitt betitelt „Schlüssel statt Passwort“Ein Passwort kann erraten, abgeschaut oder auf einem fremden Server abgefangen werden. Das Public-Key-Verfahren ersetzt es durch ein Schlüsselpaar:
- Der private Schlüssel bleibt auf deinem Rechner. Immer. Er verlässt ihn nie, wird nie kopiert, nie per Mail verschickt, nie committet.
- Der öffentliche Schlüssel darf jeder sehen. Du hinterlegst ihn auf jedem Server, auf dem du dich anmelden willst.
sequenceDiagram
participant C as Client (privater Schlüssel)
participant S as Server-VM (authorized_keys)
C->>S: Login als alice, hier mein öffentlicher Schlüssel
S->>S: Steht der Schlüssel in ~alice/.ssh/authorized_keys?
S->>C: Zufallswert (Challenge)
C->>C: signiert den Zufallswert mit dem privaten Schlüssel
C->>S: Signatur
S->>S: prüft die Signatur mit dem öffentlichen Schlüssel
S->>C: Login erlaubt, Shell wird gestartet
Der Server stellt eine Aufgabe, die nur der Besitzer des privaten Schlüssels lösen kann. Ein Passwort geht nie über die Leitung, und was auf dem Server liegt, nützt einem Angreifer nichts.
- Schlüsselpaar erzeugen.
ed25519ist der heutige Standard: kurz, schnell, sicher. Gib eine Passphrase ein, sie schützt den privaten Schlüssel, falls dein Rechner abhandenkommt.Du hast jetzteigener Rechner ssh-keygen -t ed25519 -C "alice@laptop"ls -l ~/.ssh/id_ed25519(privat, Rechte600) undid_ed25519.pub(öffentlich). Falls du in Modul 2 schon einen Schlüssel für GitLab erzeugt hast, verwende den weiter. - Öffentlichen Schlüssel auf die Server-VM bringen.
ssh-copy-idfragt ein letztes Mal nach dem Passwort und hängt den Schlüssel an~/.ssh/authorized_keysan:eigener Rechner ssh-copy-id -i ~/.ssh/id_ed25519.pub alice@10.0.0.42ssh-copy-idfehlt unter Windows, von Hand geht es so:Terminal-Fenster type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh alice@10.0.0.42 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" - Testen. Jetzt wird nur noch nach der Passphrase gefragt, nicht mehr nach dem Passwort des Servers:
eigener Rechner ssh alice@10.0.0.42 'cat ~/.ssh/authorized_keys'
Passphrase nur einmal eingeben: ssh-agent
Abschnitt betitelt „Passphrase nur einmal eingeben: ssh-agent“Der ssh-agent hält den entschlüsselten privaten Schlüssel im Speicher, solange du angemeldet bist. Ubuntu Desktop und macOS starten ihn automatisch, in einer Server-VM oder unter WSL startest du ihn selbst:
eval "$(ssh-agent -s)"ssh-add ~/.ssh/id_ed25519ssh-add -lDanach fragt ssh bis zum Abmelden nicht mehr nach der Passphrase.
Host-Alias in ~/.ssh/config
Abschnitt betitelt „Host-Alias in ~/.ssh/config“IP-Adressen und Benutzernamen tippt man nicht jedes Mal. Die Datei ~/.ssh/config definiert Kurznamen:
Host server HostName 10.0.0.42 User alice IdentityFile ~/.ssh/id_ed25519chmod 600 ~/.ssh/configssh serverDer Alias gilt für alle Programme, die SSH benutzen: scp server:..., rsync ... server:..., git, VS Code.
Dateien kopieren: scp und sftp
Abschnitt betitelt „Dateien kopieren: scp und sftp“scp funktioniert wie cp, nur dass eine Seite host:pfad heisst. Pfade ohne führendes / sind relativ zum Home-Verzeichnis auf dem Server:
echo "Hallo Server" > gruss.txtscp gruss.txt server:scp server:gruss.txt gruss-zurueck.txtscp -r server:/etc/ssh/sshd_config.d ./sshd_config.d-kopiesftp ist die interaktive Variante mit ls, cd, get und put, praktisch, wenn du nicht genau weisst, wo die Datei liegt:
sftp serversftp> lssftp> get gruss.txtsftp> byeFür ganze Verzeichnisbäume und wiederholte Übertragungen ist rsync die bessere Wahl.
Befehle remote ausführen
Abschnitt betitelt „Befehle remote ausführen“Hängst du einen Befehl an ssh, wird er ausgeführt und die Verbindung gleich wieder geschlossen. Das ist die Grundlage für Skripte, die mehrere Server abfragen:
ssh server uptimessh server 'df -h / && free -h'ssh -t server sudo systemctl status ssh --no-pagerDie Anführungszeichen sorgen dafür, dass && auf dem Server ausgewertet wird und nicht lokal. -t fordert ein Terminal an, das braucht sudo für die Passwortabfrage.
sshfs: entferntes Verzeichnis einbinden
Abschnitt betitelt „sshfs: entferntes Verzeichnis einbinden“Mit sshfs erscheint ein Verzeichnis der Server-VM wie ein lokales, ganz ohne Freigabe-Dienst auf dem Server. Praktisch, um Serverdateien mit einem grafischen Editor zu bearbeiten:
sudo apt install sshfsmkdir -p ~/server-homesshfs server: ~/server-homels ~/server-homefusermount -u ~/server-homesshd absichern
Abschnitt betitelt „sshd absichern“Solange sshd Passwörter akzeptiert, probieren Bots rund um die Uhr Passwörter aus; ein Blick in sudo journalctl -u ssh auf einem Server im Internet zeigt das. Zwei Einstellungen stoppen das, und du setzt sie erst, nachdem der Schlüssel-Login nachweislich funktioniert.
Ubuntu 24.04 liest Zusatzdateien aus /etc/ssh/sshd_config.d/ ein, noch vor dem Rest von sshd_config. Bei doppelten Einträgen gilt der erste gefundene Wert, darum bekommt deine Datei eine kleine Nummer, damit sie vor dem Installer-Rest (50-cloud-init.conf) gelesen wird:
PasswordAuthentication noKbdInteractiveAuthentication noPermitRootLogin no- Datei als root anlegen (
sudo vim /etc/ssh/sshd_config.d/10-haerten.conf). - Konfiguration prüfen, bevor du den Dienst neu startest.
sshd -Tzeigt die wirksamen Werte:Server-VM sudo sshd -tsudo sshd -T | grep -E 'passwordauthentication|permitrootlogin|kbdinteractive' - Dienst neu starten. Lass deine aktuelle Sitzung offen und teste den Login in einem zweiten Terminal. Scheitert er, kannst du in der offenen Sitzung die Datei wieder entfernen:
Server-VM sudo systemctl restart ssh - Gegenprobe vom eigenen Rechner: Ein Login mit erzwungenem Passwort muss jetzt abgewiesen werden:
Erwartete Antwort:
eigener Rechner ssh -o PubkeyAuthentication=no serverPermission denied (publickey).
Lösung anzeigen
script labs/linux/10-remote-backup/ssh.txtssh-keygen -l -f ~/.ssh/id_ed25519.pubcat ~/.ssh/configssh -t server 'cat ~/.ssh/authorized_keys; sudo sshd -T | grep -iE "passwordauth|permitroot"'ssh -o PubkeyAuthentication=no server# 5: Sonst sperrt man sich aus, wenn der Schlüssel nicht akzeptiert wird (Tippfehler,# falsche Rechte). Ausgesperrt: Proxmox-Konsole der VM öffnen, dort anmelden und# /etc/ssh/sshd_config.d/10-haerten.conf entfernen, systemctl restart ssh.exitSelbstcheck · 5 Fragen
Weiterführend
Abschnitt betitelt „Weiterführend“man ssh,man ssh_config,man sshd_config- OpenSSH-Dokumentation von Ubuntu