ssh-agent y screen


8

Hace un tiempo en StackOverflow, hice esta pregunta sobre ssh-agent y crontab . Tengo una pregunta similar ahora sobre ssh-agent y screen en sistemas linux.

Entonces, en mi Mac, ssh-agent se inicia al iniciar el sistema, por lo que siempre está disponible para mí. Creo que sería cierto bajo mi linux (redhat el5 / fedora) si estuviera usando X-Windows. Sin embargo, esta es una máquina de servidor remoto y siempre estoy iniciando sesión a través de ssh.

Me encantaría tener las claves ssh configuradas correctamente para no tener que ingresar mi contraseña varias veces durante una actualización o confirmación de svn. Estoy feliz de escribir mi frase de contraseña una vez por sesión, y desaliento a nuestro equipo de tener claves ssh sin contraseña.

Por un breve momento brillante, parecía que hacer "eval` ssh-agent -s` "en mi .bash_profile, junto con un comando para matar al ssh-agent cuando me desconectaba, funcionaría. Sin embargo, hacemos un uso intensivo de la pantalla para administrar programas interactivos de larga duración y entornos de desarrollo. Si inicia y detiene ssh-agent como acabo de describir, entonces se elimina cuando sale del terminal, y las sub-sesiones de la pantalla que solían referirse a esa instancia de ssh-agent se abandonan.

Entonces ... ¿cómo puedo ser un usuario de la consola, que usa la pantalla, que usa una contraseña con sus teclas ssh, que no tiene que escribir la frase de contraseña constantemente?

Respuestas:


4

Con la siguiente configuración, no necesitará ningún contenedor para invocar screen. Además, evita el uso /tmp(con los consiguientes riesgos de seguridad).

  1. Asegúrese de tener un directorio ~ / tmp:

    mkdir ~/tmp
    
  2. Agregue a .screenrcla siguiente línea:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • Esto garantiza que screen, en el interior , sshbusque el zócalo siempre en la misma ubicación, en lugar de una ruta cambiante.
    • Debe usar setenvcualquier shell que use, ya que es una pantalla y no un comando de shell.
  3. Agregue a .bash_profilela siguiente línea:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • Esto vinculará desde la ubicación fija (donde se sshve) a la real, y debe aparecer después de comenzar ssh-agent.
    • Usar [ -n "$SSH_AUTH_SOCK" ]correctamente evitará errores cuando SSH_AUTH_SOCKno esté configurado.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]evitará sesiones de pantalla que vinculen $ HOME / tmp / ssh-agent-screen consigo mismo, si las fuentes de la pantalla .bash_profile.
  4. En lugar de comenzar ssh-agenten .bash_profile, se puede considerar que conecta con ssh -A(para usar el agente de reenvío y hacer que el uso de la máquina remota a su agente).

Después de esta configuración, puede usar el comando de pantalla estándar. Solo necesitará recrear sesiones existentes o establecer manualmente SSH_AUTH_SOCK dentro de ellas en la ubicación fija del paso 2.

Créditos a este sitio web para la idea; Evité usar /tmp. Esta respuesta es similar pero usa alias adicionales.


2

¿Se puede iniciar ssh-agent desde un initscript en lugar de .bash_profile? Por ejemplo, podría poner

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

en la parte apropiada de /etc/conf.d/local, aunque RHEL / Fedora probablemente usa un sistema diferente. Como señaló en su comentario, las sesiones de terminal deberán poder conectarse al agente, por lo que ese comando crea el archivo .ssh_agent_enven el directorio de inicio del usuario. Entonces puedes agregar

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

en .bash_profile.

Otra cosa que puedes hacer es poner lo siguiente en .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

que comenzará ssh-agentsolo si aún no se está ejecutando. Entonces no tienes que matarlo.

Como alternativa ligeramente diferente a la segunda sugerencia, en lugar de verificar la existencia de un ssh-agentproceso, puede verificar la existencia del archivo ~/.ssh_agent_env,

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

Si todo funciona correctamente, no debería haber ninguna diferencia significativa entre las dos formas.


La idea initscript es interesante. Básicamente, ¿solo comienza en el inicio del sistema para todos los usuarios que lo deseen? Eso podría funcionar. No tenemos muchos usuarios a quienes les importe. Si eso es significativamente mejor que no tener una frase de contraseña es una pregunta interesante, ya que sospecho que eso significa que solo tendría que ingresarla una vez por reinicio de la máquina. Hmm Tanto eso como la segunda sugerencia dependen de que las nuevas sesiones de terminal puedan conectarse al agente ssh si ya se está ejecutando. No estoy completamente seguro de que sea tan fácil, pero aún no lo he intentado. Gracias por las ideas!
Michael H.

@khedron: Sí, pero tendría que poner una línea /etc/conf.d/local(o su equivalente) para cada usuario que use el agente, para iniciar un ssh-agentproceso separado por usuario. Si, como usted dice, no tiene una gran cantidad de usuarios, eso no sería tan malo. Planteas un buen punto (que olvidé considerar) sobre las sesiones de terminal que se adjuntan al agente; mira mi edición de la respuesta.
David Z


2

Un mejor enfoque es usar reenvío de agente ssh ( -Aopción). Esto le permite a la persona que usa ssh usar las claves del agente ssh que se ejecuta en la máquina de la que proviene, presumiblemente la estación de trabajo en la que realmente están sentados.


Esto también permite que un atacante que comprometa su cuenta comprometa cuentas en otras máquinas a las que pueda acceder ese agente. Por lo tanto, trato de mantener el reenvío de agente ssh al mínimo.
Paul Price

2

para realizar un seguimiento del reenvío de agente ssh, encontrará que, de manera predeterminada, las credenciales ssh reenviadas no estarán disponibles para su sesión de pantalla una vez que cierre sesión, vuelva a iniciar sesión y vuelva a adjuntarla a su sesión.

Sin embargo, puede evitar esto haciendo que la pantalla establezca la variable de entorno SSH_AUTH_SOCK en algo conocido, y que esa ubicación conocida se actualice a su socket de autenticación actual.

Utilizo esta función de shell para volver a ingresar a la pantalla y arreglar el calcetín de autenticación ssh:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

y tengo esto en mi .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

Espero que esto ayude.


El uso de / tmp significa que cualquier otra persona en la máquina puede bloquear cualquiera de sus archivos, si conoce su ruta.
Blaisorblade

1

Si te entendí bien, solo quieres una sesión de pantalla, que a veces desconectas y vuelves a conectar, pero nunca más quieres volver a ingresar las contraseñas para el agente ssh (tu contraseña de clave privada).

Creo que la forma más fácil es iniciar la pantalla, que iniciar ssh-agent con un sub shell y luego permanecer en ese sub shell. Es decir

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running

Eso es esencialmente lo que hago. Utilizo la pantalla para etiquetar una de las "pestañas" dentro como si tuviera poderes de agente ssh, y la uso para el trabajo de svn, etc. Hay una arruga adicional en la que forzo a ssh-agent a volver a autorizar después de varias horas, pero sí, Esto es básicamente donde estoy.
Michael H.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.