1.. include:: ../disclaimer-ita.rst
2
3:Original: :ref:`Documentation/process/maintainer-pgp-guide.rst <pgpguide>`
4:Translator: Alessia Mantegazza <amantegazza@vaga.pv.it>
5
6.. _it_pgpguide:
7
8=========================================
9La guida a PGP per manutentori del kernel
10=========================================
11
12:Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
13
14Questo documento è destinato agli sviluppatori del kernel Linux, in particolar
15modo ai manutentori. Contiene degli approfondimenti riguardo informazioni che
16sono state affrontate in maniera più generale nella sezione
17"`Protecting Code Integrity`_" pubblicata dalla Linux Foundation.
18Per approfondire alcuni argomenti trattati in questo documento è consigliato
19leggere il documento sopraindicato
20
21.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md
22
23Il ruolo di PGP nello sviluppo del kernel Linux
24===============================================
25
26PGP aiuta ad assicurare l'integrità del codice prodotto dalla comunità
27di sviluppo del kernel e, in secondo luogo, stabilisce canali di comunicazione
28affidabili tra sviluppatori attraverso lo scambio di email firmate con PGP.
29
30Il codice sorgente del kernel Linux è disponibile principalmente in due
31formati:
32
33- repositori distribuiti di sorgenti (git)
34- rilasci periodici di istantanee (archivi tar)
35
36Sia i repositori git che gli archivi tar portano le firme PGP degli
37sviluppatori che hanno creato i rilasci ufficiali del kernel. Queste firme
38offrono una garanzia crittografica che le versioni scaricabili rese disponibili
39via kernel.org, o altri portali, siano identiche a quelle che gli sviluppatori
40hanno sul loro posto di lavoro. A tal scopo:
41
42- i repositori git forniscono firme PGP per ogni tag
43- gli archivi tar hanno firme separate per ogni archivio
44
45.. _it_devs_not_infra:
46
47Fidatevi degli sviluppatori e non dell'infrastruttura
48-----------------------------------------------------
49
50Fin dal 2011, quando i sistemi di kernel.org furono compromessi, il principio
51generale del progetto Kernel Archives è stato quello di assumere che qualsiasi
52parte dell'infrastruttura possa essere compromessa in ogni momento. Per questa
53ragione, gli amministratori hanno intrapreso deliberatemene dei passi per
54enfatizzare che la fiducia debba risiedere sempre negli sviluppatori e mai nel
55codice che gestisce l'infrastruttura, indipendentemente da quali che siano le
56pratiche di sicurezza messe in atto.
57
58Il principio sopra indicato è la ragione per la quale è necessaria questa
59guida. Vogliamo essere sicuri che il riporre la fiducia negli sviluppatori
60non sia fatto semplicemente per incolpare qualcun'altro per future falle di
61sicurezza. L'obiettivo è quello di fornire una serie di linee guida che gli
62sviluppatori possano seguire per creare un ambiente di lavoro sicuro e
63salvaguardare le chiavi PGP usate nello stabilire l'integrità del kernel Linux
64stesso.
65
66.. _it_pgp_tools:
67
68Strumenti PGP
69=============
70
71Usare GnuPG v2
72--------------
73
74La vostra distribuzione potrebbe avere già installato GnuPG, dovete solo
75verificare che stia utilizzando la versione 2.x e non la serie 1.4 --
76molte distribuzioni forniscono entrambe, di base il comando ''gpg''
77invoca GnuPG v.1. Per controllate usate::
78
79    $ gpg --version | head -n1
80
81Se visualizzate ``gpg (GnuPG) 1.4.x``, allora state usando GnuPG v.1.
82Provate il comando ``gpg2`` (se non lo avete, potreste aver bisogno
83di installare il pacchetto gnupg2)::
84
85    $ gpg2 --version | head -n1
86
87Se visualizzate  ``gpg (GnuPG) 2.x.x``, allora siete pronti a partire.
88Questa guida assume che abbiate la versione 2.2.(o successiva) di GnuPG.
89Se state usando la versione 2.0, alcuni dei comandi indicati qui non
90funzioneranno, in questo caso considerate un aggiornamento all'ultima versione,
91la 2.2. Versioni di gnupg-2.1.11 e successive dovrebbero essere compatibili
92per gli obiettivi di questa guida.
93
94Se avete entrambi i comandi: ``gpg`` e ``gpg2``, assicuratevi di utilizzare
95sempre la versione V2, e non quella vecchia. Per evitare errori potreste creare
96un alias::
97
98    $ alias gpg=gpg2
99
100Potete mettere questa opzione nel vostro  ``.bashrc`` in modo da essere sicuri.
101
102Configurare le opzioni di gpg-agent
103~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104
105L'agente GnuPG è uno strumento di aiuto che partirà automaticamente ogni volta
106che userete il comando ``gpg`` e funzionerà in background con l'obiettivo di
107individuare la passphrase. Ci sono due opzioni che dovreste conoscere
108per personalizzare la scadenza della passphrase nella cache:
109
110- ``default-cache-ttl`` (secondi): Se usate ancora la stessa chiave prima
111  che il time-to-live termini, il conto alla rovescia si resetterà per un
112  altro periodo. Di base è di 600 (10 minuti).
113
114- ``max-cache-ttl`` (secondi): indipendentemente da quanto sia recente l'ultimo
115  uso della chiave da quando avete inserito la passphrase, se il massimo
116  time-to-live è scaduto, dovrete reinserire nuovamente la passphrase.
117  Di base è di 30 minuti.
118
119Se ritenete entrambe questi valori di base troppo corti (o troppo lunghi),
120potete creare il vostro file ``~/.gnupg/gpg-agent.conf`` ed impostare i vostri
121valori::
122
123    # set to 30 minutes for regular ttl, and 2 hours for max ttl
124    default-cache-ttl 1800
125    max-cache-ttl 7200
126
127.. note::
128
129    Non è più necessario far partire l'agente gpg manualmente all'inizio della
130    vostra sessione. Dovreste controllare i file rc per rimuovere tutto ciò che
131    riguarda vecchie le versioni di GnuPG, poiché potrebbero non svolgere più
132    bene il loro compito.
133
134Impostare un *refresh* con cronjob
135~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
136
137Potreste aver bisogno di rinfrescare regolarmente il vostro portachiavi in
138modo aggiornare le chiavi pubbliche di altre persone, lavoro che è svolto
139al meglio con un cronjob giornaliero::
140
141    @daily /usr/bin/gpg2 --refresh >/dev/null 2>&1
142
143Controllate il percorso assoluto del vostro comando ``gpg`` o ``gpg2`` e usate
144il comando ``gpg2`` se per voi ``gpg`` corrisponde alla versione GnuPG v.1.
145
146.. _it_master_key:
147
148Proteggere la vostra chiave PGP primaria
149========================================
150
151Questa guida parte dal presupposto che abbiate già una chiave PGP che usate
152per lo sviluppo del kernel Linux. Se non ne avete ancora una, date uno sguardo
153al documento "`Protecting Code Integrity`_" che abbiamo menzionato prima.
154
155Dovreste inoltre creare una nuova chiave se quella attuale è inferiore a 2048
156bit (RSA).
157
158Chiave principale o sottochiavi
159-------------------------------
160
161Le sottochiavi sono chiavi PGP totalmente indipendenti, e sono collegate alla
162chiave principale attraverso firme certificate. È quindi importante
163comprendere i seguenti punti:
164
1651. Non ci sono differenze tecniche tra la chiave principale e la sottochiave.
1662. In fase di creazione, assegniamo limitazioni funzionali ad ogni chiave
167   assegnando capacità specifiche.
1683. Una chiave PGP può avere 4 capacità:
169
170   - **[S]** può essere usata per firmare
171   - **[E]** può essere usata per criptare
172   - **[A]** può essere usata per autenticare
173   - **[C]** può essere usata per certificare altre chiavi
174
1754. Una singola chiave può avere più capacità
1765. Una sottochiave è completamente indipendente dalla chiave principale.
177   Un messaggio criptato con la sottochiave non può essere decrittato con
178   quella principale. Se perdete la vostra sottochiave privata, non può
179   essere rigenerata in nessun modo da quella principale.
180
181La chiave con capacità **[C]** (certify) è identificata come la chiave
182principale perché è l'unica che può essere usata per indicare la relazione
183con altre chiavi. Solo la chiave **[C]** può essere usata per:
184
185- Aggiungere o revocare altre chiavi (sottochiavi) che hanno capacità S/E/A
186- Aggiungere, modificare o eliminare le identità (unids) associate alla chiave
187- Aggiungere o modificare la data di termine di sé stessa o di ogni sottochiave
188- Firmare le chiavi di altre persone a scopo di creare una rete di fiducia
189
190Di base, alla creazione di nuove chiavi, GnuPG genera quanto segue:
191
192- Una chiave madre che porta sia la capacità di certificazione che quella
193  di firma (**[SC]**)
194- Una sottochiave separata con capacità di criptaggio (**[E]**)
195
196Se avete usato i parametri di base per generare la vostra chiave, quello
197sarà il risultato. Potete verificarlo utilizzando ``gpg --list-secret-keys``,
198per esempio::
199
200    sec   rsa2048 2018-01-23 [SC] [expires: 2020-01-23]
201          000000000000000000000000AAAABBBBCCCCDDDD
202    uid           [ultimate] Alice Dev <adev@kernel.org>
203    ssb   rsa2048 2018-01-23 [E] [expires: 2020-01-23]
204
205Qualsiasi chiave che abbia la capacità **[C]** è la vostra chiave madre,
206indipendentemente da quali altre capacità potreste averle assegnato.
207
208La lunga riga sotto la voce ``sec`` è la vostra impronta digitale --
209negli esempi che seguono, quando vedere ``[fpr]`` ci si riferisce a questa
210stringa di 40 caratteri.
211
212Assicuratevi che la vostra passphrase sia forte
213-----------------------------------------------
214
215GnuPG utilizza le passphrases per criptare la vostra chiave privata prima
216di salvarla sul disco. In questo modo, anche se il contenuto della vostra
217cartella ``.gnupg`` venisse letto o trafugato nella sia interezza, gli
218attaccanti non potrebbero comunque utilizzare le vostre chiavi private senza
219aver prima ottenuto la passphrase per decriptarle.
220
221È assolutamente essenziale che le vostre chiavi private siano protette da
222una passphrase forte. Per impostarla o cambiarla, usate::
223
224    $ gpg --change-passphrase [fpr]
225
226Create una sottochiave di firma separata
227----------------------------------------
228
229Il nostro obiettivo è di proteggere la chiave primaria spostandola su un
230dispositivo sconnesso dalla rete, dunque se avete solo una chiave combinata
231**[SC]** allora dovreste creare una sottochiave di firma separata::
232
233    $ gpg --quick-add-key [fpr] ed25519 sign
234
235Ricordate di informare il keyserver del vostro cambiamento, cosicché altri
236possano ricevere la vostra nuova sottochiave::
237
238    $ gpg --send-key [fpr]
239
240.. note:: Supporto ECC in GnuPG
241    GnuPG 2.1 e successivi supportano pienamente *Elliptic Curve Cryptography*,
242    con la possibilità di combinare sottochiavi ECC con le tradizionali chiavi
243    primarie RSA. Il principale vantaggio della crittografia ECC è che è molto
244    più veloce da calcolare e crea firme più piccole se confrontate byte per
245    byte con le chiavi RSA a più di 2048 bit. A meno che non pensiate di
246    utilizzare un dispositivo smartcard che non supporta le operazioni ECC, vi
247    raccomandiamo ti creare sottochiavi di firma ECC per il vostro lavoro col
248    kernel.
249
250    Se per qualche ragione preferite rimanere con sottochiavi RSA, nel comando
251    precedente, sostituite "ed25519" con "rsa2048". In aggiunta, se avete
252    intenzione di usare un dispositivo hardware che non supporta le chiavi
253    ED25519 ECC, come la Nitrokey Pro o la Yubikey, allora dovreste usare
254    "nistp256" al posto di "ed25519".
255
256Copia di riserva della chiave primaria per gestire il recupero da disastro
257--------------------------------------------------------------------------
258
259Maggiori sono le firme di altri sviluppatori che vengono applicate alla vostra,
260maggiori saranno i motivi per avere una copia di riserva che non sia digitale,
261al fine di effettuare un recupero da disastro.
262
263Il modo migliore per creare una copia fisica della vostra chiave privata è
264l'uso del programma ``paperkey``. Consultate ``man paperkey`` per maggiori
265dettagli sul formato dell'output ed i suoi punti di forza rispetto ad altre
266soluzioni. Paperkey dovrebbe essere già pacchettizzato per la maggior parte
267delle distribuzioni.
268
269Eseguite il seguente comando per creare una copia fisica di riserva della
270vostra chiave privata::
271
272    $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
273
274Stampate il file (o fate un pipe direttamente verso lpr), poi prendete
275una penna e scrivete la passphare sul margine del foglio.  **Questo è
276caldamente consigliato** perché la copia cartacea è comunque criptata con
277la passphrase, e se mai doveste cambiarla non vi ricorderete qual'era al
278momento della creazione di quella copia -- *garantito*.
279
280Mettete la copia cartacea e la passphrase scritta a mano in una busta e
281mettetela in un posto sicuro e ben protetto, preferibilmente fuori casa,
282magari in una cassetta di sicurezza in banca.
283
284.. note::
285
286    Probabilmente la vostra stampante non è più quello stupido dispositivo
287    connesso alla porta parallela, ma dato che il suo output è comunque
288    criptato con la passphrase, eseguire la stampa in un sistema "cloud"
289    moderno dovrebbe essere comunque relativamente sicuro.
290
291Copia di riserva di tutta la cartella GnuPG
292-------------------------------------------
293
294.. warning::
295
296    **!!!Non saltate questo passo!!!**
297
298Quando avete bisogno di recuperare le vostre chiavi PGP è importante avere
299una copia di riserva pronta all'uso. Questo sta su un diverso piano di
300prontezza rispetto al recupero da disastro che abbiamo risolto con
301``paperkey``. Vi affiderete a queste copie esterne quando dovreste usare la
302vostra chiave Certify -- ovvero quando fate modifiche alle vostre chiavi o
303firmate le chiavi di altre persone ad una conferenza o ad un gruppo d'incontro.
304
305Incominciate con una piccola chiavetta di memoria USB (preferibilmente due)
306che userete per le copie di riserva. Dovrete criptarle usando LUKS -- fate
307riferimento alla documentazione della vostra distribuzione per capire come
308fare.
309
310Per la passphrase di criptazione, potete usare la stessa della vostra chiave
311primaria.
312
313Una volta che il processo di criptazione è finito, reinserite il disco USB ed
314assicurativi che venga montato correttamente. Copiate interamente la cartella
315``.gnugp`` nel disco criptato::
316
317    $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
318
319Ora dovreste verificare che tutto continui a funzionare::
320
321    $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
322
323Se non vedete errori, allora dovreste avere fatto tutto con successo.
324Smontate il disco USB, etichettatelo per bene di modo da evitare di
325distruggerne il contenuto non appena vi serve una chiavetta USB a caso, ed
326infine mettetelo in un posto sicuro -- ma non troppo lontano, perché vi servirà
327di tanto in tanto per modificare le identità, aggiungere o revocare
328sottochiavi, o firmare le chiavi di altre persone.
329
330Togliete la chiave primaria dalla vostra home
331---------------------------------------------
332
333I file che si trovano nella vostra cartella home non sono poi così ben protetti
334come potreste pensare. Potrebbero essere letti o trafugati in diversi modi:
335
336- accidentalmente quando fate una rapida copia della cartella home per
337  configurare una nuova postazione
338- da un amministratore di sistema negligente o malintenzionato
339- attraverso copie di riserva insicure
340- attraverso malware installato in alcune applicazioni (browser, lettori PDF,
341  eccetera)
342- attraverso coercizione quando attraversate confini internazionali
343
344Proteggere la vostra chiave con una buona passphare aiuta notevolmente a
345ridurre i rischi elencati qui sopra, ma le passphrase possono essere scoperte
346attraverso i keylogger, il shoulder-surfing, o altri modi. Per questi motivi,
347nella configurazione si raccomanda di rimuove la chiave primaria dalla vostra
348cartella home e la si archivia su un dispositivo disconnesso.
349
350.. warning::
351
352    Per favore, fate riferimento alla sezione precedente e assicuratevi
353    di aver fatto una copia di riserva totale della cartella GnuPG. Quello
354    che stiamo per fare renderà la vostra chiave inutile se non avete delle
355    copie di riserva utilizzabili!
356
357Per prima cosa, identificate il keygrip della vostra chiave primaria::
358
359    $ gpg --with-keygrip --list-key [fpr]
360
361L'output assomiglierà a questo::
362
363    pub   rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
364          000000000000000000000000AAAABBBBCCCCDDDD
365          Keygrip = 1111000000000000000000000000000000000000
366    uid           [ultimate] Alice Dev <adev@kernel.org>
367    sub   rsa2048 2018-01-24 [E] [expires: 2020-01-24]
368          Keygrip = 2222000000000000000000000000000000000000
369    sub   ed25519 2018-01-24 [S]
370          Keygrip = 3333000000000000000000000000000000000000
371
372Trovate la voce keygrid che si trova sotto alla riga ``pub`` (appena sotto
373all'impronta digitale della chiave primaria). Questo corrisponderà direttamente
374ad un file nella cartella ``~/.gnupg``::
375
376    $ cd ~/.gnupg/private-keys-v1.d
377    $ ls
378    1111000000000000000000000000000000000000.key
379    2222000000000000000000000000000000000000.key
380    3333000000000000000000000000000000000000.key
381
382Quello che dovrete fare è rimuovere il file .key che corrisponde al keygrip
383della chiave primaria::
384
385    $ cd ~/.gnupg/private-keys-v1.d
386    $ rm 1111000000000000000000000000000000000000.key
387
388Ora, se eseguite il comando ``--list-secret-keys``, vedrete che la chiave
389primaria non compare più (il simbolo ``#`` indica che non è disponibile)::
390
391    $ gpg --list-secret-keys
392    sec#  rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
393          000000000000000000000000AAAABBBBCCCCDDDD
394    uid           [ultimate] Alice Dev <adev@kernel.org>
395    ssb   rsa2048 2018-01-24 [E] [expires: 2020-01-24]
396    ssb   ed25519 2018-01-24 [S]
397
398Dovreste rimuovere anche i file ``secring.gpg`` che si trovano nella cartella
399``~/.gnupg``, in quanto rimasugli delle versioni precedenti di GnuPG.
400
401Se non avete la cartella "private-keys-v1.d"
402~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
403
404Se non avete la cartella ``~/.gnupg/private-keys-v1.d``, allora le vostre
405chiavi segrete sono ancora salvate nel vecchio file ``secring.gpg`` usato
406da GnuPG v1. Effettuare una qualsiasi modifica alla vostra chiave, come
407cambiare la passphare o aggiungere una sottochiave, dovrebbe convertire
408automaticamente il vecchio formato ``secring.gpg``nel nuovo
409``private-keys-v1.d``.
410
411Una volta che l'avete fatto, assicuratevi di rimuovere il file ``secring.gpg``,
412che continua a contenere la vostra chiave privata.
413
414.. _it_smartcards:
415
416Spostare le sottochiavi in un apposito dispositivo criptato
417===========================================================
418
419Nonostante la chiave primaria sia ora al riparo da occhi e mani indiscrete,
420le sottochiavi si trovano ancora nella vostra cartella home. Chiunque riesca
421a mettere le sue mani su quelle chiavi riuscirà a decriptare le vostre
422comunicazioni o a falsificare le vostre firme (se conoscono la passphrase).
423Inoltre, ogni volta che viene fatta un'operazione con GnuPG, le chiavi vengono
424caricate nella memoria di sistema e potrebbero essere rubate con l'uso di
425malware sofisticati (pensate a Meltdown e a Spectre).
426
427Il miglior modo per proteggere le proprie chiave è di spostarle su un
428dispositivo specializzato in grado di effettuare operazioni smartcard.
429
430I benefici di una smartcard
431---------------------------
432
433Una smartcard contiene un chip crittografico che è capace di immagazzinare
434le chiavi private ed effettuare operazioni crittografiche direttamente sulla
435carta stessa. Dato che la chiave non lascia mai la smartcard, il sistema
436operativo usato sul computer non sarà in grado di accedere alle chiavi.
437Questo è molto diverso dai dischi USB criptati che abbiamo usato allo scopo di
438avere una copia di riserva sicura -- quando il dispositivo USB è connesso e
439montato, il sistema operativo potrà accedere al contenuto delle chiavi private.
440
441L'uso di un disco USB criptato non può sostituire le funzioni di un dispositivo
442capace di operazioni di tipo smartcard.
443
444Dispositivi smartcard disponibili
445---------------------------------
446
447A meno che tutti i vostri computer dispongano di lettori smartcard, il modo
448più semplice è equipaggiarsi di un dispositivo USB specializzato che
449implementi le funzionalità delle smartcard.  Sul mercato ci sono diverse
450soluzioni disponibili:
451
452- `Nitrokey Start`_: è Open hardware e Free Software, è basata sul progetto
453  `GnuK`_ della FSIJ. Questo è uno dei pochi dispositivi a supportare le chiavi
454  ECC ED25519, ma offre meno funzionalità di sicurezza (come la resistenza
455  alla manomissione o alcuni attacchi ad un canale laterale).
456- `Nitrokey Pro 2`_: è simile alla Nitrokey Start, ma è più resistente alla
457  manomissione e offre più funzionalità di sicurezza. La Pro 2 supporta la
458  crittografia ECC (NISTP).
459- `Yubikey 5`_: l'hardware e il software sono proprietari, ma è più economica
460  della  Nitrokey Pro ed è venduta anche con porta USB-C il che è utile con i
461  computer portatili più recenti. In aggiunta, offre altre funzionalità di
462  sicurezza come FIDO, U2F, e ora supporta anche le chiavi ECC (NISTP)
463
464`Su LWN c'è una buona recensione`_ dei modelli elencati qui sopra e altri.
465La scelta dipenderà dal costo, dalla disponibilità nella vostra area
466geografica e vostre considerazioni sull'hardware aperto/proprietario.
467
468Se volete usare chiavi ECC, la vostra migliore scelta sul mercato è la
469Nitrokey Start.
470
471.. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
472.. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nitrokey-pro-2-3
473.. _`Yubikey 5`: https://www.yubico.com/product/yubikey-5-overview/
474.. _Gnuk: http://www.fsij.org/doc-gnuk/
475.. _`Su LWN c'è una buona recensione`: https://lwn.net/Articles/736231/
476
477Configurare il vostro dispositivo smartcard
478-------------------------------------------
479
480Il vostro dispositivo smartcard dovrebbe iniziare a funzionare non appena
481lo collegate ad un qualsiasi computer Linux moderno. Potete verificarlo
482eseguendo::
483
484    $ gpg --card-status
485
486Se vedete tutti i dettagli della smartcard, allora ci siamo. Sfortunatamente,
487affrontare tutti i possibili motivi per cui le cose potrebbero non funzionare
488non è lo scopo di questa guida. Se avete problemi nel far funzionare la carta
489con GnuPG, cercate aiuto attraverso i soliti canali di supporto.
490
491Per configurare la vostra smartcard, dato che non c'è una via facile dalla
492riga di comando, dovrete usate il menu di GnuPG::
493
494    $ gpg --card-edit
495    [...omitted...]
496    gpg/card> admin
497    Admin commands are allowed
498    gpg/card> passwd
499
500Dovreste impostare il PIN dell'utente (1), quello dell'amministratore (3) e il
501codice di reset (4). Assicuratevi di annotare e salvare questi codici in un
502posto sicuro -- specialmente il PIN dell'amministratore e il codice di reset
503(che vi permetterà di azzerare completamente la smartcard).  Il PIN
504dell'amministratore viene usato così raramente che è inevitabile dimenticarselo
505se non lo si annota.
506
507Tornando al nostro menu, potete impostare anche altri valori (come il nome,
508il sesso, informazioni d'accesso, eccetera), ma non sono necessari e aggiunge
509altre informazioni sulla carta che potrebbero trapelare in caso di smarrimento.
510
511.. note::
512
513    A dispetto del nome "PIN", né il PIN utente né quello dell'amministratore
514    devono essere esclusivamente numerici.
515
516Spostare le sottochiavi sulla smartcard
517---------------------------------------
518
519Uscite dal menu (usando "q") e salverete tutte le modifiche. Poi, spostiamo
520tutte le sottochiavi sulla smartcard. Per la maggior parte delle operazioni
521vi serviranno sia la passphrase della chiave PGP che il PIN
522dell'amministratore::
523
524    $ gpg --edit-key [fpr]
525
526    Secret subkeys are available.
527
528    pub  rsa2048/AAAABBBBCCCCDDDD
529         created: 2018-01-23  expires: 2020-01-23  usage: SC
530         trust: ultimate      validity: ultimate
531    ssb  rsa2048/1111222233334444
532         created: 2018-01-23  expires: never       usage: E
533    ssb  ed25519/5555666677778888
534         created: 2017-12-07  expires: never       usage: S
535    [ultimate] (1). Alice Dev <adev@kernel.org>
536
537    gpg>
538
539Usando ``--edit-key`` si tornerà alla modalità menu e noterete che
540la lista delle chiavi è leggermente diversa. Da questo momento in poi,
541tutti i comandi saranno eseguiti nella modalità menu, come indicato
542da ``gpg>``.
543
544Per prima cosa, selezioniamo la chiave che verrà messa sulla carta --
545potete farlo digitando ``key 1`` (è la prima della lista, la sottochiave
546**[E]**)::
547
548    gpg> key 1
549
550Nel'output dovreste vedere ``ssb*`` associato alla chiave **[E]**. Il simbolo
551``*`` indica che la chiave è stata "selezionata". Funziona come un
552interruttore, ovvero se scrivete nuovamente ``key 1``, il simbolo ``*`` sparirà
553e la chiave non sarà più selezionata.
554
555Ora, spostiamo la chiave sulla smartcard::
556
557    gpg> keytocard
558    Please select where to store the key:
559       (2) Encryption key
560    Your selection? 2
561
562Dato che è la nostra chiave  **[E]**, ha senso metterla nella sezione criptata.
563Quando confermerete la selezione, vi verrà chiesta la passphrase della vostra
564chiave PGP, e poi il PIN dell'amministratore. Se il comando ritorna senza
565errori, allora la vostra chiave è stata spostata con successo.
566
567**Importante**: digitate nuovamente ``key 1`` per deselezionare la prima chiave
568e selezionate la seconda chiave **[S]** con ``key 2``::
569
570    gpg> key 1
571    gpg> key 2
572    gpg> keytocard
573    Please select where to store the key:
574       (1) Signature key
575       (3) Authentication key
576    Your selection? 1
577
578Potete usare la chiave **[S]** sia per firmare che per autenticare, ma vogliamo
579che sia nella sezione di firma, quindi scegliete (1). Ancora una volta, se il
580comando ritorna senza errori, allora l'operazione è avvenuta con successo::
581
582    gpg> q
583    Save changes? (y/N) y
584
585Salvando le modifiche cancellerete dalla vostra cartella home tutte le chiavi
586che avete spostato sulla carta (ma questo non è un problema, perché abbiamo
587fatto delle copie di sicurezza nel caso in cui dovessimo configurare una
588nuova smartcard).
589
590Verificare che le chiavi siano state spostate
591~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
592
593Ora, se doveste usare l'opzione ``--list-secret-keys``, vedrete una
594sottile differenza nell'output::
595
596    $ gpg --list-secret-keys
597    sec#  rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
598          000000000000000000000000AAAABBBBCCCCDDDD
599    uid           [ultimate] Alice Dev <adev@kernel.org>
600    ssb>  rsa2048 2018-01-24 [E] [expires: 2020-01-24]
601    ssb>  ed25519 2018-01-24 [S]
602
603Il simbolo ``>`` in ``ssb>`` indica che la sottochiave è disponibile solo
604nella smartcard. Se tornate nella vostra cartella delle chiavi segrete e
605guardate al suo contenuto, noterete che i file ``.key`` sono stati sostituiti
606con degli stub::
607
608    $ cd ~/.gnupg/private-keys-v1.d
609    $ strings *.key | grep 'private-key'
610
611Per indicare che i file sono solo degli stub e che in realtà il contenuto è
612sulla smartcard, l'output dovrebbe mostrarvi ``shadowed-private-key``.
613
614Verificare che la smartcard funzioni
615~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
616
617Per verificare che la smartcard funzioni come dovuto, potete creare
618una firma::
619
620    $ echo "Hello world" | gpg --clearsign > /tmp/test.asc
621    $ gpg --verify /tmp/test.asc
622
623Col primo comando dovrebbe chiedervi il PIN della smartcard, e poi dovrebbe
624mostrare "Good signature" dopo l'esecuzione di ``gpg --verify``.
625
626Complimenti, siete riusciti a rendere estremamente difficile il furto della
627vostra identità digitale di sviluppatore.
628
629Altre operazioni possibili con GnuPG
630------------------------------------
631
632Segue un breve accenno ad alcune delle operazioni più comuni che dovrete
633fare con le vostre chiavi PGP.
634
635Montare il disco con la chiave primaria
636~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
637
638Vi servirà la vostra chiave principale per tutte le operazioni che seguiranno,
639per cui per prima cosa dovrete accedere ai vostri backup e dire a GnuPG di
640usarli::
641
642    $ export GNUPGHOME=/media/disk/foo/gnupg-backup
643    $ gpg --list-secret-keys
644
645Dovete assicurarvi di vedere ``sec`` e non ``sec#`` nell'output del programma
646(il simbolo ``#`` significa che la chiave non è disponibile e che state ancora
647utilizzando la vostra solita cartella di lavoro).
648
649Estendere la data di scadenza di una chiave
650~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
651
652La chiave principale ha una data di scadenza di 2 anni dal momento della sua
653creazione. Questo per motivi di sicurezza e per rendere obsolete le chiavi
654che, eventualmente, dovessero sparire dai keyserver.
655
656Per estendere di un anno, dalla data odierna, la scadenza di una vostra chiave,
657eseguite::
658
659    $ gpg --quick-set-expire [fpr] 1y
660
661Se per voi è più facile da memorizzare, potete anche utilizzare una data
662specifica (per esempio, il vostro compleanno o capodanno)::
663
664    $ gpg --quick-set-expire [fpr] 2020-07-01
665
666Ricordatevi di inviare l'aggiornamento ai keyserver::
667
668    $ gpg --send-key [fpr]
669
670Aggiornare la vostra cartella di lavoro dopo ogni modifica
671~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
672
673Dopo aver fatto delle modifiche alle vostre chiavi usando uno spazio a parte,
674dovreste importarle nella vostra cartella di lavoro abituale::
675
676    $ gpg --export | gpg --homedir ~/.gnupg --import
677    $ unset GNUPGHOME
678
679
680Usare PGP con Git
681=================
682
683Una delle caratteristiche fondanti di Git è la sua natura decentralizzata --
684una volta che il repositorio è stato clonato sul vostro sistema, avete la
685storia completa del progetto, inclusi i suoi tag, i commit ed i rami. Tuttavia,
686con i centinaia di repositori clonati che ci sono in giro, come si fa a
687verificare che la loro copia di linux.git non è stata manomessa da qualcuno?
688
689Oppure, cosa succede se viene scoperta una backdoor nel codice e la riga
690"Autore" dice che sei stato tu, mentre tu sei abbastanza sicuro di
691`non averci niente a che fare`_?
692
693Per risolvere entrambi i problemi, Git ha introdotto l'integrazione con PGP.
694I tag firmati dimostrano che il repositorio è integro assicurando che il suo
695contenuto è lo stesso che si trova sulle macchine degli sviluppatori che hanno
696creato il tag; mentre i commit firmati rendono praticamente impossibile
697ad un malintenzionato di impersonarvi senza avere accesso alle vostre chiavi
698PGP.
699
700.. _`non averci niente a che fare`: https://github.com/jayphelps/git-blame-someone-else
701
702Configurare git per usare la vostra chiave PGP
703----------------------------------------------
704
705Se avete solo una chiave segreta nel vostro portachiavi, allora non avete nulla
706da fare in più dato che sarà la vostra chiave di base. Tuttavia, se doveste
707avere più chiavi segrete, potete dire a git quale dovrebbe usare (``[fpg]``
708è la vostra impronta digitale)::
709
710    $ git config --global user.signingKey [fpr]
711
712**IMPORTANTE**: se avete una comando dedicato per ``gpg2``, allora dovreste
713dire a git di usare sempre quello piuttosto che il vecchio comando ``gpg``::
714
715    $ git config --global gpg.program gpg2
716
717Come firmare i tag
718------------------
719
720Per creare un tag firmato, passate l'opzione ``-s`` al comando tag::
721
722    $ git tag -s [tagname]
723
724La nostra raccomandazione è quella di firmare sempre i tag git, perché
725questo permette agli altri sviluppatori di verificare che il repositorio
726git dal quale stanno prendendo il codice non è stato alterato intenzionalmente.
727
728Come verificare i tag firmati
729~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
730
731Per verificare un tag firmato, potete usare il comando ``verify-tag``::
732
733    $ git verify-tag [tagname]
734
735Se state prendendo un tag da un fork del repositorio del progetto, git
736dovrebbe verificare automaticamente la firma di quello che state prendendo
737e vi mostrerà il risultato durante l'operazione di merge::
738
739    $ git pull [url] tags/sometag
740
741Il merge conterrà qualcosa di simile::
742
743    Merge tag 'sometag' of [url]
744
745    [Tag message]
746
747    # gpg: Signature made [...]
748    # gpg: Good signature from [...]
749
750Se state verificando il tag di qualcun altro, allora dovrete importare
751la loro chiave PGP. Fate riferimento alla sezione ":ref:`it_verify_identities`"
752che troverete più avanti.
753
754Configurare git per firmare sempre i tag con annotazione
755~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
756
757Se state creando un tag con annotazione è molto probabile che vogliate
758firmarlo. Per imporre a git di firmare sempre un tag con annotazione,
759dovete impostare la seguente opzione globale::
760
761    $ git config --global tag.forceSignAnnotated true
762
763Come usare commit firmati
764-------------------------
765
766Creare dei commit firmati è facile, ma è molto più difficile utilizzarli
767nello sviluppo del kernel linux per via del fatto che ci si affida alle
768liste di discussione e questo modo di procedere non mantiene le firme PGP
769nei commit. In aggiunta, quando si usa *rebase* nel proprio repositorio
770locale per allinearsi al kernel anche le proprie firme PGP verranno scartate.
771Per questo motivo, la maggior parte degli sviluppatori del kernel non si
772preoccupano troppo di firmare i propri commit ed ignoreranno quelli firmati
773che si trovano in altri repositori usati per il proprio lavoro.
774
775Tuttavia, se avete il vostro repositorio di lavoro disponibile al pubblico
776su un qualche servizio di hosting git (kernel.org, infradead.org, ozlabs.org,
777o altri), allora la raccomandazione è di firmare tutti i vostri commit
778anche se gli sviluppatori non ne beneficeranno direttamente.
779
780Vi raccomandiamo di farlo per i seguenti motivi:
781
7821. Se dovesse mai esserci la necessità di fare delle analisi forensi o
783   tracciare la provenienza di un codice, anche sorgenti mantenuti
784   esternamente che hanno firme PGP sui commit avranno un certo valore a
785   questo scopo.
7862. Se dovesse mai capitarvi di clonare il vostro repositorio locale (per
787   esempio dopo un danneggiamento del disco), la firma vi permetterà di
788   verificare l'integrità del repositorio prima di riprendere il lavoro.
7893. Se qualcuno volesse usare *cherry-pick* sui vostri commit, allora la firma
790   permetterà di verificare l'integrità dei commit prima di applicarli.
791
792Creare commit firmati
793~~~~~~~~~~~~~~~~~~~~~
794
795Per creare un commit firmato, dovete solamente aggiungere l'opzione ``-S``
796al comando ``git commit`` (si usa la lettera maiuscola per evitare
797conflitti con un'altra opzione)::
798
799    $ git commit -S
800
801Configurare git per firmare sempre i commit
802~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
803
804Potete dire a git di firmare sempre i commit::
805
806    git config --global commit.gpgSign true
807
808.. note::
809
810    Assicuratevi di aver configurato ``gpg-agent`` prima di abilitare
811    questa opzione.
812
813.. _it_verify_identities:
814
815Come verificare l'identità degli sviluppatori del kernel
816========================================================
817
818Firmare i tag e i commit è facile, ma come si fa a verificare che la chiave
819usata per firmare qualcosa appartenga davvero allo sviluppatore e non ad un
820impostore?
821
822Configurare l'auto-key-retrieval usando WKD e DANE
823--------------------------------------------------
824
825Se non siete ancora in possesso di una vasta collezione di chiavi pubbliche
826di altri sviluppatori, allora potreste iniziare il vostro portachiavi
827affidandovi ai servizi di auto-scoperta e auto-recupero. GnuPG può affidarsi
828ad altre tecnologie di delega della fiducia, come DNSSEC e TLS, per sostenervi
829nel caso in cui iniziare una propria rete di fiducia da zero sia troppo
830scoraggiante.
831
832Aggiungete il seguente testo al vostro file ``~/.gnupg/gpg.conf``::
833
834    auto-key-locate wkd,dane,local
835    auto-key-retrieve
836
837La *DNS-Based Authentication of Named Entities* ("DANE") è un metodo
838per la pubblicazione di chiavi pubbliche su DNS e per renderle sicure usando
839zone firmate con DNSSEC. Il *Web Key Directory* ("WKD") è un metodo
840alternativo che usa https a scopo di ricerca. Quando si usano DANE o WKD
841per la ricerca di chiavi pubbliche, GnuPG validerà i certificati DNSSEC o TLS
842prima di aggiungere al vostro portachiavi locale le eventuali chiavi trovate.
843
844Kernel.org pubblica la WKD per tutti gli sviluppatori che hanno un account
845kernel.org. Una volta che avete applicato le modifiche al file ``gpg.conf``,
846potrete auto-recuperare le chiavi di Linus Torvalds e Greg Kroah-Hartman
847(se non le avete già)::
848
849    $ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
850
851Se avete un account kernel.org, al fine di rendere più utile l'uso di WKD
852da parte di altri sviluppatori del kernel, dovreste `aggiungere alla vostra
853chiave lo UID di kernel.org`_.
854
855.. _`aggiungere alla vostra chiave lo UID di kernel.org`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key
856
857Web of Trust (WOT) o Trust on First Use (TOFU)
858----------------------------------------------
859
860PGP incorpora un meccanismo di delega della fiducia conosciuto come
861"Web of Trust". Di base, questo è un tentativo di sostituire la necessità
862di un'autorità certificativa centralizzata tipica del mondo HTTPS/TLS.
863Invece di avere svariati produttori software che decidono chi dovrebbero
864essere le entità di certificazione di cui dovreste fidarvi, PGP lascia
865la responsabilità ad ogni singolo utente.
866
867Sfortunatamente, solo poche persone capiscono come funziona la rete di fiducia.
868Nonostante sia un importante aspetto della specifica OpenPGP, recentemente
869le versioni di GnuPG (2.2 e successive) hanno implementato un meccanisco
870alternativo chiamato "Trust on First Use" (TOFU). Potete pensare a TOFU come
871"ad un approccio all fidicia simile ad SSH". In SSH, la prima volta che vi
872connettete ad un sistema remoto, l'impronta digitale della chiave viene
873registrata e ricordata. Se la chiave dovesse cambiare in futuro, il programma
874SSH vi avviserà e si rifiuterà di connettersi, obbligandovi a prendere una
875decisione circa la fiducia che riponete nella nuova chiave. In modo simile,
876la prima volta che importate la chiave PGP di qualcuno, si assume sia valida.
877Se ad un certo punto GnuPG trova un'altra chiave con la stessa identità,
878entrambe, la vecchia e la nuova, verranno segnate come invalide e dovrete
879verificare manualmente quale tenere.
880
881Vi raccomandiamo di usare il meccanisco TOFU+PGP (che è la nuova configurazione
882di base di GnuPG v2). Per farlo, aggiungete (o modificate) l'impostazione
883``trust-model`` in ``~/.gnupg/gpg.conf``::
884
885    trust-model tofu+pgp
886
887Come usare i keyserver in sicurezza
888-----------------------------------
889Se ottenete l'errore "No public key" quando cercate di validate il tag di
890qualcuno, allora dovreste cercare quella chiave usando un keyserver. È
891importante tenere bene a mente che non c'è alcuna garanzia che la chiave
892che avete recuperato da un keyserver PGP appartenga davvero alla persona
893reale -- è progettato così. Dovreste usare il Web of Trust per assicurarvi
894che la chiave sia valida.
895
896Come mantenere il Web of Trust va oltre gli scopi di questo documento,
897semplicemente perché farlo come si deve richiede sia sforzi che perseveranza
898che tendono ad andare oltre al livello di interesse della maggior parte degli
899esseri umani. Qui di seguito alcuni rapidi suggerimenti per aiutarvi a ridurre
900il rischio di importare chiavi maligne.
901
902Primo, diciamo che avete provato ad eseguire ``git verify-tag`` ma restituisce
903un errore dicendo che la chiave non è stata trovata::
904
905    $ git verify-tag sunxi-fixes-for-4.15-2
906    gpg: Signature made Sun 07 Jan 2018 10:51:55 PM EST
907    gpg:                using RSA key DA73759BF8619E484E5A3B47389A54219C0F2430
908    gpg:                issuer "wens@...org"
909    gpg: Can't check signature: No public key
910
911Cerchiamo nel keyserver per maggiori informazioni sull'impronta digitale
912della chiave (l'impronta digitale, probabilmente, appartiene ad una
913sottochiave, dunque non possiamo usarla direttamente senza trovare prima
914l'ID della chiave primaria associata ad essa)::
915
916    $ gpg --search DA73759BF8619E484E5A3B47389A54219C0F2430
917    gpg: data source: hkp://keys.gnupg.net
918    (1) Chen-Yu Tsai <wens@...org>
919          4096 bit RSA key C94035C21B4F2AEB, created: 2017-03-14, expires: 2019-03-15
920    Keys 1-1 of 1 for "DA73759BF8619E484E5A3B47389A54219C0F2430".  Enter number(s), N)ext, or Q)uit > q
921
922Localizzate l'ID della chiave primaria, nel nostro esempio
923``C94035C21B4F2AEB``. Ora visualizzate le chiavi di Linus Torvalds
924che avete nel vostro portachiavi::
925
926    $ gpg --list-key torvalds@kernel.org
927    pub   rsa2048 2011-09-20 [SC]
928          ABAF11C65A2970B130ABE3C479BE3E4300411886
929    uid           [ unknown] Linus Torvalds <torvalds@kernel.org>
930    sub   rsa2048 2011-09-20 [E]
931
932Poi, cercate un percorso affidabile da Linux Torvalds alla chiave che avete
933trovato con ``gpg --search`` usando la chiave sconosciuta.Per farlo potete usare
934diversi strumenti come https://github.com/mricon/wotmate,
935https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/tree/graphs, e
936https://the.earth.li/~noodles/pathfind.html.
937
938Se trovate un paio di percorsi affidabili è un buon segno circa la validità
939della chiave. Ora, potete aggiungerla al vostro portachiavi dal keyserver::
940
941    $ gpg --recv-key C94035C21B4F2AEB
942
943Questa procedura non è perfetta, e ovviamente state riponendo la vostra
944fiducia nell'amministratore del servizio *PGP Pathfinder* sperando che non
945sia malintenzionato (infatti, questo va contro :ref:`it_devs_not_infra`).
946Tuttavia, se mantenete con cura la vostra rete di fiducia sarà un deciso
947miglioramento rispetto alla cieca fiducia nei keyserver.
948