SSH da A a B a C, usando la chiave privata su B


60

Sto cercando un modo semplice per SSH dal mio computer locale, A, attraverso un proxy, B, a un host di destinazione, C. La chiave privata che va con la chiave pubblica su C è su B, e non posso metto quella chiave sul mio computer locale. Qualche consiglio?

Inoltre, vorrei poterlo fare usando ~ / .ssh / config.

Grazie!


1
Stai dicendo che vuoi ssh da A a B e poi da SSH a C? O il proxy è una vera situazione pass-through?
— thinice

Voglio passare da A a C, passando attraverso B. La mia risposta di seguito funziona per la parte passante, ma cerca ancora di cercare IdentityFile sul mio computer locale anziché su B, l'host pass-through.
— wrangler,

Risposte:


74

schema:

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

presupposti:

  • A esegue ssh-agent;
  • Apuò accedere B;
  • Bpuò accedere C;
  • ALa chiave pubblica ssh è presente in B:~/.ssh/authorized_keys
  • BLa chiave pubblica ssh è presente in C:~/.ssh/authorized_keys

In ~/.ssh/configon A, aggiungi

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

Se la tua chiave privata ssh su B si trova in una posizione non standard, aggiungi il suo percorso dopo ssh-add.

Ora dovresti essere in grado di accedere Cda A:

A$ ssh C
C$

13
Ci sono voluti solo 4 anni, ma sembra che abbiamo una risposta! Fantastico
— wrangler il

3
A partire da openssh v.7.3, puoi semplicemente usare ProxyJump B. fonte: wikibooks
— Keith,

2
Questo può essere definito in modo tale che: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent yes' user2 @ B 'ssh-add && nc% h% p'
— Ravindranath Akila

2
Come cambierebbe la soluzione se la macchina B non avesse nc?
— mjalajel,

1
@DrewVS Ok, bisogna aggiungere ForwardAgent yes prima del ProxyJumpcomando.
— Graipher,

22

Controlla se segue funziona.

ssh -t B ssh C

Utilizzare il comando seguente se si desidera utilizzare la chiave memorizzata su B.

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

Qui stiamo specificando il comando cioè ssh -i /path/to/identity_on_B Cda eseguire su B invece che su una shell di login.


Funziona ma non raccoglie il file Identity da B. Guarda ancora su A.
— wrangler

@DrewVS Ho aggiornato la risposta. Si prega di verificare se funziona per voi.
— Sachin Divekar,

Sachin, molto intelligente. Funzionava perfettamente. Grazie mille!
— wrangler

@DrewVS felice di sapere che ha funzionato per te. quindi per favore accetta la risposta.
— Sachin Divekar,

Tuttavia, sembra che questo non funzioni con le chiavi rsa protette da password. L'immissione della password è nascosta, costringendo l'utente ad aggiungere la chiave al proprio ssh-key affinché questo approccio funzioni. Qualche idea?
— wrangler

10

L'ho capito ora. Ecco la soluzione, che è piuttosto semplice. Avrei dovuto vederlo prima:

~ / .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' è il server proxy che stai attraversando. Dovrebbe essere configurato come normalmente configureresti l'accesso a un server.

'C' è l'host di destinazione. Deve essere configurato per utilizzare 'B' nel processo di connessione. Il file di identità in "C" è il percorso del tasto ssh su "B". ProxyCommand utilizza Netcat per aprire la connessione a "C" da "B". Netcat, o nc, dovrà essere installato su 'B'.

Spero che questo aiuti gli altri.


3
Ho parlato troppo presto. Questa soluzione non funziona. La chiave era stata caricata nell'agente ssh, quindi ho pensato che funzionasse. In quanto sopra, la chiave per C deve ancora essere su A, non su B.
— wrangler il

2

Ho scritto un semplice script per elencare sostanzialmente le mie chiavi ssh sull'istanza remota e quindi aggiungere quella che ho selezionato al mio agente ssh locale. Questo non è molto pulito, ma mi permette di conservare tutte le chiavi in ​​una posizione remota piuttosto che localmente.

Ecco lo script se qualcuno è interessato:

#!/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

Penso che l'aggiunta di una chiave possa essere considerata idempotente, eliminando così la necessità di ottenere l'elenco delle chiavi.
— dmourati,

Devi accettare serverfault.com/a/701884/127993 che fa esattamente quello che vuoi.
— 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/

1

Fare:

ssh someuser@IP_D

tale che

A -> B-> C -> D dove A è l'host in cui ti trovi,

modifica il tuo ~ / .ssh / config locale in questo modo:

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'

Questa risposta si basa sulla risposta scelta. Ho dovuto capire come vari utenti si adattano all'intero scenario.

Questo funziona per me. HTH.


0

La risposta di Snowball ha aiutato molto. Tuttavia, ho apportato alcune modifiche al comando e volevo spiegare come funziona. Data questa situazione:

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

Modifica il tuo ~/.ssh/configfile e aggiungi l'host Battraverso il quale vuoi saltare, proprio come normalmente configureresti un host:

Host B
 User myusername
 HostName b.mycompany.com

Quindi aggiungi l'host su Ccui vuoi finire:

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

Nota ProxyCommand, dove:

  • ssh -T -qindica che non dovrebbe allocare uno pseudo-TTY ( -T) ed essere quiet ( -q);
  • una volta sull'host di salto B, aggiungiamo la chiave alle chiavi SSH di Athrough ssh-add;
  • che funziona solo perché abbiamo inoltrato l'agente SSH utilizzando -o 'ForwardAgent yes'.
  • ssh-add -t 1 indica che desidero aggiungere la chiave solo per il secondo necessario per l'autenticazione nell'host C finale;
  • e, infine, nc %h %pavvia una netcatconnessione all'host finale %halla porta %p(entrambi che saranno compilati da SSH in base alle informazioni nel ~/.ssh/configfile).

Se è necessario specificare una chiave personalizzata Bda utilizzare, è possibile farlo 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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.