Welche Vor- und Nachteile hat das kryptografische Signieren von Commits und Tags in Git?

109

Daher überprüfte ein Peer meine Arbeit und sagte mir, dass ich meine Commits und Tags immer kryptografisch signieren sollte. Auf die Frage, warum, wusste er nicht, dass er es mir erklären sollte, und sagte: "Es ist einfach eine gute Sache."

Warum sollte ich wirklich versuchen, ein offensichtliches Schimpansenszenario zu vermeiden ? Gibt es wirklich so viele unterschiedliche Vor- und Nachteile?

Was sind die praktischen Gründe, die mich dazu bringen würden, jedes Commit und Tag zu unterschreiben, das ich mache?

Madara Uchiha
quelle
3
Ich nehme an, es ist so, dass es eine Papierspur gibt, die das Commit an dich bindet. Ich habe jedoch noch nie ein Commit unterzeichnet, weder mit Git noch mit einem anderen Versionsverwaltungssystem. Wenn Ihre Kollegen glauben, dass das Risiko betrügerischer Commits besteht, hat Ihr Unternehmen wahrscheinlich größere Sicherheitsprobleme.
James
@James: Es ist keine Unternehmensarbeit, aber ich nehme an einigen Open- und Closed-Source-Projekten teil.
Madara Uchiha
@James: "größere Sicherheitsprobleme" --- wie bitte? Signieren ist eine technische Lösung, nicht wahr?
Zerkms
8
mikegerwitz.com/papers/git-horror-story.html ist ein Ausgangspunkt für den Anwendungsfall signierter Commits und Tags.
1
@James Wenn Sie ein Commit mit Ihrem SVN-Konto durchführen, unterschreiben Sie Ihr Commit. Wenn Sie mit Ihrer git global config ein Commit durchführen, sind Sie die einzige Autorität, die bestätigt, dass Sie der Autor sind.
Florian Margaine

Antworten:

102

(Dies basiert größtenteils auf A Git Horror Story: Repository-Integrität mit signierten Commits - eine sehr gute Lektüre und mehr Informationen, als ich in eine Antwort schreiben könnte.)

Es gibt eine Reihe von Möglichkeiten, wie ein Git-Repository kompromittiert werden kann (dies ist keine Sicherheitslücke, sondern eine Tatsache des Lebens - aus diesem Grund sollte die Verwendung von Git nicht vermieden werden). Zum Beispiel könnte jemand in Ihr Repository gestoßen sein und behauptet, Sie zu sein. Oder es könnte jemand in das Repository eines anderen gestoßen sein, der behauptet, Sie zu sein (jemand könnte in sein eigenes Repository gestoßen sein, der behauptet, Sie zu sein). Dies ist nur ein Teil des Lebens in einem DVCS.

Nur als Beispiel:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email [email protected]

Dort habe ich meine Git-Konfiguration geändert, um so zu tun, als ob ich du wäre. Und jetzt kann ich mich zurückziehen und diese Verpflichtungen irgendwie in die Produktion einfließen lassen, und es sieht so aus, als hätten Sie es geschafft.

Durch das Signieren der Commits (und Tags) kann nachgewiesen werden, dass bestimmte Commits und Tags von Ihnen stammen (und Dinge, die nicht signiert sind, sollten es nicht in den Produktions-Build geschafft haben). Das ist wirklich der Schlüssel zu allem. Indem Sie Commits unterzeichnen, sagen Sie, dass es Ihre Arbeit ist.

Der Aspekt "Ihre Arbeit" ist besonders wichtig im Linux-Kernel (und damit im Git), der gelegentlich von Urheberrechtsstreitigkeiten betroffen ist. Durch das Signieren von Commits bestätigen Sie, dass Sie das Recht an der Software haben - sie verfolgt den Ursprung. Möglicherweise haben Sie keinen Zugriff auf die Quelle, für die Urheberrechte geltend gemacht werden, und der Anspruch ist unbegründet. Es kann sein, dass die Firma vergessen hat, dass Sie vor ein paar Jahren für sie gearbeitet haben und unter ihrer Leitung Material zum Kernel hinzugefügt haben, oder was auch immer.

