Quali sono i vantaggi e gli svantaggi della firma crittografica di commit e tag in Git?


109

Quindi qualcuno ha esaminato il mio lavoro e mi ha detto che dovevo sempre firmare i miei commit e tag crittograficamente. Quando gli è stato chiesto perché, non sapeva spiegarmelo, e ha detto "È solo una buona cosa da fare".

Cercando di evitare un ovvio scenario di scimpanzé , perché dovrei davvero? Ci sono davvero così tanti vantaggi distinti e senza svantaggi?

Quali sono i motivi pratici che mi farebbero desiderare di firmare ogni commit e tag che faccio?


3
Presumo che sia così che c'è una scia di carta che lega l'impegno a te. Non ho mai firmato un commit prima, né con git né con qualsiasi altro sistema di controllo del codice sorgente. Se il tuo pari ritiene che sussista il rischio di impegni fraudolenti, probabilmente la tua azienda ha maggiori problemi di sicurezza.
James,

@James: Non è un lavoro aziendale, ma partecipo ad alcuni progetti open e closed source.
Madara Uchiha,

@James: "maggiori problemi di sicurezza" --- come cosa? La firma è un modo tecnico per risolverli, no?
zerkms,

8
mikegerwitz.com/papers/git-horror-story.html è un punto di partenza per il caso d'uso di commit e tag firmati.

1
@James quando esegui il commit utilizzando il tuo account SVN, firmi il commit. Quando ti impegni con la tua configurazione globale git, sei l'unica autorità a confermare di essere l'autore.
Florian Margaine,

Risposte:


102

(Questo si basa in gran parte su A Git Horror Story: integrità del deposito con impegni firmati: una lettura molto buona e più informazioni di quelle che potrei dare in una risposta.)

Esistono diversi modi in cui un repository git può essere compromesso (questo non è un difetto di sicurezza, solo un dato di fatto: non si dovrebbe evitare di usare git per questo). Ad esempio, qualcuno potrebbe aver spinto nel tuo repository dichiarando di essere te. O del resto , qualcuno avrebbe potuto spingere nel repository di qualcun altro dichiarando di essere te (qualcuno potrebbe spingere nel proprio repository affermando di essere anche te). Questa è solo una parte della vita in un DVCS.

Proprio come un esempio:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email muchiha@example.com

Lì, ho cambiato la mia configurazione git per far finta di essere te. E ora posso impegnarmi e lasciare che quei commit si facciano strada nella build di produzione, e sembra che tu l'abbia fatto.

Con la firma dei commit (e dei tag), si può dimostrare che alcuni commit e tag provenivano da te (e le cose che non sono firmate non avrebbero dovuto entrare nella build di produzione). Questa è davvero la chiave di tutto - firmando si impegna che hai detto che è il tuo lavoro.

L'aspetto "il tuo lavoro" è particolarmente importante nel kernel di Linux (e quindi git) che viene occasionalmente colpito da azioni legali sul copyright. Con la firma dei commit si dice che si ha il diritto al software, che tiene traccia dell'origine. È possibile che tu non abbia accesso alla fonte che è stata rivendicata come copyright e la richiesta è infondata. È possibile che la società abbia dimenticato che stavi lavorando per loro qualche anno fa e sotto la loro direzione ha aggiunto materiale al kernel, o qualsiasi altra cosa.

C'è qualche dibattito sul fatto che ogni commit debba essere firmato. Dalla firma GPG per git commit? (nel '09), Linus scrisse:

Firmare ogni commit è totalmente stupido. Significa solo che lo automatizzi e fai che la firma valga meno. Inoltre non aggiunge alcun valore reale, poiché il modo in cui funziona la catena DAG git del SHA1, hai sempre e solo bisogno di una firma per rendere tutti gli commit raggiungibili da quello effettivamente coperti da quello. Quindi la firma di ogni commit è semplicemente mancante.

Molto di più sui pensieri sull'accesso a git può essere letto anche lì.

Detto questo, si è comunque fatto strada.

Sembra esserci il consenso della maggioranza sul fatto che la firma di commit non sia necessaria, ma la firma dei tag è molto buona. Quel post sul blog collegato in alto suggerisce che si dovrebbe comunque firmare tutto. Come ho detto, c'è qualche dibattito sul fatto che ogni impegno sia necessario o meno.

La chiave del dibattito "firma ogni commit" probabilmente ha a che fare con il flusso di lavoro che usi. La maggior parte delle persone fa un sacco di impegni nel loro repository locale, quindi spinge quel set. Dovrebbe essere sufficiente taggare la raccolta finale (supponendo, cioè, assicurarsi che tutte le modifiche siano corrette). Se lavori in un ambiente in cui si muovono molti commit singoli, la distinzione tra un tag e un commit diventa meno ... distinta - e i commit della firma possono diventare più utili.


5
Potrebbe essere sufficiente (taggare solo l'ultimo), ma perché non dovresti semplicemente taggare ogni commit?
hayd

3
Come un bastardo pigro che non usa i tag, sto annullando il commento precedente. Nella configurazione git sulla mia postazione di lavoro ho commit.gpgsign = truee non posso accertare svantaggi. Mentre potrebbe essere sciocco, non sembra essere troppo costoso.
pnovotnak,

3
Vado con @pnovotnak su questo, perché non dovresti farlo? Voglio dire, firmo i miei impegni e un altro sviluppatore non fa parte dello stesso progetto, a chi importa? Ma se un hacker cerca di rubare la mia identità, posso solo sottolineare la firma. Mi sembra che la firma abbia solo vantaggi. Sono d'accordo sul fatto che la tua firma abbia un valore inferiore, ma lo scambi per non doverci pensare. È praticamente sicurezza gratuita.
Jappie Kerk,

2
La mia opinione personale è che firmare ogni commit sia una buona cosa. Posso essere abbastanza sicuro che gli impegni con la mia firma provengano da me, mentre è banale impersonare un autore con vaniglia git. Preferirei chiamarlo validazione gratuita è la persona che altrimenti si presume che sia, non la sicurezza.
berto,

1
@JosiahYoder. No, Github non rifiuta una spinta perché l'e-mail non è al loro servizio. Supponiamo che tu stia ospitando il tuo codice su un altro servizio (ad es. Bitbucket) e che desideri spostare il tuo repository su un altro provider. Impedirebbe agli utenti di trasferire un repository (commit multipli da parte di più utenti) o di creare mirror, ecc. È una funzionalità di DVCS.
Ricky Notaro-Garcia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.