Quels sont les avantages et les inconvénients de la signature cryptographique des commits et des balises dans Git?

109

Alors, un collègue a examiné mon travail et m'a dit que je devrais toujours signer mes commits et tags de manière cryptographique. Lorsqu'on lui a demandé pourquoi, il n'a pas su me l'expliquer et a répondu: "C'est juste une bonne chose à faire".

En essayant d'éviter un scénario évident concernant les chimpanzés , pourquoi devrais-je vraiment? Existe-t-il vraiment autant d'avantages distincts et aucun inconvénient?

Quelles sont les raisons pratiques qui me donneraient envie de signer chaque commit et tag que je fais?

Madara Uchiha
la source
3
Je suppose que c'est pour qu'il y ait une trace écrite liant l'engagement à vous. Je n’ai jamais signé de commit auparavant, que ce soit avec git ou tout autre système de contrôle de code source. Si votre pair estime qu'il existe un risque d'infractions frauduleuses, votre entreprise a probablement de plus gros problèmes de sécurité.
James
@ James: Ce n'est pas un travail de société, mais je participe à des projets de sources ouvertes et fermées.
Madara Uchiha
@ James: "plus gros problèmes de sécurité" --- comme quoi? Signer est un moyen technique de les résoudre, n'est-ce pas?
Zerkms
8
mikegerwitz.com/papers/git-horror-story.html est un point de départ pour le cas d'utilisation de validations et de balises signées.
1
@ James lorsque vous vous engagez à l'aide de votre compte SVN, vous signez votre engagement. Lorsque vous vous engagez avec votre configuration globale git, vous êtes la seule autorité à confirmer que vous êtes l'auteur.
Florian Margaine

Réponses:

102

(Ceci est largement basé sur une histoire d'horreur Git: Intégrité du référentiel avec des validations signées - une très bonne lecture et plus d'informations que je ne pourrais en donner pour répondre.)

Un référentiel git peut être compromis de différentes manières (il ne s'agit pas d'une faille de sécurité, mais d'une réalité, il ne faut pas éviter d'utiliser git pour cette raison). Par exemple, quelqu'un peut avoir poussé dans votre référentiel en prétendant être vous. Ou d'ailleurs, quelqu'un aurait pu pousser dans le référentiel de quelqu'un d' autre prétendant être vous (quelqu'un pourrait également accéder à son propre référentiel prétendant être vous). Cela fait partie de la vie dans un DVCS.

Juste à titre d'exemple:

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

Là, j'ai changé ma configuration git pour prétendre que je suis toi. Et maintenant, je peux m'engager et laisser ces commissions s'intégrer d'une manière ou d'une autre dans la production, et il semblerait que vous l'ayez fait.

Avec la signature des commits (et des balises), vous pouvez prouver que certains commits et balises venaient de vous (et les éléments non signés n'auraient pas dû figurer dans la version de production). C'est vraiment la clé de tout. En signant des engagements, vous dites que c'est votre travail.

L'aspect "votre travail" est particulièrement important dans le noyau Linux (et donc git) qui est parfois frappé de poursuites pour atteinte aux droits d'auteur. En signant des commits, vous indiquez que vous avez le droit d'accéder au logiciel: il en suit l'origine. Il se peut que vous n’ayez pas accès à la source faisant l’objet du droit d’auteur et que cette revendication soit sans fondement. Il se peut que la société ait oublié que vous travailliez pour eux il y a quelques années et, sous leur direction, a ajouté de la matière au noyau, ou peu importe.

Il y a un débat quant à savoir si chaque commit doit être signé. De GPG signant pour git commit? (retour en '09), Linus a écrit:

Signer chaque commit est totalement stupide. Cela signifie simplement que vous l'automatisez et que vous donnez moins de valeur à la signature. Cela n'ajoute pas non plus de réelle valeur, puisque, de la même manière que la chaîne de travail git de SHA1, vous n'avez besoin que d'une signature pour que tous les commits accessibles de celle-ci soient effectivement couverts par celle-ci. Donc, signer chaque commit est tout simplement sans intérêt.

Vous pouvez lire beaucoup plus d'informations sur la connexion à git ici.

Cela dit, il a quand même fait son chemin.

Il semble y avoir un consensus majoritaire selon lequel la signature des commits n'est pas nécessaire, mais la signature des balises est très bonne. Cet article de blog lié en haut suggère qu'il faut tout signer de toute façon. Comme je l'ai dit, il y a un débat sur la question de savoir si chaque engagement est nécessaire ou non.

La clé du débat "signer chaque engagement" a probablement à voir avec le flux de travail que vous utilisez. La plupart des gens font une série de commits dans leur rapport local, puis poussent cet ensemble. Il devrait suffire de marquer la collection finale (en supposant que vous vous assurez que toutes les modifications sont correctes). Si vous travaillez dans un environnement où de nombreux commits simples se déplacent, la distinction entre une balise et un commet devient moins… distincte - et la signature des commits peut devenir plus utile.

Haykam
la source
5
Cela peut suffire (juste marquer le dernier), mais pourquoi ne pas simplement marquer chaque commit?
hayd
3
En tant que bâtard paresseux qui n'utilise pas de balises, je mets à jour le commentaire précédent. Dans la configuration git sur mon poste de travail, je n’ai commit.gpgsign = trueaucun inconvénient. Bien que cela puisse paraître idiot, cela ne semble pas être trop cher.
pnovotnak
3
Je vais avec @pnovotnak sur celui-ci, pourquoi ne le feriez-vous pas? Je veux dire que je signe mes commits et qu'un autre développeur ne travaille pas sur le même projet, peu importe. Mais si un pirate informatique essaie de me voler mon identité, je peux simplement signaler la signature. Il me semble que la signature n'a que des avantages. Je conviens que votre signature a moins de valeur, mais vous échangez cela pour ne pas avoir à y penser. C'est essentiellement la sécurité gratuite.
Jappie Kerk le
2
Mon opinion personnelle est que signer chaque engagement est une bonne chose. Je peux être à peu près certain que les commits avec ma signature sont venus de moi, alors qu'il est trivial de se faire passer pour un auteur avec vanilla git. Je dirais plutôt que c'est une validation gratuite, c'est la personne que vous supposez autrement, pas la sécurité.
berto
1
@ JosiahYoder. Non, Github ne refusera pas un push parce que l'email n'est pas à leur service. Supposons que vous hébergiez votre code sur un autre service (par exemple: Bitbucket) et que vous souhaitiez déplacer votre référentiel vers un autre fournisseur. Cela empêcherait les utilisateurs de transférer un référentiel (plusieurs validations par plusieurs utilisateurs), de créer des miroirs, etc. C'est une fonctionnalité de DVCS.
Ricky Notaro-Garcia