SSH Agent reenvío utilizando diferentes nombres de usuario y diferentes claves

18

Hay una pregunta muy similar que, si se respondió, puede haber sido la respuesta a esta pregunta. Desafortunadamente es un caso de "no es necesario responder la pregunta que hice porque el problema no era lo que pensaba que era".

La puesta en marcha

  1. El servidor bastion.ec2 acepta una conexión ssh desde mi estación de trabajo a través dessh -i mykey.pem [email protected]
  2. El servidor service1.ec2 acepta conexiones ssh solo desde bastion.ec2 a través dessh -i sharedkey.pem [email protected]

Los requisitos

  1. Ambas teclas solo están en mi estación de trabajo, por lo que no puedo hacer el segundo comando sin copiar la tecla
  2. Por razones de seguridad, quiero usar el reenvío de agente ssh en lugar de copiar las claves ssh a bastion.ec2

La solución

Aquí es donde entras. ¿Cómo puedo reenviar una clave diferente para la segunda conexión?

Si shareduser tuviera mykey.pub en esto, ~/.ssh/authorized_keysesto funcionaría:

ssh -i mykey.pem [email protected] ssh [email protected]

Sin embargo, no quiero que todos los usuarios tengan que poner su clave pública en cada servidor.

Bruno Bronosky
fuente

Respuestas:

21

Paso 1

Asegúrese de que su agente local esté listo

El hecho de que pueda ingresar a su servidor bastion sin especificar su ruta de clave o que se le solicite la contraseña, no significa que su agente ssh esté ejecutando y manteniendo su clave. Algunos sistemas operativos modernos (por ejemplo: OSX) manejan esto por usted.

En su máquina local

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

Figura 1

Eso significa que su agente se está ejecutando y tiene su clave.

$ ssh-add -L
The agent has no identities.

Figura 2

Eso significa que no ha agregado ninguna clave a su agente. Arregla eso con:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

Fig. 3

Paso 2

Asegúrese de que su agente remoto esté listo

SSH en su servidor de bastión y repita la comprobación de la figura 1 y la figura 2 . Sin embargo, el error que es más probable que obtenga es este:

$ ssh-add -L
Could not open a connection to your authentication agent.

fig.4

Lo más probable es que su cliente SSH no esté reenviando su conexión de agente de autenticación.

Puede forzar esto con el -Aindicador (siempre que la configuración sshd en el servidor lo permita, que es el valor predeterminado ).

$ ssh -A bastion.ec2

fig.5

Paso 3

Asegúrate de estar usando las teclas correctas

Si ha agregado claves a su agente, su agente está reenviando y su agente remoto enumera sus claves locales. Solo hay dos razones probables por las que no está obteniendo una conexión. O no está utilizando la clave correcta o no está utilizando el nombre de usuario correcto.

Envíe la contraparte pública a su clave privada:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

fig.6

Estos deben ser los mismos que lo que estaban viendo desde ssh-add -Larriba de la ==cerca del final.

Ahora, de una forma u otra, debe ingresar al cuadro al que no se está conectando y mirar el contenido del $HOME/.ssh/authorized_keysarchivo para el usuario al que está tratando de conectarse. Debe asegurarse de que la clave pública que genera con el comando anterior esté en ese archivo en una línea por sí misma. No puedes confiar en que los sharedkey.pubcubos Bro 2 te hayan enviado por correo electrónico. ¡Verificar! Esto puede requerir que alguien más pueda usar SSH como ese usuario para obtener el archivo autorizado_claves u obtener acceso de root. Si has llegado hasta aquí y todavía no funciona, estás más allá de tomar atajos.

Etapa 4

Hazlo facil

Esperemos que los pasos anteriores lo hayan incluido. Ahora hagamos que este dolor de cabeza desaparezca mientras esté usando esta estación de trabajo.

Configure su cliente ssh local

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh [email protected]

fig.7

Si no quita nada más de la figura 7 , debería ser el uso adecuado de ProxyCommand& ForwardAgent.

Rellenar automáticamente su .bash_profile

No querrá hacerlo ssh-addmanualmente cada vez que inicie sesión en su máquina. ~/.bash_profilees un script que se ejecuta cada vez que inicia sesión **. Ponga la línea de la fig. 3 allí y siempre debe tener a su agente listo.

** No confunda esto con el .bashrcque se ejecuta para cada nueva terminal [interactiva]. Su agente continúa ejecutándose incluso si cierra todas sus sesiones de terminal. No es necesario recargar tus llaves

Alternativa al uso de .bash_profile

También he creado una esencia que agrega un OSX / macOS Launch Agent . Puede utilizar este método para iniciar su ssh-agentarranque en. Es muy fácil de instalar:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash
Bruno Bronosky
fuente
Paso 2: No se puede obligar ForwardAgent yesa -Asi el anfitrión no lo permite.
dlamblin
Gracias @dlamblin, agregué la información relevante y un enlace a la documentación de sshd.
Bruno Bronosky
1

Aquí es donde entras. ¿Cómo puedo reenviar una clave diferente para la segunda conexión?

No reenvías las llaves. Reenvía el agente y puede tener claves completamente independientes de las que está utilizando para la autenticación en el primer salto. Verifique las claves en su agente usando ssh-add -L.

Pero aún mejor, ejecute la conexión ProxyCommand ssh -W %h:%p [email protected], lo que evitará la necesidad de reenviar el agente, el montón o las opciones de línea de comandos y la necesidad de autenticarse desde el host inmediato.

Simplemente puede poner eso en su configuración (ver man ssh_config).

Jakuje
fuente
1
Afortunadamente, realmente sé de lo que estás hablando aquí, pero el usuario promedio no lo haría. Usted discute la semántica con su cosa de "usted remite agentes, no claves". Me diste lo suficiente para continuar y pude resolver esto, así que quiero darte la oportunidad de corregir tu respuesta antes de agregar la mía. Sugerencia: ssh-add mykey.pem sharedkey.pemluego confirme con ssh-add -Lentoncesssh -At [email protected] ssh [email protected]
Bruno Bronosky