GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Lösung 1:

Schema:

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

Voraussetzungen:

  • A läuft ssh-agent;
  • A kann auf B zugreifen;
  • B kann auf C zugreifen;
  • A Der öffentliche ssh-Schlüssel von ist in B:~/.ssh/authorized_keys vorhanden
  • B Der öffentliche ssh-Schlüssel von ist in C:~/.ssh/authorized_keys vorhanden

In ~/.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 auf B an einem nicht standardmäßigen Speicherort befindet, fügen Sie seinen Pfad nach ssh-add hinzu .

Sie sollten jetzt auf C zugreifen können ab A :

A$ ssh C
C$

Lösung 2:

Überprüfen Sie, ob Folgendes funktioniert.

ssh -t B ssh C

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

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

Hier geben wir den Befehl an, z. B. ssh -i /path/to/identity_on_B C auf B anstelle einer Login-Shell auszuführen.

Lösung 3:

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-%[email protected]%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 konfiguriert werden, um „B“ im Verbindungsprozess zu verwenden. 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.

HINWEIS1:Damit dies funktioniert, müssen Sie die Identitätsdatei von B (normalerweise ~/.ssh/rd_isa) nach A kopieren. Normalerweise ändere ich ihren Namen in rd_isa_B.

HINWEIS2:Diese Lösung funktioniert auch für scp.

Hoffe, das hilft anderen.

Lösung 4:

Ich habe ein einfaches Skript geschrieben, um meine SSH-Schlüssel auf der Remote-Instanz aufzulisten und dann den von mir ausgewählten zu meinem lokalen SSH-Agenten hinzuzufügen. Das ist nicht sehr sauber, erlaubt mir aber, alle Schlüssel an einem entfernten Ort statt lokal aufzubewahren.

Hier ist das Skript, falls es jemanden interessiert:

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

Lösung 5:

Die Antwort von Snowball hat sehr geholfen. Ich habe jedoch einige Änderungen am Befehl vorgenommen und wollte erklären, wie er funktioniert. Angesichts dieser Situation:

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

Ändern Sie Ihren ~/.ssh/config Datei und fügen Sie den Host B hinzu durch die Sie springen möchten, genau so, wie Sie normalerweise einen Host konfigurieren würden:

Host B
 User myusername
 HostName b.mycompany.com

Dann fügen Sie den Host C hinzu auf dem Sie landen möchten:

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

Beachten Sie den ProxyCommand , wobei:

  • ssh -T -q gibt an, dass kein Pseudo-TTY (-T ) und be quiet (-q );
  • einmal auf dem Sprunghost B , fügen wir den Schlüssel zu den SSH-Schlüsseln von A hinzu bis ssh-add;
  • was nur funktioniert, weil wir den SSH-Agenten mit -o 'ForwardAgent yes' weitergeleitet haben .
  • ssh-add -t 1 gibt an, dass ich möchte, dass der Schlüssel nur für die 1 Sekunde hinzugefügt wird, die zur Authentifizierung beim letzten Host C benötigt wird;
  • und schließlich nc %h %p löst einen netcat aus Verbindung zum Endhost %h an Port %p (beide werden von SSH anhand der Angaben im ~/.ssh/config ausgefüllt Datei).

Wenn Sie einen benutzerdefinierten Schlüssel für B angeben müssen verwenden möchten, können Sie dies tun, indem Sie den ssh-add ändern Teil:

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'

Linux
  1. So konfigurieren Sie SSH-Schlüssel mit cPanel

  2. Passwortloses SSH mit öffentlich-privaten Schlüsselpaaren

  3. Ssh – Wie verbinde ich mich mit einem PC über einen anderen PC mit SSH?

  4. Einrichtung der SSH-schlüsselbasierten Authentifizierung von openSSH zu SSH2

  5. SSH-Login funktioniert nicht mit Schlüssel Ohne Passwort?

So richten Sie den öffentlichen und privaten SSH-Schlüssel unter Linux ein

Generieren und Verwenden eines SSH-Schlüssels mit PuTTY

Generieren Sie RSA-Schlüssel mit SSH mithilfe von PuTTYgen

Melden Sie sich mit einem privaten SSH-Schlüssel auf einem Windows-Client bei einem Linux-Server an

Melden Sie sich unter Linux und macOS mit einem privaten SSH-Schlüssel an

So konvertieren Sie den privaten Schlüssel von PuTTY (.ppk) in einen SSH-Schlüssel