Dev • 5 min read • face Aronne Brivio • folder 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.
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-----
e -----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
.
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).
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.