Agente SSH reenviar keys específicas en lugar de todas las keys ssh registradas

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

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

Parece que es posible con OpenSSH 6.7 – es compatible con el reenvío de socket unix. Podríamos iniciar ssh-agent secundario con keys específicas y reenviar su socket al host remoto. Lamentablemente, esta versión no está disponible para mi server / 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 keys 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 connection ssh con el reenvío de puertos desde el portYYY del control remoto al portXXX local.

Las requestes 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 set limitado de keys que agregaste manualmente a este agente. Y, como mencionó AllenLuce , no pueden tomarlo , solo podrían usarlo para authentication mientras el agente se está ejecutando.
  2. socat debe estar instalado en el host remoto. Pero parece que es posible simplemente cargar un file binary precomstackdo (lo probé en FreeBSD y funciona).
  3. Sin automation: las keys se deben agregar manualmente a través de ssh-add , el reenvío requiere 2 processs adicionales (socat) para ser ejecutados, múltiples conexiones ssh deben ser administradas manualmente.

Entonces, esta respuesta es probablemente solo una testing 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 keys 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 keys 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 server (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 connection 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 session ssh o en paralelo uno.

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

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

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

Las keys 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 requestes 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 get una explicación gráfica.