SSH Multiplexing
Eine TCP-Verbindung zwischen Client und Server aufbauen, anschließend mehrere SSH- Sessions darüber abbilden. Manuelle Authentifizierung nur für die erste SSH-Session, danach Authentifizierung On-the-fly und transparent gegenüber der Nutzer*in.
Anwendungszenario
SSH bietet schöne Wege, das Benutzungserlebnis stark zu verbessern.1 Alle erfordern sie eine Authentifizierung am Zielsystem. Und wer dabei den sicheren Weg geht, muss früher oder später ein Passwort eingeben - fürs Zielsystem, für den SSH Key, für den Yubi-/ Nitro-/ Only-/ Whateverkey…
Erstmal ohne Zusammenhang kann es weiterhin vorkommen, dass man mehrere parallele Sessions auf einem Zielsystem haben möchte. Beispiel: was testen und gleichzeitig ins Log schauen. Auf manchen Systemen kann man das per Software erreichen. Tmux, screen und Co. laufen auf dem Zielsystem und erfüllen diesen Bedarf. Allerdings gibt es auch Zielsysteme ohne solche Software. Vor allem Netzwerkappliances sind Kandidaten dafür. Wer dort parallele Sessions braucht, muss also parallele SSH-Sessions öffnen. Und dabei je nach Konfiguration für jeden Session-Aufbau ein Passwort eingeben.
SSH Multiplexing2 ermöglicht es im beschriebenen Szenario, die Anzahl der Passworteingaben zu reduzieren. Dazu wird beim initialen Verbindungsaufbau ein Socket auf dem lokalen System angelegt. Über diesen Socket können anschließend weitere SSH Sessions aufgebaut und transparent authentifiziert werden.
Vorbereitungen
Der Socket sollte an einem Ort abgelegt werden, auf den nur der eigene User Zugriff hat. Über den Socket kann mit dem eigenen eine Verbindung zum Zielsystem aufgebaut werden. Das möchte man in der Regel nur selbst tun können und niemand anderem ermöglichen.
Zur Ablage der Sockets wird also zunächst ein Ordner angelegt:
mkdir ~/.ssh/controlmasters
Verbindungsaufbau
Anschließend wird eine initiale Verbindung zum Zielsystem aufgebaut:
ssh -M -S ~/.ssh/controlmasters/%r@%h:%p alice@example.com
Der Parameter -M gibt dabei an, dass es sich um eine initiale Multiplexing-Verbindung
handelt (‘M’ steht hier für ‘ControlMaster’). Der Parameter -S gibt den Pfad zum
verwendeten Socket an. Die Variablen %r@%h:%p stehen für den Remote Username, den
Remote Host und den Remote Port - sorgen also für einen eindeutigen Namen des Sockets.
Nachdem die initiale Verbindung aufgebaut ist, wird ein entsprechender Socket im zuvor angelegten Ordner liegen.
Nun können weitere Verbindungen mit zum selben Ziel folgendermaßen aufgebaut werden:
ssh -S ~/.ssh/controlmasters/%r@%h:%p alice@example.com
Einziger Unterschied zur initialen Verbindung ist hier das Weglassen des Parameters -M.
Das sorgt dafür, dass kein neuer Socket angelegt sondern der bestehende Socket verwendet
wird.
Verbindungsabbau
Zum Beenden der Multiplexing-Verbindung können schlicht alle offenen SSH-Sessions
beendet werden. Sollte das nicht möglich sein (bspw. weil eine Session im Hintergrund
läuft o.ä.) hilft alternativ der Parameter -O beim Beenden.
In der Variante -O stop wird der Socket entfernt und neue Sessions können nicht mehr
aufgebaut werden. Aktive Sessions bleiben aber bestehen, bis sie manuell abgebaut werden.
ssh -O stop -S ~/.ssh/controlmasters/%r@%h:%p alice@example.com
Alternativ dazu sorgt die Variante -O exit dafür, dass der Socket entfernt und alle
bestehenden Verbindungen unmmittelbar abgebaut werden.
ssh -O exit -S ~/.ssh/controlmasters/%r@%h:%p alice@example.com
~/.ssh/config
Wer sich die Parameter-Eintipperei sparen will, findet sein Glück in der ~/.ssh/config.
Dort können die Parameter ebenfalls angegeben werden. Aus -M wird ControlMaster und
aus -S wird ControlSocket. Die obige Verbindung per Konfigdatei abgebildet sieht dann
folgendermaßen aus:
Host example
HostName example.com
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
Mit dieser Konfiguration sind die folgenden beiden Befehle damit identisch:
ssh -M -S ~/.ssh/controlmasters/%r@%h:%p alice@example.com
ssh alice@example
Die Angabe Controlmaster auto sorgt dafür, dass der SSH Client automatisch erkennt,
ob bereits ein Socket vorhanden ist - und einen anlegt, wenn nicht.
Einschränkungen
In der Powershell-Implementierung von OpenSSH ist Multiplexing nicht implementiert.3 Dort muss dementsprechend auf einen anderen SSH Client bzw. auf WSL ausgewichen werden.
Anschlussgedanken
Wir wissen nun, was SSH Multiplexing ist und wie wir es verwenden können. Jetzt, wo wir das Werkzeug kennen, müssen wir uns überlegen, wann eine Verwendung angebracht ist und wann nicht.