SSH Misc

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Remote Services – SSH

SSH (Secure Shell) ist ein Netzwerkprotokoll für den sicheren Zugriff auf entfernte Systeme. Es verschlüsselt die gesamte Kommunikation und ersetzt unsichere Protokolle wie Telnet oder FTP.

Was SSH verhindert

  • DNS Spoofing
  • IP Spoofing
  • IP Source Routing
  • Ausspähen von Klartextkennwörtern und Nutzdaten
  • Manipulation von übertragenen Daten
  • Angriffe auf den X11-Server

SSH ersetzt

Altes Protokoll Ersetzt durch
telnet, rlogin ssh
ftp, rcopy scp / sftp

Das OpenSSH Paket

OpenSSH ist die meistverbreitete Implementierung des SSH-Protokolls unter Linux/Unix. Es enthält folgende Programme:

  • ssh – Remote-Login und Befehlsausführung
  • scp – Secure Copy (Dateiübertragung)
  • sftp – Secure FTP (interaktive Dateiübertragung)
  • ssh-keygen – Schlüsselpaar generieren
  • ssh-agent – Schlüsselverwaltung im Speicher
  • ssh-add – Schlüssel zum Agent hinzufügen

SSH Verbindungsszenarien

SSH Verbindungsszenarien

Es gibt zwei typische Szenarien:

Lokaler unprivilegierter Benutzer loggt sich als remote unprivilegierter Benutzer ein
alice (ssh client) → ssh Verbindung → bob (ssh server)
Lokaler unprivilegierter Benutzer loggt sich als root ein
alice (ssh client) → ssh Verbindung → root (ssh server)

SSH Verbindungsaufbau

Der SSH-Verbindungsaufbau läuft in 3 Phasen ab:

Phase 1: Transport Layer + Key Exchange

SSH Verbindungsaufbau Public Key Auth

  1. ClientHello – Client schickt unterstützte Algorithmen (KEX, Host-Key, Cipher/Hash/MAC)
  2. ServerHello – Server wählt Algorithmen und schickt seinen öffentlichen Host Key
  3. Host-Key-Prüfung – Client vergleicht den Host Key mit ~/.ssh/known_hosts, bei unbekanntem Host kommt eine Fingerprint-Warnung
  4. Diffie-Hellman/ECDH – Client sendet Public-Value, Server antwortet mit DH Public-Value + Signatur mit privatem Host Key
  5. Session Key Berechnung – Beide Seiten berechnen denselben Schlüssel → ab jetzt: symmetrische Verschlüsselung
Diffie-Hellman Prinzip
Protokoll zur Schlüsselvereinbarung. Es ermöglicht, dass zwei Kommunikationspartner über eine öffentliche, abhörbare Leitung einen gemeinsamen geheimen Schlüssel in Form einer Zahl vereinbaren können.

Phase 2: User Authentication

Ab hier ist die gesamte Kommunikation verschlüsselt.

Authentifizierung mit Public Key

SSH Verbindungsaufbau Public Key Auth

  1. Client sendet: Username, Methode »Public Key«, welcher Public Key
  2. Server prüft: Ist der Public Key in ~/.ssh/authorized_keys?
    • NEIN → Auth fail
    • JA → Challenge (Zufallsdaten) senden
  3. Client signiert die Challenge mit dem privaten Client Key und schickt die Signatur zurück
  4. Server prüft Signatur mit dem öffentlichen Client Key → bei Erfolg: Auth SUCCESS

Authentifizierung mit Passwort

SSH Verbindungsaufbau Passwort Auth

  1. Client sendet: Username + Methode »Password«
  2. Client sendet: Username + Passwort (verschlüsselt!)
  3. Server prüft Passwort:
    • NEIN → Auth fail
    • JA → Auth ok

Phase 3: Session Phase (Channels)

  • Session Channel wird geöffnet: Shell / Exec / PTY
  • Symmetrisch verschlüsselt
  • Integritätsgeschützt

