Tiempo de espera de la clave ssh-agent con pantalla o tmux en el servidor bastion

8

Normalmente tengo ssh-agent ejecutándose, ssh a mi servidor bastion, luego abro una sesión tmux y me conecto a otros cuadros a través de eso. El reenvío de claves funciona para cualquier sesión que abra desde ese momento en adelante.

Si reanudo mi sesión de tmux después de cerrar la terminal, durmiendo mi computadora portátil, lo que sea, mi reenvío de claves en mis sesiones de bastión todavía funciona, al igual que el reenvío en cualquier sesión nueva . Sin embargo, los existentes no funcionan.

Tengo una cosita en mi bashrc que mantiene el reenvío de claves funcionando cuando reanudo tmux, pero tengo problemas para descubrir cómo hacerlo funcionar para sesiones abiertas dentro de tmux.

Por ejemplo, tengo bastion01, dbhost01, dbhost02, webhost01 y webhost02.

Si abro una conexión a bastion01, inicio tmux allí y luego me conecto a dbhost01 y el reenvío webhost01 funciona. Si cierro esa conexión, vuelvo a conectar y adjunto mi sesión tmux existente, luego agrego conexiones a dbhost02 y webhost02, el reenvío de claves funciona en los cuadros 02, pero no en el 01.

¡Por favor ayuda!

Jericon
fuente

Respuestas:

11

Cada vez que ingresa bastion01, se abre un socket diferente para manejar el reenvío de claves. Puede ver el nombre del archivo en la variable de entorno SSH_AUTH_SOCK. Cuando comienza tmux, el valor de esa variable de entorno se incluye en tmuxel entorno global de, que se hereda por los shells iniciados en esa sesión.

Ahora, cuando se vuelve a conectar bastion01más tarde, se asigna un socket diferente para manejar el reenvío de claves (ya que es una nueva sesión ssh). Puede ver esto examinando el valor de SSH_AUTH_SOCKantes de volver a adjuntar a su tmuxsesión y después. Para que el reenvío de claves funcione dentro tmux, debe actualizar el valor de SSH_AUTH_SOCKinside tmuxal nombre del socket que está utilizando la sesión ssh actual.

Una manera rápida y sucia de hacer esto es escribir un script corto que guardará este nuevo valor en un archivo, y ejecutarlo dentro de cualquier tmuxventana desde la que vaya a estar ssh.

#!/bin/bash

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

Ejecute ese script tan pronto como ingrese bastion01, pero antes de volver a adjuntarlo a su sesión tmux. Luego, antes de intentar ssh desde cualquier lugar desde adentro tmux, ejecute lo siguiente:

source ~/.auth_ssh

Cada tmuxventana tiene su propio entorno, por lo que deberá ejecutarlo en cada ventana donde intente ejecutar ssh. Por simplicidad, puedes usar alias ssh para hacerlo por ti:

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

Nota: esta es una simplificación excesiva de un script que utilizamos en el trabajo para actualizar la información de autorización de SSH. Si no funciona del todo bien, espero que al menos le brinde suficiente información para buscar en Google una mejor solución (o alguien más publica una mejor solución aquí).

chepner
fuente