ssh-agent key timeout mit screen oder tmux auf bastion host

8

Normalerweise läuft ssh-agent, ich ssh zu meinem Bastion-Host, öffne dann eine tmux-Sitzung und verbinde mich dadurch mit anderen Boxen. Die Schlüsselweiterleitung funktioniert für alle Sitzungen, die ich ab diesem Zeitpunkt öffne.

Wenn ich meine tmux-Sitzung nach dem Schließen des Terminals fortsetze und meinen Laptop schlafe, funktioniert meine Schlüsselweiterleitung in meinen Bastion-Sitzungen weiterhin, ebenso wie die Weiterleitung in neuen Sitzungen. Bestehende funktionieren jedoch nicht.

Ich habe eine Kleinigkeit in meinem Bashrc, die die Schlüsselweiterleitung funktioniert, wenn ich tmux wieder aufnehme, aber ich habe Probleme herauszufinden, wie ich sie dazu bringen kann, für Sitzungen zu arbeiten, die innerhalb von tmux geöffnet sind.

Zum Beispiel habe ich bastion01, dbhost01, dbhost02, webhost01 und webhost02.

Wenn ich eine Verbindung zu bastion01 öffne, starte dort tmux und verbinde mich dann mit dbhost01 und webhost01. Die Weiterleitung funktioniert. Wenn ich diese Verbindung schließe, meine vorhandene tmux-Sitzung erneut verbinde und anhänge und dann Verbindungen zu dbhost02 und webhost02 hinzufüge, funktioniert die Schlüsselweiterleitung auf den 02-Boxen, jedoch nicht auf der 01.

Bitte helfen Sie!

Jericon
quelle

Antworten:

11

Jedes Mal, wenn Sie einsteigen bastion01, wird ein anderer Socket geöffnet, um die Schlüsselweiterleitung zu übernehmen. Sie können den Dateinamen in der Umgebungsvariablen sehen SSH_AUTH_SOCK. Wenn Sie starten tmux, ist der Wert dieser Umgebungsvariablen in tmuxder globalen Umgebung enthalten, die von allen in dieser Sitzung gestarteten Shells geerbt wird.

Wenn Sie jetzt eine Verbindung zu einem bastion01späteren Zeitpunkt herstellen , wird ein anderer Socket zugewiesen, um Ihre Schlüsselweiterleitung zu verwalten (da es sich um eine neue SSH-Sitzung handelt). Sie können dies sehen, indem Sie den Wert von SSH_AUTH_SOCKvor tmuxund nach dem erneuten Anhängen an Ihre Sitzung überprüfen. Damit die Schlüsselweiterleitung innerhalb funktioniert tmux, müssen Sie den Wert von SSH_AUTH_SOCKinside tmuxauf den Namen des Sockets aktualisieren, der von der aktuellen SSH-Sitzung verwendet wird.

Eine schnelle und schmutzige Möglichkeit, dies zu tun, besteht darin, ein kurzes Skript zu schreiben, das diesen neuen Wert in einer Datei speichert, und dieses in einem beliebigen tmuxFenster auszuführen, aus dem Sie kommen ssh.

#!/bin/bash

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.auth_ssh

Führen Sie dieses Skript aus, sobald Sie ssh in bastion01, aber bevor Sie erneut eine Verbindung zu Ihrer tmux-Sitzung herstellen. tmuxFühren Sie dann Folgendes aus, bevor Sie versuchen, irgendwo von innen zu ssh :

source ~/.auth_ssh

Jedes tmuxFenster hat eine eigene Umgebung, daher müssen Sie diese in jedem Fenster ausführen, in dem Sie versuchen, ssh auszuführen. Der Einfachheit halber können Sie alias ssh verwenden, um dies für Sie zu tun:

alias ssh="source ~/.auth_ssh; ssh"

Hinweis: Dies ist eine grobe Vereinfachung eines Skripts, das wir bei der Arbeit verwenden, um die SSH-Autorisierungsinformationen zu aktualisieren. Wenn es nicht ganz richtig funktioniert, hoffe ich, dass Sie dadurch zumindest genug Informationen erhalten, um eine bessere Lösung zu googeln (oder jemand anderes veröffentlicht hier eine bessere Lösung).

chepner
quelle