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.