SSH de A a B a C, usando la clave privada en B

60

Estoy buscando una forma simple de SSH desde mi máquina local, A, a través de un proxy, B, a un host de destino, C. La clave privada que acompaña a la clave pública en C está en B, y no puedo pon esa llave en mi máquina local. ¿Algun consejo?

Además, me gustaría poder hacer esto usando ~ / .ssh / config.

¡Gracias!

vaquero
fuente
1
¿Estás diciendo que quieres pasar de A a B y luego de SSH a C? ¿O es el proxy una verdadera situación de paso?
thinice
Quiero pasar de A a C, pasando por B. Mi respuesta a continuación funciona para la parte de paso, pero aún trata de buscar el IdentityFile en mi computadora local en lugar de B, el host de paso.
wrangler

Respuestas:

74

Esquemático:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key

Precondiciones

  • A está ejecutando ssh-agent;
  • Apuede acceder B;
  • Bpuede acceder C;
  • ALa clave pública ssh está presente en B:~/.ssh/authorized_keys
  • BLa clave pública ssh está presente en C:~/.ssh/authorized_keys

En ~/.ssh/configadelante A, agregue

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'

Si su clave privada ssh en B está en una ubicación no estándar, agregue su ruta después ssh-add.

Ahora debería poder acceder Cdesde A:

A$ ssh C
C$
Bola de nieve
fuente
13
Solo tomó 4 años, ¡pero parece que tenemos una respuesta! Impresionante
wrangler
3
Comenzando con openssh v.7.3, puedes usarlo ProxyJump B. fuente: wikilibros
Keith
2
¿Se puede definir de manera tal que: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent yes' user2 @ B 'ssh-add && nc% h% p'
Ravindranath Akila
2
¿Cómo cambiaría la solución si la máquina B no tiene nc?
mjalajel
1
@DrewVS Ok, hay que agregar ForwardAgent yes antes del ProxyJumpcomando.
Graipher
22

Compruebe si lo siguiente funciona.

ssh -t B ssh C

Use el siguiente comando si desea usar la clave almacenada en B.

ssh -t B ssh -i /path/to/identity_on_B C

Aquí estamos especificando el comando, es decir, ssh -i /path/to/identity_on_B Cque se ejecutará en B en lugar de un shell de inicio de sesión.

Sachin Divekar
fuente
Estos trabajos pero no recoge la IdentityFile de B. Todavía se ve en A.
Wrangler
@DrewVS He actualizado la respuesta. Por favor, compruebe si funciona para usted.
Sachin Divekar
Sachin, muy listo. Eso funcionó perfectamente. ¡Muchas gracias!
wrangler
@DrewVS me alegra saber que funcionó para ti. así que acepta la respuesta.
Sachin Divekar
Sin embargo, parece que esto no funciona con claves rsa protegidas con contraseña. La entrada de la contraseña está oculta, lo que obliga al usuario a tener que agregar la clave a su clave ssh para que este enfoque funcione. ¿Algunas ideas?
wrangler
10

He resuelto esto ahora. Aquí está la solución, que es bastante sencilla. Debería haberlo visto antes:

~ / .ssh / config:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5

'B' es el servidor proxy por el que estás saltando. Debe configurarse como normalmente configuraría el acceso a un servidor.

'C' es el host de destino. Debe configurarse para usar 'B' en el proceso de conexión. El archivo de identidad en 'C' es la ruta a la clave ssh en 'B'. ProxyCommand utiliza Netcat para abrir la conexión a 'C' desde 'B'. Netcat, o nc, deberá instalarse en 'B'.

Espero que esto ayude a otros.

vaquero
fuente
3
Hablé muy pronto Esta solución no ve a trabajar. La llave se había cargado en el agente ssh, así que pensé que estaba funcionando. En lo anterior, la clave para C todavía debe estar en A, no en B.
wrangler
2

Escribí un script simple para enumerar básicamente mis claves ssh en la instancia remota y luego agregué la que seleccioné a mi agente ssh local. Esto no es muy limpio, pero me permite mantener todas las claves en una ubicación remota en lugar de localmente.

Aquí está el script si alguien está interesado:

#!/usr/bin/ruby

require "rubygems"
require "fileutils"

# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/  /g' | sed     's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list

# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp

# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0
vaquero
fuente
Creo que la adición de una clave se puede tratar como idempotente, eliminando así la necesidad de obtener una lista de claves.
dmourati
Debe aceptar serverfault.com/a/701884/127993 que hace exactamente lo que desea.
sjas
1
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant

bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780

scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/
wcc526
fuente
1

Que hacer:

ssh someuser@IP_D

tal que

A -> B-> C -> D donde A es el anfitrión en el que estás,

edite su ~ / .ssh / config local así:

Host IP_D
  ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
  ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'

Esta respuesta se basa en la respuesta elegida. Tuve que descubrir cómo encajan varios usuarios en todo el escenario.

Esto funciona para mi. HTH.

Ravindranath Akila
fuente
0

La respuesta de Snowball ayudó mucho. Sin embargo, hice algunas modificaciones al comando y quería explicar cómo funciona. Dada esta situación:

    ssh        ssh
A -------> B -------> C
     ^          ^
  using A's  using B's
  ssh key    ssh key

Modifique su ~/.ssh/configarchivo y agregue el host a Btravés del cual desea saltar, tal como configuraría normalmente un host:

Host B
 User myusername
 HostName b.mycompany.com

Luego agrega el host en el Cque desea terminar:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'

Tenga en cuenta el ProxyCommand, donde:

  • ssh -T -qindica que no debe asignar un pseudo-TTY ( -T) y ser silencioso ( -q);
  • una vez en el host de salto B, agregamos la clave a las claves SSH de Athrough ssh-add;
  • que solo funciona porque reenviamos el agente SSH usando -o 'ForwardAgent yes'.
  • ssh-add -t 1 indica que quiero que la clave se agregue solo durante el segundo segundo necesario para autenticarse en el host final C;
  • y finalmente, nc %h %pinicia una netcatconexión con el host final %hen el puerto %p(ambos serán completados por SSH según la información en el ~/.ssh/configarchivo).

Si necesita especificar una clave personalizada Bpara usar, puede hacerlo modificando la ssh-addparte:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'
Daniel AA Pelsmaeker
fuente