Es wird diskutiert, ob jedes Commit unterschrieben werden soll. Von GPG Signieren für Git Commit? (Zurück in '09), schrieb Linus:

Es ist total dumm, jedes Commit zu unterschreiben. Es bedeutet nur, dass Sie es automatisieren und die Signatur weniger wert ist. Es bringt auch keinen wirklichen Mehrwert, da Sie für die Arbeitsweise der git DAG-Kette von SHA1 immer nur eine Signatur benötigen, um alle von dieser erreichbaren Commits effektiv von dieser abzudecken. Wenn Sie also jedes Commit unterschreiben, kommt es einfach nicht darauf an.

Viel mehr über die Überlegungen zur Anmeldung bei git können Sie auch dort nachlesen.

Das heißt, es machte seinen Weg in den Schwachsinn sowieso.

Es scheint mehrheitlich Konsens zu bestehen, dass das Signieren von Commits unnötig ist, aber das Signieren von Tags ist sehr gut. Der Blog-Eintrag, der oben verlinkt ist, schlägt vor, dass man sowieso alles unterschreiben sollte. Wie gesagt, es gibt einige Debatten darüber, ob jedes Commit notwendig ist oder nicht.

Der Schlüssel für die Debatte "Sign every commit" hängt wahrscheinlich mit dem von Ihnen verwendeten Workflow zusammen. Die meisten Leute machen ein paar Commits in ihrem lokalen Repo und pushen dann dieses Set. Es sollte ausreichen, die endgültige Sammlung mit einem Tag zu versehen (vorausgesetzt, Sie stellen sicher, dass alle Änderungen korrekt sind). Wenn Sie in einer Umgebung arbeiten, in der sich viele einzelne Commits bewegen, wird die Unterscheidung zwischen einem Tag und einem Commit weniger deutlich - und das Signieren von Commits wird möglicherweise nützlicher.

Haykam
quelle
5
Es mag ausreichen (nur das letzte zu markieren), aber warum sollten Sie nicht einfach jedes Commit markieren?
Hayd
3
Als fauler Bastard, der keine Tags verwendet, aktualisiere ich den vorherigen Kommentar. In der git config auf meiner Workstation habe ich commit.gpgsign = trueund kann keine Nachteile feststellen. Es mag zwar albern sein, scheint aber nicht zu teuer zu sein.
pnovotnak
3
Ich gehe mit @pnovotnak auf diesen einen, warum würdest du das nicht tun? Ich meine, ich unterschreibe meine Commits und ein anderer Entwickler hat nicht das gleiche Projekt, wen interessiert das? Aber wenn ein Hacker versucht, meine Identität zu stehlen, kann ich nur auf die Signatur hinweisen. Scheint mir, dass das Unterzeichnen nur Vorteile hat. Ich bin damit einverstanden, dass Ihre Unterschrift weniger wert ist, aber Sie tauschen dies aus, weil Sie nicht darüber nachdenken müssen. Es ist im Grunde freie Sicherheit.
Jappie Kerk
2
Meiner persönlichen Meinung nach ist es eine gute Sache, jedes Commit zu unterzeichnen. Ich kann mir ziemlich sicher sein, dass meine Unterschriften von mir stammen, während es trivial ist, sich als Autor mit Vanillegit auszugeben. Ich würde es eher als kostenlose Validierung bezeichnen , als die Person, von der Sie sonst ausgehen, nicht als Sicherheit.
Berto
1
@JosiahYoder. Nein, Github wird einen Push nicht ablehnen, da die E-Mail nicht in ihrem Dienst steht. Angenommen, Sie haben Ihren Code auf einem anderen Dienst (z. B. Bitbucket) gehostet und wollten Ihr Repository auf einen anderen Anbieter verschieben. Dies würde Benutzer daran hindern, ein Repository zu übertragen (mehrere Festschreibungen durch mehrere Benutzer) oder Spiegelungen usw. zu erstellen. Dies ist eine Funktion von DVCS.
Ricky Notaro-Garcia