Verwenden des gleichen Bereitstellungsschlüssels für mehrere Github-Projekte

92

Github erlaubt nicht, dass derselbe SSH-Bereitstellungsschlüssel für mehr als ein Projekt verwendet wird, was in einigen Fällen sehr nützlich wäre (z. B. CI-Server, der sich mit Projekten mit privaten Submodulen befasst). Ich habe verschiedene Threads gesehen, die zu sagen scheinen, dass diese Einschränkung aus "Sicherheitsgründen" besteht, aber ich muss noch eine überzeugende Erklärung darüber finden, welches Risiko dies genau bedeuten würde.

Beachten Sie, dass die Tatsache , dass Github nicht zulässt , dass Kontoebene Tasten macht Sinn wiederverwendet werden (zwei Benutzer sollten Schlüssel nicht teilen). Es ist nur die Einschränkung für Bereitstellungsschlüssel , die ich in Frage stelle.

Um es klar auszudrücken , suche ich nicht nach Problemumgehungen (Erstellen eines Dummy-Benutzers, Verwenden mehrerer Schlüssel, ...), sondern nur nach einer plausiblen Erklärung für diese Einschränkung bei der Bereitstellung von Schlüsseln.

Verwandte Themen:

David Ebbo
quelle
Da es keinen besseren Weg gibt, haben wir einen dedizierten Bereitstellungsbenutzer erstellt, dem wir den schreibgeschützten Zugriff auf Repositorys gewähren. Das Endergebnis ist das gleiche.
Datageek
Tolle Antwort hier: stackoverflow.com/questions/11656134/…
apple16

Antworten:

22

Der einzige Grund, der durch die Problemumgehung veranschaulicht wird, auf die Sie verweisen (Erstellen eines einzelnen "Build" -Benutzers oder Freigeben desselben id_rsa.REPONAME.pubpro Repo), ist:

Vermeiden Sie es, öffentliche / private Schlüssel für andere Benutzer freizugeben

Auch wenn dies in Ihrer Situation nicht der Fall wäre (mehrere Projekte erstellen), würde die Wiederverwendung desselben SSH-Schlüssels die Möglichkeit für zwei verschiedene Benutzer eröffnen, denselben SSH-Schlüssel gemeinsam zu nutzen, wodurch der Authentifizierungszweck zunichte gemacht würde.

Authentifizierung bedeutet:
"Die Verwendung eines bestimmten SSH-Schlüssels sollte bedeuten, dass Sie wissen müssen, wer ihn verwendet."


Auf der GitHub-Seite " Verwalten von Bereitstellungsschlüsseln " werden die verschiedenen Konten mit ssh beschrieben:

  • SSH-Agentenweiterleitung : Die Agentenweiterleitung verwendet die SSH-Schlüssel, die bereits auf Ihrem lokalen Entwicklungscomputer eingerichtet wurden, wenn Sie SSH auf Ihrem Server durchführen und Git-Befehle ausführen.
    Sie können Remoteserver selektiv auf Ihren lokalen SSH-Agenten zugreifen lassen, als ob er auf dem Server ausgeführt würde.
    Sie müssen Ihren privaten Schlüssel also nicht auf dem Server replizieren.

  • Maschinenbenutzer : (Dies ist die Strategie "Dummy-Konto") Hängen Sie den Schlüssel an ein Benutzerkonto an. Da dieses Konto nicht von einem Menschen verwendet wird, wird es als Maschinenbenutzer bezeichnet.
    Sie würden diesen Benutzer genauso behandeln wie einen Menschen. Fügen Sie den Schlüssel dem Maschinenbenutzerkonto hinzu, als wäre es ein normales Konto.
    Gewähren Sie dem Account-Mitarbeiter oder dem Team Zugriff auf die Repos, auf die er Zugriff benötigt.
    Also ein privater Schlüssel, der einem "Maschinenbenutzer" zugeordnet ist, einer pro Server.

( DHa weist in den Kommentaren auf eine Bereitstellungsschlüssel- Limitnummer und die Tatsache hin, dass Sie nur ein Maschinenbenutzerkonto haben können.)

  • Bereitstellungsschlüssel (einer pro GitHub-Repo) SSH-Schlüssel, der auf dem Server gespeichert ist und Zugriff auf ein einzelnes Repo auf GitHub gewährt.
    Dieser Schlüssel wird direkt an das Repo anstatt an ein Benutzerkonto angehängt .
    Wechseln Sie nicht zu Ihren Kontoeinstellungen, sondern zur Administrationsseite des Ziel-Repos.
    Gehen Sie zu " Deploy Keys" und klicken Sie auf " Add deploy key". Fügen Sie den öffentlichen Schlüssel ein und senden Sie ihn ab.

Diesmal ist der SSH-Schlüssel nicht an einen Benutzer gebunden (für den Sie Zugriff auf mehrere Repos gewähren können), sondern an ein Repo.
Das Gewähren des SSH-Zugriffs für mehrere Repos wäre das Äquivalent eines "Maschinenbenutzers".

