Vraag SSH van A tot B tot C, met privésleutel op B


Ik ben op zoek naar een eenvoudige manier om SSH vanaf mijn lokale computer, A, via een proxy, B, naar een bestemmingshost, C. De privésleutel die bij de openbare sleutel op C hoort, staat op B en ik kan niet zet die sleutel op mijn lokale machine. Enige tips?

Ook zou ik dit graag willen kunnen doen met ~ / .ssh / config.

Bedankt!


44
2017-12-03 04:56


oorsprong


Wilt u zeggen dat u van A naar B wilt ssh en SSH naar C? Of is proxy een echte pass-thru-situatie? - thinice
Ik wil ssh van A naar C, door B heen. Mijn antwoord hieronder werkt voor het pass-through-gedeelte, maar het probeert nog steeds te zoeken naar IdentityFile op mijn lokale computer in plaats van op B, de pass-through-host. - wrangler


antwoorden:


Schematisch:

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

voorwaarden:

  • A draait ssh-agent;
  • A kan openen B;
  • B kan openen C;
  • Assh publieke sleutel is aanwezig in B:~/.ssh/authorized_keys
  • Bssh publieke sleutel is aanwezig in C:~/.ssh/authorized_keys

In ~/.ssh/config op A, voeg toe

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

Als je persoonlijke SSI-sleutel op B zich op een niet-standaardlocatie bevindt, voeg je het pad daarna toe ssh-add.

Je zou nu toegang moeten kunnen krijgen C van A:

A$ ssh C
C$

47
2018-06-26 14:46



Het duurde maar 4 jaar, maar het lijkt erop dat we een antwoord hebben! Geweldig - wrangler
Beginnend met openssh v.7.3, kunt u gewoon gebruiken ProxyJump B. bron: Wikibooks - Keith
Kan dit zo worden gedefinieerd dat: Hostgebruiker1 @ c ProxyCommand ssh -o 'ForwardAgent ja' gebruiker2 @ B 'ssh-add && nc% h% p' - Ravindranath Akila
Hoe zou de oplossing veranderen als machine B dit niet heeft nc? - mjalajel
@DrewVS Oké, je moet toevoegen ForwardAgent yes  voor de ProxyJump commando. - Graipher


Controleer of het volgende werkt.

ssh -t B ssh C

Gebruik de volgende opdracht als u de sleutel wilt gebruiken die is opgeslagen op B.

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

Hier specificeren we commando, d.w.z. ssh -i /path/to/identity_on_B C te worden uitgevoerd op B in plaats van een login-shell.


21
2017-12-03 05:34



Dit werkt, maar het identificeert het IdentityFile niet van B. Het ziet er nog steeds uit op A. - wrangler
@DrewVS Ik heb het antwoord bijgewerkt. Controleer of het voor u werkt. - Sachin Divekar
Sachin, heel slim. Dat werkte perfect. Heel erg bedankt! - wrangler
@DrewVS blij om te horen dat het voor u heeft gewerkt. dus accepteer alstublieft het antwoord. - Sachin Divekar
Het lijkt er echter op dat dit niet werkt met wachtwoordbeveiligde rsa-sleutels. De wachtwoordinvoer is verborgen, waardoor de gebruiker de sleutel moet toevoegen aan hun ssh-sleutel om deze aanpak te laten werken. Om het even welke ideeën? - wrangler


Ik heb dit nu uitgewerkt. Hier is de oplossing, die vrij eenvoudig is. Ik had het eerder moeten zien:

~ / .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' is de proxy-server waar je doorheen springt. Het moet worden geconfigureerd zoals u normaal de toegang tot een server zou configureren.

'C' is de bestemmingshost. Het moet worden geconfigureerd om 'B' te gebruiken in het verbindingsproces. Het identiteitsbestand in 'C' is het pad naar de ssh-toets op 'B'. De ProxyCommand gebruikt Netcat om de verbinding met 'C' te openen vanuit 'B'. Netcat of nc moet op 'B' worden geïnstalleerd.

Ik hoop dat dit anderen helpt.


9
2017-12-03 14:21



Ik sprak te snel. Deze oplossing werkt niet. De sleutel was in de ssh-agent geladen, dus ik dacht dat het werkte. In het bovenstaande moet de sleutel voor C nog steeds op A staan, niet B. - wrangler


Ik heb een eenvoudig script geschreven om mijn ssh-sleutels in principe op te nemen in het externe exemplaar en vervolgens degene die ik heb geselecteerd aan mijn lokale ssh-agent toe te voegen. Dit is niet erg schoon, maar laat me toe om alle sleutels op een externe locatie te bewaren in plaats van lokaal.

Hier is het script als iemand geïnteresseerd is:

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

2
2018-02-16 20:32



Ik denk dat het toevoegen van een sleutel kan worden behandeld als idempotent, waardoor het niet nodig is om een ​​belangrijke lijst te krijgen. - dmourati
Je zou moeten accepteren serverfault.com/a/701884/127993 wat precies doet wat je wilt. - sjas


#!/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
2018-05-25 07:36





Te doen:

ssh someuser@IP_D

zoals dat

A -> B-> C -> D waar A de host is waar je op zit,

bewerk je lokale ~ / .ssh / config als volgt:

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'

Dit antwoord is gebaseerd op het gekozen antwoord. Ik moest uitzoeken hoe verschillende gebruikers bij het hele scenario passen.

Dit werkt voor mij. HTH.


1
2018-01-28 11:49