SSH Agent-Weiterleitung mit unterschiedlichen Benutzernamen und Schlüsseln


18

Es gibt eine sehr ähnliche Frage , die bei Beantwortung möglicherweise die Antwort auf diese Frage war. Leider ist es ein Fall von "Keine Notwendigkeit, die Frage zu beantworten, die ich gestellt habe, weil das Problem nicht das war, was ich dachte."

Die Einrichtung

  1. Der Server bastion.ec2 akzeptiert eine SSH- Verbindung von meiner Workstation überssh -i mykey.pem myname@bastion.ec2
  2. Der Server service1.ec2 akzeptiert SSH-Verbindungen nur von bastion.ec2 überssh -i sharedkey.pem shareduser@service1.ec2

Die Anforderungen

  1. Beide Schlüssel befinden sich nur auf meiner Workstation, sodass ich den zweiten Befehl nicht ausführen kann, ohne den Schlüssel zu kopieren
  2. Aus Sicherheitsgründen möchte ich die Weiterleitung von ssh-agent verwenden, anstatt ssh-Schlüssel nach bastion.ec2 zu kopieren

Die Lösung

Hier kommen Sie ins Spiel. Wie kann ich einen anderen Schlüssel für die 2. Verbindung weiterleiten?

Wenn shareduser mykey.pub darin ~/.ssh/authorized_keyshätte, würde dies funktionieren:

ssh -i mykey.pem myname@bastion.ec2 ssh shareduser@service1.ec2

Ich möchte jedoch nicht, dass jeder Benutzer seinen öffentlichen Schlüssel auf jedem Server ablegen muss.

Antworten:


21

Schritt 1

Stellen Sie sicher, dass Ihr lokaler Agent bereit ist

Nur weil Sie in Ihren Bastion-Server ssh können, ohne Ihren Schlüsselpfad anzugeben oder zur Eingabe des Kennworts aufgefordert zu werden, bedeutet dies nicht, dass Ihr ssh-Agent ausgeführt wird und Ihren Schlüssel hält. Einige moderne Betriebssysteme (z. B. OSX) erledigen dies für Sie.

Auf Ihrem lokalen Computer

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

Abb.1

Das bedeutet, dass Ihr Agent ausgeführt wird und Ihren Schlüssel hat.

$ ssh-add -L
The agent has no identities.

Abb.2

Das heißt, Sie haben Ihrem Agenten keine Schlüssel hinzugefügt. Beheben Sie das mit:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

Abb. 3

Schritt 2

Stellen Sie sicher, dass Ihr Remote-Agent bereit ist

SSH in Ihren Bastionsserver und wiederholen Sie die Prüfung aus Abb.1 und Abb.2 . Der Fehler, den Sie mit größerer Wahrscheinlichkeit erhalten, ist jedoch folgender:

$ ssh-add -L
Could not open a connection to your authentication agent.

Abb.4

Dies bedeutet höchstwahrscheinlich, dass Ihr SSH-Client Ihre Authentifizierungsagentenverbindung nicht weiterleitet.

Sie können dies mit dem -AFlag erzwingen (solange die sshd- Konfiguration auf dem Server dies zulässt, was die Standardeinstellung ist ).

$ ssh -A bastion.ec2

Abb.5

Schritt 3

Stellen Sie sicher, dass Sie die richtigen Tasten verwenden

Wenn Sie Ihrem Agenten Schlüssel hinzugefügt haben, leitet Ihr Agent weiter und Ihr Remote-Agent listet Ihre lokalen Schlüssel auf. Es gibt nur zwei mögliche Gründe, warum Sie keine Verbindung erhalten. Entweder verwenden Sie nicht den richtigen Schlüssel oder Sie verwenden nicht den richtigen Benutzernamen.

Geben Sie das öffentliche Gegenstück zu Ihrem privaten Schlüssel aus:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

Abb.6

Diese sollten die gleichen sein, die Sie ssh-add -Lbis zum ==Ende gesehen haben.