In Bezug auf die Authentifizierung :

  • Die Verwendung desselben Schlüssels für mehrere Repos ist in Ordnung, wenn dies von einem Benutzer durchgeführt wird (der den Schlüssel seinem Konto zugeordnet hat).
  • Die Verwendung desselben Schlüssels für mehrere Repos ist NICHT in Ordnung, wenn der Schlüssel von einem Repo angehängt wird, da Sie überhaupt nicht wissen, wer auf was zugegriffen hat.
    Dies unterscheidet sich von dem "Maschinenbenutzer", bei dem ein "Benutzer" für viele Repos als Mitarbeiter deklariert wird.
    Hier (Bereitstellungsschlüssel) gibt es keinen "Mitarbeiter" , sondern nur einen direkten SSH-Zugriff, der dem Repo gewährt wird.
VonC
quelle
52
GitHub unterstützt sowohl auf Kontoebene öffentliche Schlüssel und Projektebene Tasten (auch bekannt als Deploy Keys). Nicht erlaubt die Wiederverwendung von Kontoebene Tasten macht Sinn, aber ich behaupten , dass so dass sie nicht für Deploy Keys nicht. Mein Schlüssel auf Kontoebene ermöglicht den Zugriff auf alle meine Projekte. Warum konnte ich keinen Bereitstellungsschlüssel haben, der den Zugriff auf einige meiner Projekte ermöglicht? Es ist nur restriktiver und schafft keine Bedenken, die ich sehen kann. Ihre Besorgnis über die Möglichkeit, dass zwei verschiedene Benutzer denselben SSH-Schlüssel verwenden, wird in diesem Szenario nicht angezeigt.
David Ebbo
@DavidEbbo Es ist möglicherweise nicht auf dem Bild zu sehen, aber dieses Problem (zwei verschiedene Benutzer, die denselben SSH-Schlüssel gemeinsam nutzen) ist der Grund, warum ein SSH-Schlüssel nicht gemeinsam genutzt wird.
VonC
20
Ich fürchte, ich folge Ihrer Argumentation hier nicht. Ich frage nach einem ganz bestimmten Szenario (verwenden Sie einen Bereitstellungsschlüssel in mehreren Projekten), und Ihr Argument dafür, dass dies nicht möglich ist, besteht darin, ein nicht verwandtes Szenario aufzurufen (zwei Benutzer, die SSH-Schlüssel gemeinsam nutzen). Wenn Sie sich ausschließlich an das Deploy Key-Szenario halten, was wäre das Negative daran, wenn Github dies zulässt?
David Ebbo
6
@DavidEbbo Nach help.github.com/articles/managing-deploy-keys umfasst keine der drei Methoden ( Konto- , Bereitstellungs- oder Computerkonten ) die Freigabe eines privaten SSH-Schlüssels für den Zugriff auf diese Repos. Wenn Sie sich ausschließlich an das Deploy Key-Szenario halten, da es sich um einen Schlüssel auf dem Server handelt , bedeutet dies, dass ein privater Schlüssel auf mehreren Repos freigegeben (oder repliziert) wird, damit er auf mehreren Repos gültig ist. Dies verringert den Authentifizierungsaspekt und erhöht die Anzahl der offen gelegten Repos, wenn der Schlüssel kompromittiert wird.
VonC
8
Danke, diese Seite hat interessante Infos. Ich werde Ihre Antwort in ein oder zwei Tagen als Antwort markieren, wenn ich nichts anderes sehe, obwohl ich ehrlich gesagt immer noch nicht von dem Argument überzeugt bin. Die Verwendung eines Bereitstellungsschlüssels für zwei Repos ist nicht schwächer als die Verwendung eines Maschinenschlüssels, der Zugriff auf denselben Reposatz hat.
David Ebbo
10

Leider ist dies ein Szenario, in dem Github die Unterscheidung zwischen einem Schlüsselpaar und einem Konto oder Projekt nur falsch interpretiert.

Da ein Schlüsselpaar zur Authentifizierung und Autorisierung verwendet wird, handelt es sich effektiv um eine Identität. Github-Konten sind eine andere Identität. Durch das Verbinden von Github-Konten mit Schlüsselpaaren wird effektiv eine 1: N-Zuordnung zwischen Github-Konto-basierten Identitäten und Schlüsselpaar-Identitäten hergestellt.

Umgekehrt erzwingt Github eine 1: N-Zuordnung von Projekten zu Schlüsselpaar-basierten Identitäten. Das reale Analogon ist, dass es eine Tür gibt, die den Zugang zum Projekt ermöglicht und von vielen verschiedenen Personen geöffnet werden kann. Aber sobald einer von ihnen einen Schlüssel für die Tür bekommt, kann er nie wieder einen anderen Schlüssel für eine andere Tür bekommen.

