Frage SSH von A nach B nach C mit privatem Schlüssel auf B


Ich suche einen einfachen Weg zu SSH von meinem lokalen Rechner, A, über einen Proxy, B, zu einem Ziel-Host, C. Der private Schlüssel, der mit dem öffentlichen Schlüssel auf C geht, ist auf B, und ich kann nicht Lege diesen Schlüssel auf meinen lokalen Rechner. Irgendwelche Tipps?

Außerdem möchte ich das mit ~ / .ssh / config machen können.

Vielen Dank!


44
2017-12-03 04:56


Ursprung


Willst du sagen, du willst von A nach B und dann SSH nach C? Oder ist Proxy eine wahre Pass-Thru-Situation? - thinice
Ich möchte ssh von A nach C und durch B gehen. Meine Antwort unten funktioniert für die Passing-Through-Teil, aber es sucht immer noch auf meinem lokalen Computer nach dem IdentityFile statt auf B, dem Pass-Through-Host. - wrangler


Antworten:


Schema:

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

Voraussetzungen:

  • A läuft ssh-agent;
  • A kann Zugreifen B;
  • B kann Zugreifen C;
  • Assh öffentlicher Schlüssel ist in vorhanden B:~/.ssh/authorized_keys
  • Bssh öffentlicher Schlüssel ist in vorhanden C:~/.ssh/authorized_keys

Im ~/.ssh/config auf A, hinzufügen

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

Wenn sich Ihr privater ssh-Schlüssel in B an einem nicht standardmäßigen Speicherort befindet, fügen Sie seinen Pfad danach hinzu ssh-add.

Sie sollten jetzt zugreifen können C von A:

A$ ssh C
C$

47
2018-06-26 14:46



Es dauerte nur 4 Jahre, aber es sieht so aus als hätten wir eine Antwort! Genial - wrangler
Ab openssh v.7.3 können Sie einfach verwenden ProxyJump B. Quelle: Wikibooks - Keith
Kann dies wie folgt definiert werden: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent ja' user2 @ B 'ssh-add && nc% h% p' - Ravindranath Akila
Wie würde sich die Lösung ändern, wenn Maschine B nicht verfügt? nc? - mjalajel
@DrewVS Ok, muss man hinzufügen ForwardAgent yes  Vor das ProxyJump Befehl. - Graipher


Überprüfen Sie, ob das Folgende funktioniert.

ssh -t B ssh C

Verwenden Sie den folgenden Befehl, wenn Sie den in B gespeicherten Schlüssel verwenden möchten.

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

Hier spezifizieren wir den Befehl d ssh -i /path/to/identity_on_B C auf B statt einer Login-Shell ausgeführt werden.


21
2017-12-03 05:34



Das funktioniert, aber es nimmt das IdentityFile von B nicht an. Es schaut immer noch auf A. - wrangler
@DrewVS Ich habe die Antwort aktualisiert. Bitte überprüfen Sie, ob es für Sie arbeitet. - Sachin Divekar
Sachin, sehr schlau. Das hat perfekt funktioniert. Vielen Dank! - wrangler
@DrewVS freut sich zu hören, dass es für dich funktioniert hat. also akzeptiere bitte die Antwort. - Sachin Divekar
Es sieht jedoch so aus, als ob dies nicht mit passwortgeschützten RSA-Schlüsseln funktioniert. Die Passworteingabe ist ausgeblendet und zwingt den Benutzer, den Schlüssel zu seinem ssh-Schlüssel hinzuzufügen, damit dieser Ansatz funktioniert. Irgendwelche Ideen? - wrangler


Ich habe das jetzt ausgearbeitet. Hier ist die Lösung, die ziemlich einfach ist. Ich hätte es früher sehen sollen:

~ / .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' ist der Proxy-Server, durch den Sie springen. Es sollte so konfiguriert werden, wie Sie normalerweise den Zugriff auf einen Server konfigurieren würden.

"C" ist der Zielhost. Es muss so konfiguriert werden, dass im Verbindungsprozess "B" verwendet wird. Die Identitätsdatei in 'C' ist der Pfad zum ssh-Schlüssel auf 'B'. Der ProxyCommand verwendet Netcat, um die Verbindung zu 'C' von 'B' zu öffnen. Netcat, oder nc, muss auf 'B' installiert werden.

Hoffe das hilft anderen.


9
2017-12-03 14:21



Ich habe zu früh gesprochen. Diese Lösung funktioniert nicht. Der Schlüssel war in den ssh-Agent geladen worden, also dachte ich, es würde funktionieren. Oben muss der Schlüssel für C immer noch auf A stehen, nicht auf B. - wrangler


Ich schrieb ein einfaches Skript, um meine ssh-Schlüssel auf der Remote-Instanz im Grunde aufzulisten, und dann den von mir ausgewählten lokalen ssh-Agenten hinzuzufügen. Dies ist nicht sehr sauber, aber erlaubt mir, alle Schlüssel an einem entfernten Ort statt lokal zu halten.

Hier ist das Skript, wenn jemand interessiert ist:

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



Ich denke, dass das Hinzufügen eines Schlüssels als idempotent behandelt werden kann, wodurch die Notwendigkeit einer Schlüsselliste eliminiert wird. - dmourati
Du solltest akzeptieren serverfault.com/a/701884/127993 was genau das tut, was du willst. - 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





Machen:

ssh someuser@IP_D

so dass

A -> B-> C -> D wo A ist der Gastgeber, auf dem Sie sind,

editiere deine lokale ~ / .ssh / config wie folgt:

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'

Diese Antwort basiert auf der gewählten Antwort. Ich musste herausfinden, wie sich verschiedene Benutzer in das ganze Szenario einfügen.

Das funktioniert für mich. HTH.


1
2018-01-28 11:49