|
|
| Zeile 1: |
Zeile 1: |
| = Remote Services – SSH =
| | *[[SSH Misc]] |
| | |
| 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 ==
| |
| | |
| {| class="wikitable"
| |
| ! 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 =
| |
| | |
| [[Datei:1775821094920_image.png|600px|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 ==
| |
| | |
| [[Datei:Ssh-verbindungsaufbau-3_drawio.png|700px|SSH Verbindungsaufbau Public Key Auth]]
| |
| | |
| # '''ClientHello''' – Client schickt unterstützte Algorithmen (KEX, Host-Key, Cipher/Hash/MAC)
| |
| # '''ServerHello''' – Server wählt Algorithmen und schickt seinen öffentlichen Host Key
| |
| # '''Host-Key-Prüfung''' – Client vergleicht den Host Key mit <code>~/.ssh/known_hosts</code>, bei unbekanntem Host kommt eine Fingerprint-Warnung
| |
| # '''Diffie-Hellman/ECDH''' – Client sendet Public-Value, Server antwortet mit DH Public-Value + Signatur mit privatem Host Key
| |
| # '''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 ===
| |
| | |
| [[Datei:Ssh-verbindungsaufbau-3_drawio.png|700px|SSH Verbindungsaufbau Public Key Auth]]
| |
| | |
| # Client sendet: Username, Methode »Public Key«, welcher Public Key
| |
| # Server prüft: Ist der Public Key in <code>~/.ssh/authorized_keys</code>?
| |
| #* NEIN → Auth fail
| |
| #* JA → Challenge (Zufallsdaten) senden
| |
| # Client signiert die Challenge mit dem privaten Client Key und schickt die Signatur zurück
| |
| # Server prüft Signatur mit dem öffentlichen Client Key → bei Erfolg: '''Auth SUCCESS'''
| |
| | |
| === Authentifizierung mit Passwort ===
| |
| | |
| [[Datei:Ssh-verbindungsaufbau-5_drawio.png|700px|SSH Verbindungsaufbau Passwort Auth]]
| |
| | |
| # Client sendet: Username + Methode »Password«
| |
| # Client sendet: Username + Passwort (verschlüsselt!)
| |
| # 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!)
| |
| <pre>
| |
| /etc/ssh/ssh_host_rsa_key
| |
| /etc/ssh/ssh_host_ecdsa_key
| |
| /etc/ssh/ssh_host_ed25519_key
| |
| </pre>
| |
| | |
| ; Öffentliche Hostschlüssel
| |
| <pre>
| |
| /etc/ssh/ssh_host_rsa_key.pub
| |
| /etc/ssh/ssh_host_ecdsa_key.pub
| |
| /etc/ssh/ssh_host_ed25519_key.pub
| |
| </pre>
| |
| | |
| == 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 ==
| |
| | |
| [[Datei:Ssh-agent1-1_drawio.png|700px|SSH Agent Übersicht]]
| |
| | |
| # Eine '''Zufallszahl''' dient als Basis für die Schlüsselgenerierung
| |
| # '''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
| |
| # Der private Schlüssel wird mit einer '''Passphrase''' verschlüsselt → '''Geschützter Schlüssel''' auf der Harddisk
| |
| | |
| <pre>
| |
| ssh-keygen -t ed25519 -C "kommentar@beispiel.de"
| |
| </pre>
| |
| | |
| == Ö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:
| |
| | |
| <pre>
| |
| ssh-rsa AAAAB3Nz...== rudi.ruessel@beispiel.de
| |
| ssh-rsa AAAAB3Nz...== erwin.lindemann@beispiel.de
| |
| </pre>
| |
| | |
| == Known Hosts – Serververtrauen auf Client-Seite ==
| |
| | |
| Die Datei <code>~/.ssh/known_hosts</code> speichert die öffentlichen Hostschlüssel aller bekannten Server. Bei jeder Verbindung wird der Schlüssel des Servers damit verglichen.
| |
| | |
| <pre>
| |
| ~/.ssh/known_hosts
| |
| </pre>
| |
| | |
| 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 ==
| |
| | |
| # Geschützter Schlüssel von der Harddisk + Passphrase eingeben
| |
| # → ssh-add entschlüsselt → privater Schlüssel landet im Arbeitsspeicher
| |
| # 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
| |
| | |
| <pre>
| |
| [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
| |
| </pre>
| |
| | |
| ; 2. Service aktivieren
| |
| systemctl --user enable --now ssh-agent.service
| |
| | |
| ; 3. SSH konfigurieren – Schlüssel automatisch zum Agent hinzufügen
| |
| vim ~/.ssh/config
| |
| | |
| <pre>
| |
| AddKeysToAgent yes
| |
| </pre>
| |
| | |
| ; 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 ==
| |
| * [[ssh Grundlagen]]
| |
| * [[ssh Verbindungsaufbau]]
| |
| * [[ssh Algorythmen]]
| |
| * [[ssh host finger print]]
| |
| | |
| == Client & Server ==
| |
| * [[ssh Clientseite]]
| |
| * [[ssh Serverseite]]
| |
| * [[ssh misc]]
| |
| | |
| == Dateiübertragung ==
| |
| * [[scp]]
| |
| * [[rsync]]
| |
| * [[SFTP-Server]]
| |
| | |
| == Authentifizierung ==
| |
| * [[SSH Agent]]
| |
| * [[Authentifizierung mit Schlüssel]]
| |
| * [[ssh passwort auf key]]
| |
| * [[ssh passt id_rsa zu id_rsa.pub]]
| |
| * [[two-factor authentication]]
| |
| | |
| == Fortgeschrittene Themen ==
| |
| * [[ssh Jumphost]]
| |
| * [[ssh Tunnel]]
| |
| * [[ssh Socks Proxy]]
| |
| * [[ssh VPN]]
| |
| * [[SSH_PPP_VPN]]
| |
| * [[autossh]]
| |
| | |
| == Windows ==
| |
| * [[ssh Windows]]
| |
| * [[SSH-Agent Windows Powershell]]
| |
| * [[SSHD Powershell]]
| |
| * [[Putty Tools]]
| |
| * [[Filezilla]]
| |
| | |
| == Schnelleinstiege & Anleitungen ==
| |
| * [[ssh schnelleinstieg]]
| |
| * [[ssh howto]]
| |
| * [[ssh Aufgaben]]
| |
| | |
| ----
| |
| | |
| = Externe Quellen =
| |
| | |
| * [https://www.jfranken.de/homepages/johannes/vortraege/ssh1.de.html SSH Grundlagen (jfranken.de)]
| |
| * [https://www.digitalocean.com/community/tutorials/how-to-harden-openssh-on-ubuntu-18-04-de OpenSSH Hardening (DigitalOcean)]
| |
| * [https://www.sshaudit.com/hardening_guides.html SSH Audit – Hardening Guides]
| |
| | |
| [[Kategorie:SSH]]
| |
| [[Kategorie:Netzwerk]]
| |