Es ist sinnvoll, Schlüssel nicht häufig wiederzuverwenden, um Verstöße einzudämmen, wenn ein Schlüssel kompromittiert wird. Aber das ist nur eine gute Verwaltung Politik . Es ist wenig sinnvoll zu verhindern, dass ein Schlüssel grundsätzlich mehrmals verwendet wird . Dass es einige Schlüssel für einige Türen gibt, die nie wiederverwendet werden, liegt wiederum an der Politik .


Eine etwas komplexere Ansicht besteht darin, Schlüsselpaare als Rollen darzustellen . Sie können viele Schlüsselpaare besitzen und daher viele Rollen einnehmen. Der private Schlüssel authentifiziert Sie für die Rolle.

Githubs Deployment Key Mapping für Projekte besagt, dass eine Rolle niemals mehr als eine Aufgabe umfassen kann. Das ist selten realistisch.

Nichts davon ändert natürlich, was Github erlaubt.

Jens Finkhaeuser
quelle
1
Heh. Es ist irgendwie lustig, wie dies herabgestimmt wird, wenn es korrekter ist als die akzeptierte Antwort. Es gibt buchstäblich nichts , was die Freigabe eines Schlüssels für mehrere Benutzer verhindert.
Jens Finkhaeuser
2

Ich habe viel nachgedacht, um die Auswirkungen zu rationalisieren, und mir dieses Szenario ausgedacht.

Stellen Sie sich vor, Sie erstellen einen einzelnen Bereitstellungsschlüssel für einen Benutzer, den Sie mehreren Repositorys zugewiesen haben. Jetzt möchten Sie diesen Schlüssel widerrufen, aber er wird an mehreren Stellen verwendet. Anstatt den gesamten Zugriff widerrufen zu können, können Sie versehentlich nur den Teilzugriff widerrufen.

Dies mag nach einem Vorteil klingen, aber diese Eins-zu-Eins-Beziehung ist tatsächlich von Natur aus unsicher, wenn man den menschlichen Faktor berücksichtigt. Dies liegt daran, dass Sie nicht sicher wissen können, ob Sie wirklich den gesamten Zugriff widerrufen haben, ohne jedes Repository zu überprüfen und jeden öffentlichen Schlüssel einzeln zu vergleichen, falls Sie vergessen haben, wo Sie ihn tatsächlich zugewiesen haben.

Es ist definitiv frustrierend, so viele eindeutige Schlüssel zuzuweisen und zu verwalten, aber die Auswirkungen auf die Sicherheit sind klar, wie GitHub seine Richtlinien eingeführt hat: Wenn Sie einen Schlüssel widerrufen, widerrufen Sie garantiert den gesamten Zugriff, der von diesem Schlüssel gewährt wird, da er nur an einer Stelle verwendet wird .

Zhro
quelle
1
Diese Erklärung überzeugt mich nicht. Wie unterscheidet sich das grundlegend davon, einem Benutzer den Zugriff auf mehrere Repositorys zu ermöglichen, was offensichtlich zulässig ist? Wenn Sie diesem Benutzer nicht mehr vertrauen, müssen Sie ihn aus jedem Repo entfernen.
David Ebbo
@ David: How is that fundamentally different from allowing one user to access multiple repositories, which is obviously allowedKannst du das weiter erklären? Ich habe nur ein Entwicklerkonto und sehe, dass Sie SSH-Schlüssel für den kontoweiten Zugriff hinzufügen können (ein Schlüssel für alle Repositorys) oder einzelne Bereitstellungsschlüssel hinzufügen können (ein Schlüssel für jedes Repository). Dies ist immer noch eine Eins-zu-Viele- oder Eins-zu-Eins-Beziehung, bei der das Widerrufen des Schlüssels "Eins" in beiden Fällen den Zugriff "Alle" widerruft.
Zhro
Zur weiteren Verdeutlichung gibt es keine Möglichkeit (was ich sagen kann), versehentlich einen Schlüssel in einer Eins-zu-Eins-Beziehung zuzuweisen, in der nach dem Widerruf möglicherweise an anderer Stelle Zugriff besteht. Dies scheint GitHubs Motivation für diese Einschränkung zu sein, aber ich vermute nur.
Zhro
So wie ich die Dinge betrachte, sind Bereitstellungsschlüssel ein bisschen wie "anonyme Benutzer", die kein vollständiges Konto haben, aber dennoch eine Art Identität darstellen. Der Unterschied besteht darin, dass Sie im Kontofall Zugriff auf das Konto gewähren, wodurch indirekt Zugriff auf alle SSH-Schlüssel in diesem Konto gewährt wird. Im Fall "Schlüssel bereitstellen" überspringen Sie die Kontoabstraktion und gewähren direkt Zugriff auf den SSH-Schlüssel. Aber darüber hinaus sehe ich keine unterschiedlichen Sicherheitsanforderungen. Wenn das Konto ODER der Besitzer des Bereitstellungsschlüssels böse wird, müssen Sie sie aus jedem Repo entfernen.
David Ebbo