Délai d'expiration de la clé ssh-agent avec écran ou tmux sur l'hôte bastion

8

Normalement, j'ai ssh-agent en cours d'exécution, je ssh vers mon hôte bastion, puis j'ouvre une session tmux et je me connecte à d'autres boîtes via cela. Le transfert de clé fonctionne pour toutes les sessions que j'ouvre à partir de ce moment.

Si je reprends ma session tmux après avoir fermé le terminal, endormi mon ordinateur portable, peu importe, le transfert de clé sur mes sessions bastion fonctionne toujours, tout comme le transfert sur toutes les nouvelles sessions. Cependant, ceux existants ne fonctionnent pas.

J'ai une petite chose dans mon bashrc qui continue de faire fonctionner le transfert de clés lorsque je reprends tmux, mais j'ai du mal à trouver comment le faire fonctionner pour les sessions ouvertes dans tmux.

Par exemple, j'ai bastion01, dbhost01, dbhost02, webhost01 et webhost02.

Si j'ouvre une connexion à bastion01, lancez tmux là-bas, puis connectez-vous aux travaux de transfert dbhost01 et webhost01. Si je ferme cette connexion, me reconnecte et attache ma session tmux existante, puis ajoute des connexions à dbhost02 et webhost02, le transfert de clé fonctionne sur les zones 02, mais pas sur le 01.

Aidez-moi!

Jericon
la source

Réponses:

11

Chaque fois que vous ouvrez bastion01un ssh , un socket différent est ouvert pour gérer le transfert de clé. Vous pouvez voir le nom de fichier dans la variable d'environnement SSH_AUTH_SOCK. Lorsque vous démarrez tmux, la valeur de cette variable d'environnement est incluse dans tmuxl'environnement global de, qui est hérité par tous les shells démarrés dans cette session.

Maintenant, lorsque vous vous reconnectez à bastion01plus tard, un socket différent est alloué pour gérer votre transfert de clé (car il s'agit d'une nouvelle session ssh). Vous pouvez le voir en examinant la valeur de SSH_AUTH_SOCKavant de vous reconnecter à votre tmuxsession et après. Pour que le transfert de clé fonctionne à l'intérieur tmux, vous devez mettre à jour la valeur de SSH_AUTH_SOCKinside tmuxau nom du socket utilisé par la session ssh en cours.

Une façon rapide et sale de le faire est d'écrire un court script qui enregistrera cette nouvelle valeur dans un fichier, et l'exécutera dans n'importe quelle tmuxfenêtre d'où vous serez ssh.

#!/bin/bash

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

Exécutez ce script dès que vous utilisez ssh bastion01, mais avant de vous reconnecter à votre session tmux. Ensuite, avant d'essayer de ssh n'importe où de l'intérieur tmux, exécutez ce qui suit:

source ~/.auth_ssh

Chaque tmuxfenêtre a son propre environnement, vous devrez donc l'exécuter dans chaque fenêtre où vous essayez d'exécuter ssh. Pour plus de simplicité, vous pouvez alias ssh le faire pour vous:

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

Remarque: il s'agit d'une simplification grossière excessive d'un script que nous utilisons au travail pour mettre à jour les informations d'autorisation SSH. Si cela ne fonctionne pas tout à fait correctement, j'espère que cela vous donnera au moins suffisamment d'informations pour rechercher une meilleure solution sur google (ou que quelqu'un d'autre poste une meilleure solution ici).

chepner
la source