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
- SSHFS von OSXFUSE
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