Schlüsseldateien

Server – Hostschlüssel

Der Server hat eigene Schlüsselpaare zur Identifikation:

Geheime Hostschlüssel (nur root lesbar!)
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key
Öffentliche Hostschlüssel
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key.pub

Client – Benutzerschlüssel

Geheimer Benutzerschlüssel (nur der Benutzer darf ihn lesen!)
~/.ssh/id_rsa
Öffentlicher Benutzerschlüssel
~/.ssh/id_rsa.pub

SSH Authentifizierung mit Public/Private Keys

Schlüssel generieren – ssh-keygen

SSH Agent Übersicht

  1. Eine Zufallszahl dient als Basis für die Schlüsselgenerierung
  2. ssh-keygen erzeugt ein Schlüsselpaar:
    • Privater Schlüssel – bleibt lokal, wird mit einer Passphrase geschützt gespeichert
    • Öffentlicher Schlüssel – wird auf den Server kopiert
  3. Der private Schlüssel wird mit einer Passphrase verschlüsselt → Geschützter Schlüssel auf der Harddisk
ssh-keygen -t ed25519 -C "kommentar@beispiel.de"

Öffentlichen Schlüssel auf Server hinterlegen

Der öffentliche Schlüssel des Benutzers muss auf dem Server in folgende Datei eingetragen werden:

~/.ssh/authorized_keys

Jede Zeile enthält den Schlüssel eines Benutzers. Zur Übersicht empfiehlt es sich, am Ende der Zeile eine Beschreibung (z. B. E-Mail) hinzuzufügen:

ssh-rsa AAAAB3Nz...== rudi.ruessel@beispiel.de
ssh-rsa AAAAB3Nz...== erwin.lindemann@beispiel.de

Known Hosts – Serververtrauen auf Client-Seite

Die Datei ~/.ssh/known_hosts speichert die öffentlichen Hostschlüssel aller bekannten Server. Bei jeder Verbindung wird der Schlüssel des Servers damit verglichen.

~/.ssh/known_hosts

Beim ersten Verbindungsaufbau zu einem unbekannten Server erscheint eine Fingerprint-Warnung – erst nach Bestätigung wird der Schlüssel gespeichert.


SSH Agent

Wozu ein SSH Agent?

  • Für zusätzliche Sicherheit wird der private Schlüssel verschlüsselt (mit Passphrase) gespeichert
  • Die Eingabe der Passphrase bei jeder Verbindung ist mühsam
  • Lösung: ssh-agent entschlüsselt den Schlüssel einmalig und hält ihn sicher im Arbeitsspeicher
  • SSH-Clients kommunizieren mit dem Agent über einen Unix-Domain-Socket
  • Der Agent läuft über die gesamte lokale Anmeldesitzung

Ablauf ssh-add

  1. Geschützter Schlüssel von der Harddisk + Passphrase eingeben
  2. → ssh-add entschlüsselt → privater Schlüssel landet im Arbeitsspeicher
  3. SSH-Clients (ssh, scp, sftp, rsync) nutzen den Schlüssel automatisch vom Agent

SSH Agent einrichten (systemd)

Damit der SSH Agent automatisch beim Anmelden startet:

1. Servicedatei anlegen
vim ~/.config/systemd/user/ssh-agent.service
[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
Environment=DISPLAY=:0
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target
2. Service aktivieren
systemctl --user enable --now ssh-agent.service
3. SSH konfigurieren – Schlüssel automatisch zum Agent hinzufügen
vim ~/.ssh/config
AddKeysToAgent yes
4. Umgebungsvariable setzen (in .bash_profile / .zprofile / .xinitrc / .xprofile)
export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/ssh-agent.socket

Siehe auch: ssh agent start (für Systeme ohne grafische Oberfläche)


Weiterführende Themen

Grundlagen

Client & Server

Dateiübertragung

Authentifizierung

Fortgeschrittene Themen

Windows

Schnelleinstiege & Anleitungen


Externe Quellen