Komplexe Frage zum SSH Forward mit Key

Mardor

Well-Known Member
Hallo,

ich habe eine Frage die ich trotz intensiver Websuche nicht klären konnte, eventuell hat von euch jemand eine Idee.

Aktuell leite ich beispielsweise meine VNC Sessions wie folgt auf den Zielhost (auf den Zielhosts ist nur ssh offen):

Code:
ssh -L 5902:localhost:5901 user1@host1 -t -A ssh 5901:localhost5900 user1@host2

Ich benutze zwar den gleichen User aber habe verschiedene Passwörter, als IP und Port in VNC benutze ich localhost:5900.

Nun möchte ich Keys benutzen und habe auf meinem Client auch bereits einen key erstellt. Den public key habe ich bereits in die authorized_keys auf beiden Systemen kopiert.

Benötige ich auf host1 auf noch den private key oder reicht in beiden der Eintrag in die authorized keys.

Nun habe ich gelesen das man ab OpenBSD folgende Zeile in der ssh config benutzen könnte:

Code:
Host host1
HostName host2.x.y
IdentifyFile <pfad von host1 key>
ProxyCommand ssh -i <pfad von host2 key> host1.x.y -W %h:%p

Ist dies korrekt ?
Wie gehe ich vor wenn ich nur 1 ssh key habe für beide Systeme ?
Wie schaffe ich es denn oben beschriebenen Forward einzubauen ?

Ich bin um jede Hilfe dankbar.

Gruß Mardor
 
Läuft denn der ssh-agent?

Sobald du einen ssh-agent laufen hast und irgendwo mit einem Key und -A einloggst, wird auf dem Zielsystem automatisch $SSH_AUTH_SOCK gesetzt und ssh auf dem Zielsystem kann den Agent automagisch benutzen.

Edit: authorized_keys muss natürlich auf jedem Host vorhanden sein, zu dem zu hin willst. Der private key muss nur auf dem lokalen Host im Agent sein.
 
Hallo,

wenn ich das richtig verstanden habe hast du deinen Rechner und 2 Hosts, die du erreichen möchtest.

Annahme: Host1 und Host2 stehen "hintereinander" und du möchtest auf den den VNC-Port von Host1 auf localhost:5900 und den VNC-Port von Host2 auf localhost:5901 haben.
Code:
Host    forward_host1
        Hostname        192.168.2.15
        User            root

Host    vnc_host1
        Hostname        192.168.2.15
        User            root
        LocalForward    5900 localhost:5901

Host    vnc_host2
        Hostname        192.168.2.11
        User            root
        ProxyCommand    ssh forward_host1 -W %h:%p
        LocalForward    5901 localhost:5901

Auf beiden Hosts schreibst du in die authorized_keys deines Users deinen Public-Key rein.
Auf deinem Rechner würde ich dir raten, den SSH-Agent zu benutzen, da dieser automatisch versucht den korrekten Key zu verwenden.

Gruß
Markus
 
Hallo Markus,

ich habe meine ssh config angepasst mit der Änderung das ich ein Argument "IdentityFile" angegeben habe um den Key direkt anzugeben. Nun kann ich ohne Probleme auf host1 mit dem Key einloggen, erhalte aber den Eingabeprompt für Host2. Ich habe schon in der sshd_config geschaut und auch für diesen User AllowAgentForwarding auf yes gesetzt aber trotzdem erhalte ich immer die Aufforderung der Eingabe des Passworts von Host2.

Mach ich irgendetwas falsch ?

PS: Ich habe auch nochmals überprüft ob das authorized_key file auf beiden Hosts angelegt ist.

Gruß Mardor
 
Hallo,

ich habe das ganze auch noch mal mit einem anderen Host ausprobiert und festgestellt das das zuvor beschriebene Problem wahrscheinlich ein Problem mit Linux Mint ist.


Jedoch habe ich auch mit dem LocalFoward bei zwei FreeBSD host ein Problem. Wenn ich auf host2 über host1 eine Verbindung aufbaue kann ich mich in host2 ohne Probleme einloggen.
Führe ich jedoch ein Portforward wie von Markus beschrieben durch, so funktioniert die Weiterleitung nicht.

