Tempo limite da chave ssh-agent com screen ou tmux no host bastião

8

Normalmente eu tenho o ssh-agent em execução, ssh para o meu host bastião, então abro uma sessão do tmux e me conecto a outras caixas por meio disso. O encaminhamento de chave funciona para todas as sessões que eu abrir a partir desse ponto.

Se eu reiniciar minha sessão do tmux após fechar o terminal, dormir meu laptop, o que for, meu encaminhamento de chave nas sessões do bastião ainda funcionará, assim como o encaminhamento em novas sessões. Os existentes não funcionam, no entanto.

Tenho uma coisinha no bashrc que mantém o encaminhamento de chaves funcionando quando eu reinicio o tmux, mas estou tendo problemas para descobrir como fazê-lo continuar trabalhando para sessões abertas no tmux.

Por exemplo, eu tenho bastion01, dbhost01, dbhost02, webhost01 e webhost02.

Se eu abrir uma conexão com o bastion01, inicie o tmux lá e conecte-se aos trabalhos de encaminhamento do dbhost01 e do webhost01. Se eu fechar essa conexão, reconectar e anexar minha sessão tmux existente, adicione conexões ao dbhost02 e webhost02, o encaminhamento de chave funcionará nas caixas 02, mas não na 01.

Por favor ajude!

Jericon
fonte

Respostas:

11

Cada vez que você entra no ssh bastion01, um soquete diferente é aberto para lidar com o encaminhamento de chave. Você pode ver o nome do arquivo na variável de ambiente SSH_AUTH_SOCK. Quando você inicia tmux, o valor dessa variável de ambiente é incluído no tmuxambiente global, que é herdado por todos os shells iniciados nessa sessão.

Agora, quando você se reconectar bastion01mais tarde, um soquete diferente será alocado para lidar com o encaminhamento de chaves (já que é uma nova sessão ssh). Você pode ver isso examinando o valor de SSH_AUTH_SOCKantes de se reconectar à sua tmuxsessão e depois. Para que o encaminhamento de chave funcione internamente tmux, é necessário atualizar o valor de SSH_AUTH_SOCKinside tmuxpara o nome do soquete que está sendo usado pela sessão ssh atual.

Uma maneira rápida e suja de fazer isso é escrever um script curto que salvará esse novo valor em um arquivo e executá-lo dentro de qualquer tmuxjanela da qual você estará sshindo.

#!/bin/bash

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

Execute esse script assim que você fizer o SSH bastion01, mas antes de se reconectar à sua sessão do tmux. Antes de tentar ssh em qualquer lugar por dentro tmux, execute o seguinte:

source ~/.auth_ssh

Cada tmuxjanela possui seu próprio ambiente, portanto, você precisará executá-lo em cada janela em que tentar executar o ssh. Para simplificar, você pode também usar o ssh para fazer isso por você:

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

Nota: esta é uma simplificação grosseira de um script que usamos no trabalho para atualizar as informações de autorização SSH. Se não funcionar muito bem, espero que isso pelo menos ofereça informações suficientes para pesquisar uma solução melhor no Google (ou alguém postar uma solução melhor aqui).

chepner
fonte