SSH de A a B para C, usando a chave privada em B

46

Eu estou procurando uma maneira simples de SSH da minha máquina local, A, através de um proxy, B, para um host de destino, C. A chave privada que acompanha a chave pública em C está em B, e eu não posso colocar essa chave na minha máquina local. Alguma dica?

Além disso, eu gostaria de poder fazer isso usando ~ / .ssh / config.

Obrigado!

    
por wrangler 03.12.2011 / 05:56

6 respostas

49

Esquemático:

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

Pré-condições:

  • A está executando o ssh-agent;
  • A pode acessar B ;
  • B pode acessar C ;
  • A chave pública ssh de A está presente em B:~/.ssh/authorized_keys
  • A chave pública ssh de B está presente em C:~/.ssh/authorized_keys

Em ~/.ssh/config on A , adicione

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

Se sua chave privada ssh em B estiver em um local fora do padrão, adicione seu caminho depois de ssh-add .

Agora você deve conseguir acessar C de A :

A$ ssh C
C$
    
por 26.06.2015 / 16:46
21

Verifique se o seguinte está funcionando.

ssh -t B ssh C

Use o seguinte comando se você quiser usar a chave armazenada em B.

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

Aqui estamos especificando o comando, por exemplo, ssh -i /path/to/identity_on_B C a ser executado em B, em vez de um shell de login.

    
por 03.12.2011 / 06:34
9

Eu trabalhei isso agora. Aqui está a solução, que é bastante simples. Eu deveria ter visto isso 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' é o servidor proxy pelo qual você está pulando. Ele deve ser configurado como você normalmente configuraria o acesso a um servidor.

'C' é o host de destino. Ele precisa ser configurado para usar 'B' no processo de conexão. O arquivo de identidade em 'C' é o caminho para a chave ssh em 'B'. O ProxyCommand usa o Netcat para abrir a conexão para 'C' de 'B'. O Netcat, ou nc, precisará ser instalado em 'B'.

Espero que isso ajude os outros.

    
por 03.12.2011 / 15:21
2

Eu escrevi um script simples para listar minhas chaves ssh na instância remota, e então adicionei a que eu selecionei para o meu agente ssh local. Isso não é muito limpo, mas permite que eu mantenha todas as chaves em um local remoto em vez de localmente.

Aqui está o script, se alguém estiver interessado:

#!/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
    
por 16.02.2012 / 21:32
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/
    
por 25.05.2016 / 09:36
1

Para fazer:

ssh someuser@IP_D

tal que

A -> B-> C -> D em que A é o host em que você está,

edite seu ~ / .ssh / config local assim:

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 resposta é baseada na resposta escolhida. Eu tive que descobrir como vários usuários se encaixam em todo o cenário.

Isso funciona para mim. HTH.

    
por 28.01.2017 / 12:49