Zum Inhalt

SSH

SSH wird üblicherweise dazu benutzt, um eine Terminalsitzung aus der Entfernung zu einem Host herzustellen. Zusätzlich kann jedoch eigentlich beliebiger Traffic wie rsync, SFTP oder SOCKS durch eine verschlüsselte SSH-Verbindung getunnelt werden.

Die de facto Standardimplementation ist OpenSSH. Es ist für die meisten Betriebssysteme aus der POSIX- und Unixfamilie, wie auch für moderne Windows-Versionen (10.0.16299 oder neuer) verfügbar. PuTTY ist ein anderer populärer SSH-Client für Windows.

Installation

OpenSSH für Unix und PuTTY

Installiere OpenSSH und/oder PuTTY mit dem Paketmanager deines Vertrauens.

OpenSSH für Windows

Führe folgenden PowerShell-Befehl als Administrator aus:

Get-WindowsCapability -Name OpenSSH* -Online | Add-WindowsCapability -Online

Konfiguration

Public-Key-Authentifizierung

Um das Benutzerkonto nicht Brute-Force-Attacken auszusetzen, oder um die Verwaltung des SSH-Zugriffs zu erleichtern sollte Public-Key-Authentifizierung verwendet werden. Zusammen mit einem SSH-Agent kann passwordlose Anmeldung realisiert werden.

OpenSSH

Zuerst muss ein Schlüsselpaar generiert werden. Führe hierfür folgenden Befehl aus und beantworte die gestellten Fragen:

ssh-keygen

Nun kopiere den generierten Public-Key auf die Hosts bei denen du dich in Zukunft damit anzumelden gedenktst (beispielsweise example.net):

ssh-copy-id example.net

PuTTY

Generiere ein Schlüsselpaar mit dem Programm puttygen.exe. Das Schlüsselpaar sollte dann noch im OpenSSH-Format exportiert werden, das dieses an vielen anderen Stellen erwartet wird.

SSH-Agent

Um zu vermeiden bei jedem Verbindungsaufbau sein Passwort eingeben zu müssen kann man einen SSH-Agent nutzen. Dieser cached den entschlüsselten Private-Key im RAM für die dauer der Sitzung.

GNOME Keyring

Aktiviere SSH-Unterstützung entweder beim start von GNOME Keyring auf der Kommandozeile,

eval $(gnome-keyring-daemon --components=ssh)

oder in der Konfiguration

gconftool --set /apps/gnome-keyring/daemon-components/ssh --type bool true

GNOME Keyring wird dich um deine Passwort fragen, es speichern und automatisch die Keys hinzufügen.

GnuPG gpg-agent

Aktiviere SSH-Unterstützung entweider beim start von gpg-agent,

eval $(gpg-agent --enable-ssh-support)

oder in der Konfigurationsdatei:

echo enable-ssh-support >> "${GNUPGHOME:-$HOME/.gnupg}/gpg-agent.conf"

KeePassXC

KeePassXC bietet selbst keinen eigenen SSH-Agent an, kann jedoch mit einem Bestehenden interagieren. Beim Entsperren der Datenbank können die SSH-Schlüssel automatisch zu einem bereits laufenden SSH-Agent hinzugefügt werden.

macOS Keychain

Aktiviere Autostart:

sudo touch /var/db/useLS
reboot  # Yes, really!

Füge dann deine Private-Keys hinzu:

ssh-add -K path/to/key

macOS Keychain wird dich um deren Passwörter fragen diese speichern und automatisch die SSH-Schlüssen hinzufügen.

OpenSSH ssh-agent

Viele Desktopumgebungen (sogar Windows 10) starten OpenSSHs ssh-agent automatisch. Du kannst prüfen ob er läuft, indem du versuchst seine Schlüssel aufzulisten:

ssh-add -l

Sollte er nicht laufen starte ihn:

eval $(ssh-agent)

Kann kannst du deine Schlüssel entweder manuell hinzufügen,

ssh-add ~/.ssh/id_rsa

oder ssh-agent dazu veranlassen sich nach deren erster Nutzung zu merken:

echo AddKeysToAgent yes >> ~/.ssh/config

Du kannst auch die Verwaltung von ssh-agent envoy oder keychain überlassen.

PuTTY Pageant

Starte pageant.exe und füge deinen Private-Key (die .ppk-Datei) hinzu. Um das zu automatisieren kannst du mit PowerShell einen Autostart-Eintrag im Start Menü anlegen.

