Verwenden der IdentityFile-Direktive in ssh_config, wenn AgentForwarding verwendet wird

15

Ist es möglich, weitergeleitete Schlüssel mithilfe der IdentityFile-Direktive in .ssh / config anzugeben?

Ich bin auf diese Eigenart gestoßen, als ich versuchte, Code über Capistrano / GIT auf unserem Produktionsserver bereitzustellen. Sowohl mein persönlicher als auch mein Arbeits-GIT-Schlüssel sind immer in meinem SSH-Agenten geladen, und es ist einfach so geschehen, dass mein persönlicher Schlüssel zuerst dem Agenten hinzugefügt wurde. Ich verwende die Agentenweiterleitung bei der Bereitstellung mit Capistrano. Wenn der Host versucht, den Vorgang "git pull" zu authentifizieren, schlägt dies mit folgendem Fehler fehl:

FEHLER: Die Erlaubnis, "ein Repo" zu erstellen, wurde "Ihrem Benutzer" verweigert.

weil es versucht hat, sich mit meinem persönlichen Git-Schlüssel zu authentifizieren, bevor es den entsprechenden Schlüssel versucht hat (der später im SSH-Agenten kam) und angenommen hat, dass ich auf ein ausländisches Repo zugreife, auf das ich keine Zugriffsberechtigung habe. Ich kann meinem persönlichen Benutzer möglicherweise nur Zugriff auf jedes Arbeitsrepertoire gewähren, aber auf meinem lokalen Computer kann ich dieses Problem umgehen, indem ich benutzerdefinierte Domänen in .ssh / config wie folgt definiere:

Host personal.github.com
Hostname github.com
Benutzer git
IdentityFile ~ / .ssh / some_key

Host work.github.com
Hostname github.com
Benutzer git
IdentityFile ~ / .ssh / some_other_key

und auf diese Weise wird git nie verwirrt. Ist es möglich, .ssh / config-Regeln für weitergeleitete Schlüssel in meinen Produktionsboxen zu erstellen, damit sie immer wissen, welcher Schlüssel beim Einlesen von neuem Code zu verwenden ist? Grundsätzlich möchte ich in der Lage sein:

Host work.github.com
Hostname github.com
Benutzer git
IdentityFile some_forwarded_key

Vielen Dank!

Skryl
quelle

Antworten:

22

Sie können den öffentlichen Teil eines Schlüssels verwenden, um anzugeben, welchen privaten Schlüssel Sie vom weitergeleiteten Agenten verwenden möchten. Dies erfordert das Erstellen einer zusätzlichen Datei (des öffentlichen Teils des Schlüssels) auf allen „Zwischencomputern“ (Computern, an die Sie Ihren lokalen SSH-Agenten weiterleiten ).

  1. Sorgen Sie dafür, dass der Zwischencomputer eine Kopie des öffentlichen Teils des gewünschten Schlüssels an einem geeigneten Ort erhält (z ~/.ssh/some_other_key.pub. B. ).

    Auf jedem Computer, der bereits den öffentlichen Teil des Schlüssels hat:

    scp some_other_key.pub intermediate:.ssh/
    

    oder auf der Zwischenmaschine:

    ssh-add -L | grep something_unique > ~/.ssh/some_other_key.pub
    

    Möglicherweise möchten Sie den abschließenden "Kommentar" -Teil des öffentlichen Schlüssels bearbeiten, um die Herkunft / den Eigentümer / den Zweck des Schlüssels besser zu identifizieren (oder zu versuchen, diesen zu verbergen).

  2. Verwenden Sie den Pfadnamen zu der obigen öffentlichen Schlüsseldatei mit -ioder IdentityFile.

  3. Möglicherweise müssen Sie auch IdentitiesOnly yes(in .ssh/configoder -o) verwenden, um ssh davon abzuhalten, zusätzliche Identitäten von Ihrem weitergeleiteten Agenten anzubieten.

Chris Johnsen
quelle
Dies ist das einzige, was für mich von 10 anderen Lösungen funktioniert hat.
Tracy Fu
1
Als ich damit spielte, wurde mir klar, dass der öffentliche Schlüssel, der dem privaten Schlüssel zugeordnet ist, den Sie in ~ / .ssh / id_rsa.pub verwenden möchten, standardmäßig verwendet wird und keine Konfiguration in ~ / erforderlich ist. .ssh / config.
bschlueter
Danke Chris und bschlueter! Ich verbinde mich jetzt mit: ssh someserver -t "ssh-add -L | grep irgendetwas Einzigartiges> ~ / .ssh / id_rsa.pub; cd einige / andere / ordner; bash --login"
blablabla
Wenn ich dies versuche, ssh -v -T ...akzeptiert der Server den öffentlichen Schlüssel, aber dann sagt ssh No such identity: /home/name/.ssh/id_rsa: No such file or directoryund anschließend schlägt die Authentifizierung fehl. Ich habe ForwardAgent in allen meinen Konfigurationen aktiviert. Woran könnte das liegen?
Lars Nyström