Wie melde ich mich per SSH bei einem Server an, der nur vom Jump-Host aus adressierbar und zugänglich ist?

Wie melde ich mich per SSH bei einem Server an, der nur vom Jump-Host aus adressierbar und zugänglich ist?

Ich kann den Jump-Host-Server B von meinem lokalen Rechner A aus über SSH erreichen ssh B.

Server C ist nur adressierbar (hat die Adresse C.internal) und von B über erreichbar ssh C.

Wie greife ich per SSH direkt von meinem lokalen Computer auf C zu?

Wie würden der SSH-Befehl und die Konfigurationsdatei aussehen?

SSH-Konfiguration auf A:

Host B
    User userB
    HostName B.example.com
    IdentityFile ~/.ssh/keyB

SSH-Konfiguration auf B:

Host C
  HostName C.internal
  User userC
  IdentityFile ~/.ssh/keyC

Ist dies möglich, ohne ~/.ssh/keyCvom Host B auf die lokale Maschine A zu kopieren?

Antwort1

Es gibt mehrere Optionen, aber keine davon ist ein „Einzelbefehl“:

Sie könnten einen SSH-Befehl an B ausführen, der lediglich einen zweiten SSH-Befehl an C ausführt. Sie müssen die -tOption hinzufügen, damit es für interaktives SSH funktioniert:

  • ssh -t hostB "ssh hostC"
  • ssh -t hostB "ssh -t hostC htop"
  • ssh hostB ssh hostC ls -la /etc

Wenn Sie eine Möglichkeit suchen, per SSH „direkt“ von A nach C zu gelangen, benötigen Sie eine zusätzliche Vorrichtung, um eine SSH-Agent-Verbindung weiterzuleitenvon Bzum lokalen System (also das Gegenteil von dem, was ssh -Anormalerweise passieren würde).

  1. Stellen Sie per SSH eine Verbindung zu Host B her und starten Sie dann einen SSH-Agenten unter einem manuell angegebenen Pfad. Verwenden Sie die SSH-Funktion „Stream Forward“, um lokalen Clients den Zugriff auf den Remote-Agentenprozess zu ermöglichen:

    HostA$ ssh -t -L /tmp/agent:/tmp/agent HostB \
        "ssh-agent -a /tmp/agent sh -c 'ssh-add ~/.ssh/keyC && sleep infinity'"
    

    (Die ssh/config-Option ist LocalForward.)

  2. Solange die obige Verbindung besteht, können Sie mit der regulären ProxyJump-Konfiguration eine Verbindung von HostA zu HostC herstellen und dabei Schlüssel verwenden, die nur auf HostB vorhanden sind:

    HostA$ export SSH_AUTH_SOCK=/tmp/agent
    HostA$ ssh -J HostB HostC
    

    (Die ssh/config-Optionen sind IdentityAgentund ProxyJump.)


Eine andere Möglichkeit besteht darin, von B nach A zu kopieren keyCund zu speichernauf sicherer Hardwarewie ein TPM-Chip oder eine Smartcard (ein Yubikey mit PIV-Modus zählt auch). Dies ermöglicht die lokale Verwendung des Schlüssels auf Maschine A, ohne dass die Gefahr besteht, dass er gestohlen wird.

tpm2-pkcs11(Für TPM2.0 unter Linux können Sie entweder oder verwenden ssh-tpm-agent; TPM2.0 unter Windows kann über PuTTY-CAC verwendet werden. Für Yubikeys mit PIV gibt es PKCS#11-Module sowohl für Windows als auch für Linux. Ich verwende einen eToken 5110 von Ebay. Es gibt auch eine Möglichkeit, FIDO2-Schlüssel mit SSH zu verwenden, aber dazu müsste ein neuer Schlüssel generiert werden.)

Antwort2

Sie benötigen eine ssh_config-Datei wie global /etc/ssh/ssh_configoder als Benutzer ~/.ssh/config:

Host B
  HostName 10.0.0.1
  User username_on_B
  IdentityFile ~/.ssh/id_rsa_for_B
  ForwardAgent yes

# final destination
Host C
  HostName C.internal
  User your_username_on_C
  ProxyJump B
  IdentityFile ~/.ssh/id_rsa_for_C

Jetzt Akönnen Sie von aus ssh C.

verwandte Informationen