$lnk = (New-Object -ComObject WScript.Shell).CreateShortcut("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\pageant.lnk")
$lnk.TargetPath = "$env:ProgramFiles\PuTTY\pageant.exe"
$lnk.Arguments = "`"$env:USERPROFILE\pfad\zu\schluessel.ppk`""
$lnk.Save()

Keepalive

Wird über eine offene SSH-Verbindung eine Weile nichts gesendet so wird sie geschlossen. Dieser Fall kann unfreiwillig eintreten wenn man auf einem Server ein Programm ausführt, dass über eine längere Zeit keine Ausgabe und damit keine Datenübertragung produziert. Um in einem solchen Fall den Abbruch der Verbindung zu verhindern muss man Keepalives aktivieren. Diese aktiviert man, indem man folgendes in seine SSH-Konfigurationsdatei einträgt:

ServerAliveCountMax 3
ServerAliveInterval 30

Nutzung

Startet eine interaktive Sitzung,

ssh example.net

oder führe nur einen einzelnen Befehl aus:

ssh example.net ls -l

Agent Forwarding

Ein weiterer Vorteil SSH-Agent zu nutzen ist, dass dessen Schlüssel auch auf einem anderen Host mittels Agent Forwarding genutzt werden können. Das ist nützlich, wenn man zum Beispiel git pull auf einem Server ausführen muss, aber dieser Server keine eigenen passenden SSH-Schlüssel hat.

Warning

Nutze Agent Forwarding niemals mit Hosts deren Administratoren du nicht vertraust. Ihnen wäre es möglich die Private-Keys aus dem Agent auszulesen.

OpenSSH

Aktiviere Agent Forwarding entweder für eine einzelne Sitzung, indem du ssh mit der Option -A ausführst, oder aktiviere es permanent für bestimmte Hosts (beispielsweise *.node.b5c.eu).

printf 'Host *.node.b5c.eu\nForwardAgent yes\n' >> ~/.ssh/config

PuTTY

Folge PuTTYs offizieller Dokumentation.

Portweiterleitung

Um nicht freigegebene Dienste hinter einer Firewall zu erreichen kann man bestimmte Ports lokal über die SSH-Verbindung weiterleiten. Damit kann man auf den Dienst zugreifen so als wäre er lokal. Für den Dienst sieht die Verbindung so als würde sie von seinem localhost kommen.

Diverse Programme bieten eine integrierte Option zur Portweiterleitung:

Für Programme die das nicht anbieten muss man manuell die Portweiterleitung starten und sich dann mit dem Programm zu diesem Port verbinden.

OpenSSH

Dieser Artikel beschreibt Portweiterleitung mit OpenSSH.

Um sich beispielsweise mit dem PostgreSQL-Server von example.net zu verbinden startet man die Portweiterleitung

ssh -NL localhost:12345:localhost:5432 example.net

und verbindet man sich mit dem weitergeleiteten Port:

psql --host=localhost --port=12345 --username=... --password

PuTTY

Dieser Artikel beschreibt Portweiterleitung mit PuTTY.

SFTP

SFTP ist ein FTP-artiges Protokoll zum Dateitransfer über SSH. Es wird von vielen Programmen unterstützt:

Warning

Vermeide FileZilla zu nutzen, da dessen Standardeinstellung es ist unverschlüsselte FTP-Verbindungen zu nutzen.

SOCKS-Proxy

SOCKS ist ein Proxy-Protokoll mit dem man andere Verbindungen über einen bestimmten Host leiten kann. Anders als bei Portweiterleitung muss das zugreifende Programm SOCKS unterstützen. SOCKS ist zum Beispiel nützlich, um IP-Whitelisting zu umgehen. So kann man lokal auf Dienste zugreifen, auf die nur der erlaubte Host Zugriff hätte.

Nach dem das Proxy wie unten beschrieben gestartet wurde muss man seinem Client noch beibringen das zu nutzen. Das geht über die Einstellungen im Betriebssystem, im Programm, über *_PROXY und *_proxy Umgebungsvariablen, oder Wrapper wie socksify oder tsocks.

OpenSSH

Ein SOCKS-Proxy beispielsweise über den Host example.net starten man wie folgt:

ssh -ND localhost:12345 example.net

Jetzt kann man seine Anwendungen konfigurieren das SOCKS-Proxy unter localhost:12345 zu nutzen.

PuTTY

Folge der Dokumentation, um das Proxy zu einzurichten.

SSHFS

Um Dateisysteme entfernter Rechner lokal einzubinden kann man SSHFS nutzen.

Linux

macOS

Windows

X11-Weiterleitung

Ähnlich wie mit RDP und VNC kann man mit X11 über SSH auf entfernte Rechner mit einer grafischen Sitzung zugreifen. Dafür ist zusätzlich zu SSH in lokaler X11-Server nötig.

Linux

Wayland

Um X11 unter Wayland nutzen zu können muss der X11-Server XWayland installiert sein.

ssh -X example.net
X11
ssh -X example.net

macOS

Um X11 unter macOS nutzen zu können muss der X11-Server XQuartz installiert sein.

ssh -X example.net

Windows

Um X11 unter Windows nutzen zu können muss der X11-Server VcXsrv installiert sein.

ssh -X example.net