
Ich möchte einen SSH-Tunnel über einen Linux Jump Host folgendermaßen aufbauen:
Host A ist Windows-basiert und hat einen privaten Schlüssel zur Authentifizierung beim Jump-Host (Host B). Host B ist Linux-basiert und hat einen anderen Benutzer mit einem privaten Schlüssel zur Authentifizierung bei Hosts in der DMZ. Host C ist Windows-basiert und ist von Host B aus nur per SSH (oder physisch) erreichbar. Ich habe es versucht ssh -v -N user2@HostC -J user1@HostB -L [port]:HostC:[remote_port]
und es funktioniert, aber nur mit einem Passwort. Es wird immer wieder danach gefragt, obwohl Schlüssel auf allen erforderlichen Hosts vorhanden sind.
Kann jemand zu diesem Thema helfen?
PS: Es funktioniert, wenn ich auf allen drei Hosts das gleiche Schlüsselpaar verwende, aus Sicherheitsgründen möchte ich jedoch unterschiedliche Benutzer mit unterschiedlichen Schlüsselpaaren einsetzen.
Antwort1
Vorbemerkungen
- Ich verwende kein Windows, aber hoffentlich macht das nicht viel aus.
- Wenn ich „A“, „B“, „C“ sage, meine ich oft eigentlich „den Benutzer auf A“, „Benutzer1 auf B“, „Benutzer2 auf C“. Beispielsweise bedeutet „der Schlüssel von B“ „der Schlüssel von Benutzer1 ist auf B verfügbar“. Dies dient der Kürze.
Analyse
Das istWie -J
funktioniert:
-J destination
Stellen Sie eine Verbindung zum Zielhost her, indem Sie zuerst eine SSH-Verbindung zum beschriebenen Jump-Host herstellendestination
und dann von dort aus eine TCP-Weiterleitung zum endgültigen Ziel einrichten.
Das heißt ssh -J user1@B user2@C
istnichtentspricht einer Verbindung von A nach B und dann von B nach C. Es ist gleichbedeutend mit einer Verbindung von A nach B und dann von A nach C (unter Verwendung von Paketen, die über B weitergeleitet werden). Auf B wird kein SSH-Client aufgerufen, daher wird der Schlüssel, mit dem Sie eine Verbindung von B nach C herstellen können, nie verwendet.
Lösung
Die eleganteste Lösung für das allgemeine Problem besteht darin, C dazu zu bringen, die (oder eine) Taste von A zu akzeptieren. Sie sagten:
Es funktioniert, wenn ich auf allen drei Hosts das gleiche Schlüsselpaar verwende, aber aus Sicherheitsgründen möchte ich unterschiedliche Benutzer mit unterschiedlichen Schlüsselpaaren einsetzen.
Sie können verschiedene Paare verwenden. Soweit ich weiß, gibt es derzeit ein Schlüsselpaar, mit dem Sie eine Verbindung von A nach B herstellen können, und ein separates Paar, mit dem Sie von B nach C herstellen können. Letzteres ist irrelevant. Autorisieren Sie auf C jeden Schlüssel, den A zur Authentifizierung verwendet. Es kann der alte Schlüssel sein (der bereits auf B autorisiert war); es kann aber auch ein neuer Schlüssel sein, der ausschließlich für diese Verbindung erstellt wurde.
Wenn Sie dies dann ssh -J user1@B user2@C
bei A tun, müssen Sie den Schlüssel verwenden, der es A ermöglicht, sich mit B zu verbindenUndder Schlüssel, mit dem sich A mit C verbinden kann. Wenn es unterschiedliche Schlüssel sind, müssen Sie beide verwenden. Verwenden Sie-i
einmal oder sogar zweimal, wenn nötig.
Alternative Lösung
Sie können die bereits registrierten Schlüssel verwenden, wenn Sie sich nach der Verbindung von A nach B tatsächlich von B nach C anmelden. Wenn Sie sich von A nach C anmelden möchten, würde das folgendermaßen aussehen:
# from A
ssh -t user1@B 'ssh user2@C'
(zumindest unter Linux; ich bin nicht sicher, wie das Zitieren unter Windows funktioniert).
Dieser Befehl wird ssh
auf B ausgeführt, um eine Verbindung zu C herzustellen, daher wird der Schlüssel von B verwendet.
Informationen zur Portweiterleitung
Ihr ursprünglicher Befehl verwendete -N
und -L
, daher ist meines Wissens das einzige Ziel die Weiterleitung eines Ports. Sie haben den Port über die A-zu-C-Verbindung weitergeleitet und das Ziel war ebenfalls C; daher verlief die letzte Etappe für weitergeleitete Pakete vom SSH-Server auf C nach C.Vielleichtist [remote_port]
von B aus erreichbar. Wenn das so ist, dann brauchen Sie keine der oben genannten Lösungen. Alles was Sie brauchen ist:
ssh -NL [port]:C:[remote_port] user1@B
Dadurch wird sichergestellt, dass der letzte Abschnitt weitergeleiteter Pakete vom SSH-Server auf B nach C verläuft.
Wenn die letzte Etappe von C nach C sein muss, hängt die weitere Vorgehensweise davon ab, welche Lösung Sie wählen.
Die Lösung mit einem auf C autorisierten A-Schlüssel ermöglicht Ihnen die Verwendung Ihres ursprünglichen Befehls ohne Kennwörter.
Die Lösung mit Ausführung
ssh
auf B erfordert, dass Sie den Port von A nach B und separat von B nach C weiterleiten. Etwa so:ssh -L [port]:localhost:[relay_port] user1@B 'ssh -NL [relay_port]:C:[remote_port] user2@C'