Auf die eine oder andere Weise müssen Sie in die Box gelangen, zu der Sie keine Verbindung herstellen können, und den Inhalt der $HOME/.ssh/authorized_keysDatei für den Benutzer anzeigen, als den Sie eine Verbindung herstellen möchten. Sie müssen sicherstellen, dass sich der öffentliche Schlüssel, den Sie mit dem obigen Befehl ausgeben, in dieser Datei in einer eigenen Zeile befindet. Sie können nicht darauf vertrauen, sharedkey.pubdass die Bro 2-Würfel, die Sie per E-Mail erhalten haben, richtig sind. Überprüfen! Dies erfordert möglicherweise, dass jemand anderes, der SSH als dieser Benutzer verwenden kann, die Datei "authorized_keys" erhält oder Root-Zugriff erhält. Wenn Sie so weit gekommen sind und es immer noch nicht funktioniert, können Sie keine Abkürzungen mehr verwenden.

Schritt 4

Mach es einfach

Hoffentlich haben Sie die oben genannten Schritte dazu gebracht. Lassen Sie uns jetzt die Kopfschmerzen verschwinden, solange Sie diese Workstation verwenden.

Konfigurieren Sie Ihren lokalen SSH-Client

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh admin@172.31.18.19

Abb.7

Wenn Sie Abb. 7 nichts anderes wegnehmen , sollte es die richtige Verwendung von ProxyCommand& sein ForwardAgent.

Füllen Sie Ihr .bash_profile automatisch aus

Sie möchten dies nicht ssh-addjedes Mal manuell tun müssen, wenn Sie sich bei Ihrem Computer anmelden. ~/.bash_profileist ein Skript, das jedes Mal ausgeführt wird, wenn Sie sich anmelden **. Setzen Sie die Linie aus Abb. 3 drin und Sie sollten immer Ihren Agenten bereit haben.

** Verwechseln Sie dies nicht mit dem, .bashrcwas für jedes neue [interaktive] Terminal ausgeführt wird. Ihr Agent wird auch dann weiter ausgeführt, wenn Sie alle Terminalsitzungen schließen. Sie müssen Ihre Schlüssel nicht neu laden

Alternative zur Verwendung von .bash_profile

Ich habe auch eine Übersicht erstellt, die einen OSX / macOS-Startagenten hinzufügt . Mit dieser Methode können Sie den ssh-agentStartvorgang starten. Es ist sehr einfach zu installieren:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash

Schritt 2: Sie können nicht zwingen , ForwardAgent yesmit , -Awenn der Host es nicht zulässt.
Dlamblin

Danke @dlamblin, ich habe die relevanten Informationen und einen Link zur sshd-Dokumentation hinzugefügt.
Bruno Bronosky

1

Hier kommen Sie ins Spiel. Wie kann ich einen anderen Schlüssel für die 2. Verbindung weiterleiten?

Sie leiten die Schlüssel nicht weiter. Sie leiten den Agenten weiter und er kann völlig unabhängige Schlüssel haben, als Sie im ersten Sprung für die Authentifizierung verwenden. Überprüfen Sie die Schlüssel in Ihrem Agenten mit ssh-add -L.

Führen Sie die Verbindung jedoch noch besser aus, ProxyCommand ssh -W %h:%p myname@bastion.ec2sodass der Agent, die Heap- oder Befehlszeilenoptionen nicht weitergeleitet werden müssen und keine Authentifizierung vom unmittelbaren Host erforderlich ist.

Sie können das einfach in Ihre Konfiguration einfügen (siehe man ssh_config).


1
Zum Glück weiß ich tatsächlich, wovon Sie hier sprechen, aber der durchschnittliche Benutzer würde es nicht tun. Sie diskutieren die Semantik mit Ihrer Sache "Sie leiten Agenten weiter, nicht Schlüssel". Sie haben mir genug gegeben, um fortzufahren, damit ich das lösen konnte, und ich möchte Ihnen die Möglichkeit geben, Ihre Antwort zu korrigieren, bevor ich meine eigene hinzufüge. Hinweis: ssh-add mykey.pem sharedkey.pemdann bestätigen Sie mit ssh-add -Ldannssh -At myname@bastion.ec2 ssh shareduser@service1.ec2
Bruno Bronosky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.