Dev 5 min readface Aronne Briviofolder Sicurezza 15 May 2017

Git, GPG e la firma dei Commit



Qualsiasi hosting per repository Git, che sia GitHub, GitLab, Bitbucket o altro, richiede l'inserimento di una password o la presenza di una chiave - se si usa SSH - al momento del push di qualsiasi modifica effettuata.

Ma allora perchè dovrei addirittura firmare i miei commit con una chiave PGP?

Di fatto, una persona con sufficienti privilegi è in grado di modificare qualsiasi commit o, addirittura, compromettere il nostro account ed effettuare modifiche a nostro nome. In questi casi la certezza assoluta - a meno che non sia il nostro PC ad essere compromesso [1] - si ha solo attraverso la firma dei commit effettuati.

Se pensate che tutto ciò sia un po' da paranoici probabilmente avete ragione, ma vi consiglio di dare una lettura a questa Git Horror Story scritta da Mike Gerwitz.


Detto questo vediamo ora come firmare i nostri commit di Git utilizzando gpg (o gpg2), presenti nei repository ufficiali di Debian e Ubuntu.

Per chi non avesse mai utilizzato uno di questi due tool sarà necessario prima di tutto generare una nuova coppia di chiavi attraverso il comando gpg2 --gen-key. Il programma chiederà dunque di inserire il vostro nome reale, l'email a cui associare le nuove chiavi e una passphrase che verrà richiesta al momento dell'utilizzo della chiave. È importante assicurarsi che l'indirizzo email inserito sia lo stesso con cui siete iscritti al servizio online - ad esempio GitHub - in caso contrario i vostri commit non verranno considerati verificati sulla piattaforma.

`gpg2 --gen-key` result

Una volta generate dovreste ottenere una schermata simile a quella qui sopra.

Utilizziamo quindi l'ID della coppia appena generata (gli ultimi 8 caratteri), nel nostro caso ECD810FF, per esportare la chiave pubblica attraverso il comando gpg2 --armor --export ECD810FF e copiamo tutto il blocco di testo risultante, comprese le righe contententi -----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----.

Restano soltanto due passaggi per ultimare il procedimento, il caricamento della chiave sul nostro profilo GitHub e la configurazione locale di Git.

Per quanto riguarda il primo passo basterà accedere a GitHub e inserire una nuova chiave GPG in Settings > SSH and GPG keys.

GitHub GPG key

Passiamo ora alla configurazione di Git.

Ci serviremo dell'ID della chiave per specificare a Git quale utilizzare per firmare i commit attraverso il comando git config --global user.signingkey ECD810FF.

Per firmare il commit sarà quindi sufficiente aggiungere il parametro -S a git commit, ad esempio git commit -S -m "Woah! A signed commit!".

N.B. Nel caso in cui dovessimo ricevere un errore del tipo 

gpg: saltato "ECD810FF": la chiave segreta non è disponibile
gpg: signing failed: la chiave segreta non è disponibile
error: gpg non è riuscito a firmare i dati
fatal: scrittura dell'oggetto di commit non riuscita

Sarà necessario specificare il programma per la gestione delle chiavi attraverso il comando git config --global gpg.program "gpg2" (sostituendo gpg2 con il tool utilizzato).

GitHub signed commit

Allo stesso modo per firmare tag e release sarà sufficiente utilizzare il comando git tag -s nometag.

Chiaramente è possibile verificare le firme attraverso il parametro -v per i tag e --show-signature per i commit. git log --show-signature ci mostrerà quindi la history del repository mettendo in risalto i commit firmati.

È inoltre possibile effettuare merge "controllati" attraverso il parametro --verify-signatures, vale a dire che il comando git merge --verify-signatures verrà eseguito solo se tutte le modifiche risulteranno firmate. 


Infine possiamo rendere totalmente automatica la procedura per la firma di commit e tag , in modo da poterci dimenticare di aggiungere i parametri -S e -s nei comandi.

Per far questo basterà aggiungere un'ulteriore configurazione a Git attraverso il comando git config --global commit.gpgsign true.

[Screenshot e comandi per la guida sono stati effettuati su una repository di test raggiungibile qui]


[1] In questo caso non avete altra scelta che piallare il PC e stare più attenti la prossima volta.


git github pgp gpg gpg2 key security sicurezza coding commit
  • Telegram
  • Whatsapp
chat

Commenti