SCP über SSH-Gateway-Verbindung

8

Mein Netzwerklayout sieht ungefähr so ​​aus:

Jetzt hat Alice Zugriff auf das SSH-Gateway (von jetzt an nur noch Gateway) mit:

ssh [email protected]

und die Datei mit den autorisierten Schlüsseln auf dem Gateway sieht so aus

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

Wenn Alice also versucht, mit ihrem privaten Schlüssel eine Verbindung zum Gateway herzustellen, wird sie tatsächlich mit dem Webserver verbunden (der Gateway-PC kann mit einem kennwortlosen privaten Schlüssel eine Verbindung zum Webserver herstellen, sodass die Verbindung transparent bleibt).

Die Frage

  1. Wie kann ich das so einstellen, dass Alice auch Dinge auf dem Webserver scpen kann?

  2. Ich weiß, dies stellt eine separate Verbindung her, aber gibt es eine Möglichkeit, wie dies als normales SSH funktioniert, so dass sogar so etwas -R12345:localhost:22funktionieren würde?

zidarsk8
quelle

Antworten:

10

Wenn Sie auf einen SSH-Server hinter einem anderen SSH-Server zugreifen möchten, verwenden Sie einfach "ProxyCommand". Beispiel: Hinzufügen zu .ssh / config

Host Alice  
   User myLoginAtAlice # optional 
   ProxyCommand ssh -o Compression=no gateway netcat -w 90 %h %p
   ServerAliveInterval 30
   Compression yes

Host gateway
   HostName gateway.public.ip
   User myLoginAtTheGateway # optional 
   Compression yes

Dann können Sie einfach "ssh Alice" oder "rsync" oder "scp" direkt mit "Alice" als Hostnamen. Die Magie ist dem Kunden verborgen.

Auf diese Weise können Sie Ihren ssh schnell neu konfigurieren, falls sich die Netzwerktopologie / -konfiguration ändert, und einfach die .ssh / config ändern, anstatt jedes Skript zu ändern.

Erläuterung: ssh verwendet anstelle einer direkten TCP-Verbindung den als "Proxy-Befehl" angegebenen Befehl als Transport. Netcat ist ein Netzwerk-Tool, das (neben Millionen anderer Funktionen) seine Standard- / Standardausgabe einfach an den angegebenen Remote-Host umleitet. "Ssh gateway nc sshserver 22" verbindet Sie also mit dem ssh-Server dieses Rechners. % h ist der Hostname und% p ist der Port. Mit diesem Setup können Sie "Port N" angeben, um den Port zu ändern, ohne die ProxyCommand-Zeile zu ändern.

Ich aktiviere die Komprimierung für den endgültigen Computer und deaktiviere die äußere Komprimierung, da die Komprimierung verschlüsselter oder komprimierter Daten das Datenvolumen nicht weiter verringert. Natürlich können Sie auch mit den Komprimierungseinstellungen experimentieren.

Raúl Salinas-Monteagudo
quelle
Noch eine Frage: rysnc funktioniert nicht so, wenn ich einen benutzerdefinierten Port für den Gateway-Computer habe. Irgendwelche Gedanken dazu.
Zidarsk8
Fügen Sie "Port port_number" in den entsprechenden Abschnitt der .ssh / config ein. Bitte lesen Sie die Manpages ssh_config und sshd_config. Es sind viele Informationen und sie könnten dir viel Inspiration bringen.
Raúl Salinas-Monteagudo
Ich meinte, rsync funktioniert nicht, wenn ein anderer Port angegeben wird. Ich habe den Port so konfiguriert, dass die Verbindung normal funktioniert, aber rsync verursacht mir Probleme.
Zidarsk8
3

Ich hatte genau das gleiche Problem wie dieses, aber ich brachte es zum Laufen, ohne alles grundlegend zu verändern.

Alles, was ich getan habe, war, $ SSH_ORIGINAL_COMMAND zu den berechtigten_Gateway-Schlüsseln hinzuzufügen, um irgendetwas in der Kette zum endgültigen Server durchzuleiten.

Also das:

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

Wird:

#/home/Alice/.ssh/authorized_keys
command="ssh -q -t alice@web $SSH_ORIGINAL_COMMAND" ssh-rsa ABCD...E== alice@somehost

Das -q wird verwendet, um die Verbindungsabbruchnachricht vom Endpunktcomputer zu unterdrücken, damit sie nicht in der lokalen Ausgabe endet, wenn die Umleitung lokal verwendet wird.

Sie können scp dann folgendermaßen verwenden:

scp localFileName [email protected]:/path/on/end/point/remoteFileName

Dies hat den zusätzlichen Vorteil, dass Benutzer Befehle über Befehle an den Endpunktserver übergeben und das Ergebnis in ihrer lokalen Sitzung zurückerhalten können, um sie in eine Datei umzuleiten oder an ein anderes Programm weiterzuleiten.

Zum Beispiel:

ssh -t [email protected] "ls -l" > tmp

Dies funktioniert, weil sshd anscheinend die Umgebungsvariable $ SSH_ORIGINAL_COMMAND mit dem vom ssh-Client angegebenen Befehl auffüllt. Ich bin mir jedoch nicht sicher, warum dies auf wundersame Weise ermöglicht, dass scp sowohl zum Endpoint-Rechner als auch zu den Befehlen durchgeht.

Ash Vince
quelle
0

Leider würde die Portweiterleitung nicht helfen, Dateien direkt von Alices Workstation auf den Webserver zu kopieren scp. In diesem SO-Post habe ich erklärt, warum ssh (und scp, da dieselben Authentifizierungsmechanismen verwendet werden) für Verbindungen, die über ssh an einen Port weitergeleitet werden, nicht funktionieren.

Sie können einen VPN-Server auf einem Computer einrichten, der jetzt als SSH-Gateway fungiert, eine Verbindung zu diesem herstellen und dann direkt auf einen Computer hinter der Firewall zugreifen.

Serge
quelle