Code:
Host    host1_fw_host2_wiki
        Hostname        xx.yyy.zzz
        User            mardor
        IdentityFile    id_rsa
        LocalForward    2800 localhost:2801


Host    host2_wiki
        Hostname        rr.yyy.zzz
        User            mardor
        ProxyCommand    ssh host1_fw_host2_wiki -W %h:%p
        IdentityFile    id_rsa
        LocalForward    2801 localhost:80

Code:
debug1: Connection to port 2800 forwarding to localhost port 2801 requested.
debug2: fd 11 setting TCP_NODELAY
debug3: fd 11 is O_NONBLOCK
debug3: fd 11 is O_NONBLOCK
debug1: channel 3: new [direct-tcpip]
channel 3: open failed: connect failed: Connection refused
debug2: channel 3: zombie
debug2: channel 3: garbage collecting
debug1: channel 3: free: direct-tcpip: listening port 2800 for localhost port 2801, connect from ::1 port 52314, nchannels 4
debug3: channel 3: status: The following connections are open:
  #2 client-session (t4 r0 i0/0 o0/0 fd 8/9 cc -1)

Führe ich eine Verbindung via "ssh -L 2800:localhost:2801 host1 -t -A ssh -L 2801:localhost:80 host2" durch funktioniert der Forward ohne Probleme (allerdings ohne Key).
 
Erstelle einmal wie ich oben beschrieben habe einen dritten Eintrag (oben forward_host1).

Dieser Eintrag ist ohne alles lediglich zum forwarden über den Host gedacht und hat kein Forwarding konfiguriert. Dadurch versucht der SSH-Daemon nicht bei jeder Verbindung "durch" diesen Host erneut das Socket zu binden.

Bzgl. Schlüssel muss du dir das so vorstellen, dass du durch das ProxyCommand immer DIREKTE VERBINDUNGEN zu den Zielhosts aufbaust. Auch wenn du "rein logisch" über den Zwischenhost auf das Ziel zugreifst: Du hast hier eine direkte Verbindung.
Daher kommst du hier vollständig ohne Agent-Forwarding aus.

Agent-Forwarding solltest du nur benutzen, wenn du den Zwischenstationen VOLLSTÄNDIG vertrauen kannst. Dies ist notwendig, da jeder root-Benutzer auf dem Zwischenstationen deinen Agent ansonsten mitbenutzen kann.

Gruß
Markus
 
Hallo Markus,

vielen Dank für deine Erklärung und den Tipp. Mit der von Dir beschriebenen Methode funktioniert die Verbindung.

Leider ist die Abwicklung auf diese Art und Weise für einen meiner Anwendungsfälle ziemlich unpraktisch. Es gibt einen Rechner der nur erreichbar ist, wenn er über einen anderen Rechner eine Verbindung aufbaut. Im Netzwerk werden nur RFC1918 (private IP Adressen verwendet). Somit habe ich das Problem, dass die private IP Adresse über die SSH config natürlich nicht erreicht werden kann, da der Weg nur über den öffentlich zugänglichen Rechner erfolgen kann.

Da auch noch eine dynamische IP Adresse für den Internetzugang genutzt wird hilft hier noch nicht mal eine statische Route um die private IP Adresse für den SSH Client bekannt zu machen.

Gruß Mardor
 
Unabhängig vom weiteren Vorgehen solltest du jedoch, und das ist ein großer Vorteil von den Sprungservern mit fester IP, deine SSH-Verbindungen insofern absichern, dass diese nur noch von der IP-Adresse des Sprungservers aufgebaut werden können.

<Dein Client: 217.1.2.3> --- <Host1: 217.2.3.4> --- <Ziel>

Du musst dazu "vor" deinen SSH-Key in der authorized_keys (der Zielsysteme) ein Statement einfügen:
Code:
from="217.2.3.4" ssh-rsa  ....

Gruß
Markus
 
Zurück
Oben