keygen generate linux github amazon-web-services ssh ssh-keys

linux - generate - Agente SSH reenviar claves específicas en lugar de todas las claves ssh registradas



ssh-keygen-t rsa (2)

Estoy usando reenvío de agente, funciona bien. Pero el cliente ssh comparte todas las claves registradas (ssh-add) con el servidor remoto. Tengo claves personales que no quiero compartir con el servidor remoto. ¿Hay alguna manera de restringir el envío de claves?

Tengo varias cuentas github y cuentas aws. No quiero compartir todas las ssh-keys.


Las claves en sí mismas no se comparten reenviando a su agente. Lo que se reenvía es la posibilidad de contactar al ssh-agent en su host local. Los sistemas remotos envían solicitudes de desafío a través del túnel de reenvío. No solicitan las llaves ellos mismos.

Consulte http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#fwd para obtener una explicación gráfica.


Parece que es posible con OpenSSH 6.7 - es compatible con el reenvío de socket unix. Podríamos iniciar ssh-agent secundario con claves específicas y reenviar su socket al host remoto. Lamentablemente, esta versión no está disponible para mi servidor / sistema cliente en el momento de la escritura.

He encontrado otra solución posible, utilizando socat y el reenvío SSH TCP estándar.

Idea

  1. En el host local, ejecutamos ssh-agent secundario con solo las claves que queremos ver en el host remoto.
  2. En el host local, configuramos el reenvío de conexiones TCP en algún puerto (portXXX) al socket secundario de ssh-agent.
  3. En el host remoto configuramos el reenvío desde algún socket a algún puerto TCP (portYYY).
  4. Luego establecemos la conexión ssh con el reenvío de puertos desde el portYYY del control remoto al portXXX local.

Las solicitudes al agente de ssh son así:

local ssh-agent (secondary) ^ | v /tmp/ssh-.../agent.ZZZZZ - agent''s socket ^ | (socat local) v localhost:portXXX ^ | (ssh port forwarding) v remote''s localhost:portYYY ^ | (socat remote) v $HOME/tmp/agent.socket ^ | (requests for auth via agent) v SSH_AUTH_SOCK=$HOME/tmp/agent.socket ^ | (uses SSH_AUTH_SOCK variable to find agent socket) v ssh

Inconvenientes

  1. No es completamente seguro, porque ssh-agent pasa a estar parcialmente disponible a través de TCP: los usuarios del host remoto pueden conectarse a su agente local en 127.0.0.1:portYYY, y otros usuarios de su host local pueden conectarse en 127.0.0.1:portXXX. Pero verán solo un conjunto limitado de claves que agregaste manualmente a este agente. Y, como mencionó AllenLuce , no pueden tomarlo , solo podrían usarlo para autenticación mientras el agente se está ejecutando.
  2. socat debe estar instalado en el host remoto. Pero parece que es posible simplemente cargar un archivo binario precompilado (lo probé en FreeBSD y funciona).
  3. Sin automatización: las claves se deben agregar manualmente a través de ssh-add , el reenvío requiere 2 procesos adicionales (socat) para ser ejecutados, múltiples conexiones ssh deben ser administradas manualmente.

Entonces, esta respuesta es probablemente solo una prueba de concepto y no una solución de producción.

Veamos cómo se puede hacer.

Instrucción

El lado del cliente (donde se ejecuta ssh-agent)

Ejecuta el nuevo ssh-agent. Se usará para las claves que desee ver solo en el host remoto.

$ ssh-agent # below is ssh-agent output, DO NOT ACTUALLY RUN THESE COMMANDS BELOW SSH_AUTH_SOCK=/tmp/ssh-qVnT0UsgV6yO/agent.22982; export SSH_AUTH_SOCK; SSH_AGENT_PID=22983; export SSH_AGENT_PID;

Imprime algunas variables. No los configure: perderá su agente principal de ssh. Establezca otra variable con el valor sugerido de SSH_AUTH_SOCK :

SSH_AUTH_SECONDARY_SOCK=/tmp/ssh-qVnT0UsgV6yO/agent.22982

Luego, establezca el reenvío desde algún puerto TCP a nuestro socket ssh-agent localmente:

PORT=9898 socat TCP4-LISTEN:$PORT,bind=127.0.0.1,fork UNIX-CONNECT:$SSH_AUTH_SECONDARY_SOCK &

socat se ejecutará en segundo plano. No te olvides de kill cuando hayas terminado.

Agregue algunas claves usando ssh-add , pero ejecútelo con la variable de SSH_AUTH_SOCK modificada SSH_AUTH_SOCK :

SSH_AUTH_SOCK=$SSH_AUTH_SECONDARY_SOCK ssh-add

Lado del servidor (host remoto)

Conéctese al host remoto con el reenvío de puertos. Su agente ssh principal (no secundario) se usará para auth en hostA (pero no estará disponible, ya que no lo reenviamos).

home-host$ PORT=9898 # same port as above home-host$ ssh -R $PORT:localhost:$PORT userA@hostA

En el host remoto, establezca el reenvío desde el socket ssh-agent al mismo puerto TCP que en su host doméstico:

remote-host$ PORT=9898 # same port as on home host remote-host$ mkdir -p $HOME/tmp remote-host$ SOCKET=$HOME/tmp/ssh-agent.socket remote-host$ socat UNIX-LISTEN:$SOCKET,fork TCP4:localhost:$PORT &

socat se ejecutará en segundo plano. No te olvides de kill cuando hayas terminado. No se cierra automáticamente cuando cierra la conexión ssh.

Conexión

El host remoto establece la variable de entorno para que ssh sepa dónde está el conector del agente (del paso anterior). Se puede hacer en la misma sesión ssh o en paralelo uno.

remote-host$ export SSH_AUTH_SOCK=$HOME/tmp/ssh-agent.socket

Ahora es posible usar las claves del agente secundario en el host remoto:

remote-host$ ssh userB@hostB # uses secondary ssh agent Welcome to hostB!