← Documents Documentation/translations/it_IT/process/maintainer-pgp-guide.rst GitHub 원문 ↗

Linux 6.18.37 · Translations

Kernel maintainer PGP guide

Kernel maintainer가 PGP key를 보호하고 smartcard, Git 서명, patch attestation과 개발자 identity 검증을 안전하게 운용하는 방법을 설명합니다.

Source pathDocumentation/translations/it_IT/process/maintainer-pgp-guide.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

maintainer-pgp-guide.rst:1-941

PGP key의 Certify·Signing·Encryption 역할을 분리하고, primary key는 offline backup에 보관하며 일상 subkey는 smartcard로 옮기는 전 과정을 다룹니다. 강한 passphrase, 종이 재해 복구본, GnuPG directory 백업과 실제 서명 시험까지 포함합니다.

Git signed tag·commit, patatt patch attestation, WKD·DANE key 발견, Web of Trust·TOFU 및 kernel.org keyring으로 개발자 identity를 검증하는 절차를 설명합니다. 로컬 이탈리아어 원문의 GnuPG 2.2 기준과 장치·명령 예제를 우선해 번역했습니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

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

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Linux kernel 개발에서 PGP의 역할

1-67

이 문서는 Linux 커널 개발자, 특히 하위 시스템 maintainer를 위한 PGP 안내서다. Linux Foundation의 Protecting Code Integrity 문서에서 커널 작업에 필요한 부분을 추려 설명하며, 각 주제의 더 깊은 배경은 원문 안내서에서 확인할 수 있다.

PGP의 첫 번째 목적은 커널 개발 공동체가 생산한 코드의 무결성을 보장하는 것이다. 두 번째로 PGP 서명 이메일을 이용해 개발자 사이의 신뢰 가능한 통신 경로를 만드는 데 도움을 준다.

Linux 커널 소스는 분산 Git 저장소와 정기 release tarball의 두 형태로 배포된다. 공식 release를 만드는 개발자는 Git tag에 PGP 서명을 넣고, tarball에는 detached PGP signature를 함께 제공한다. 이 서명은 kernel.org나 mirror에서 받은 내용이 release 개발자의 workstation에 있던 내용과 동일하다는 암호학적 근거가 된다.

2011년 kernel.org 핵심 시스템 침해 이후 Kernel Archives 프로젝트는 인프라의 어느 부분도 언제든 침해될 수 있다고 가정한다. 호스팅 시스템의 보안 수준과 무관하게 신뢰의 종착점은 서버가 아니라 개발자와 개발자의 키여야 한다.

그러나 신뢰 대상을 개발자로 옮기는 것만으로는 사고 책임을 개인에게 전가하는 결과가 될 수 있다. 이 안내서의 목적은 개발자가 안전한 작업 환경을 만들고 커널 무결성을 증명하는 PGP 키를 보호할 수 있도록 구체적인 운용 규칙을 제공하는 것이다.

.. include:: ../disclaimer-ita.rst

:Original: :ref:`Documentation/process/maintainer-pgp-guide.rst <pgpguide>`
:Translator: Alessia Mantegazza <[email protected]>

.. _it_pgpguide:

=========================================
La guida a PGP per manutentori del kernel
=========================================

:Author: Konstantin Ryabitsev <[email protected]>

Questo documento è destinato agli sviluppatori del kernel Linux, in particolar
modo ai manutentori. Contiene degli approfondimenti riguardo informazioni che
sono state affrontate in maniera più generale nella sezione
"`Protecting Code Integrity`_" pubblicata dalla Linux Foundation.
Per approfondire alcuni argomenti trattati in questo documento è consigliato
leggere il documento sopraindicato

.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md

Il ruolo di PGP nello sviluppo del kernel Linux
===============================================

PGP aiuta ad assicurare l'integrità del codice prodotto dalla comunità
di sviluppo del kernel e, in secondo luogo, stabilisce canali di comunicazione
affidabili tra sviluppatori attraverso lo scambio di email firmate con PGP.

Il codice sorgente del kernel Linux è disponibile principalmente in due
formati:

- repositori distribuiti di sorgenti (git)
- rilasci periodici di istantanee (archivi tar)

Sia i repositori git che gli archivi tar portano le firme PGP degli
sviluppatori che hanno creato i rilasci ufficiali del kernel. Queste firme
offrono una garanzia crittografica che le versioni scaricabili rese disponibili
via kernel.org, o altri portali, siano identiche a quelle che gli sviluppatori
hanno sul loro posto di lavoro. A tal scopo:

- i repositori git forniscono firme PGP per ogni tag
- gli archivi tar hanno firme separate per ogni archivio

.. _it_devs_not_infra:

Fidatevi degli sviluppatori e non dell'infrastruttura
-----------------------------------------------------

Fin dal 2011, quando i sistemi di kernel.org furono compromessi, il principio
generale del progetto Kernel Archives è stato quello di assumere che qualsiasi
parte dell'infrastruttura possa essere compromessa in ogni momento. Per questa
ragione, gli amministratori hanno intrapreso deliberatemene dei passi per
enfatizzare che la fiducia debba risiedere sempre negli sviluppatori e mai nel
codice che gestisce l'infrastruttura, indipendentemente da quali che siano le
pratiche di sicurezza messe in atto.

Il principio sopra indicato è la ragione per la quale è necessaria questa
guida. Vogliamo essere sicuri che il riporre la fiducia negli sviluppatori
non sia fatto semplicemente per incolpare qualcun'altro per future falle di
sicurezza. L'obiettivo è quello di fornire una serie di linee guida che gli
sviluppatori possano seguire per creare un ambiente di lavoro sicuro e
salvaguardare le chiavi PGP usate nello stabilire l'integrità del kernel Linux
stesso.

.. _it_pgp_tools:

GnuPG와 gpg-agent

68-117

배포판에 기본 설치된 GnuPG의 버전을 먼저 확인한다. 이 이탈리아어 원문은 GnuPG 2.2 이상을 기준으로 하며, 이전 version에서는 이 안내서의 일부 명령이 동작하지 않을 수 있다.

$ gpg --version | head -n1

gpg-agent는 gpg 명령을 사용할 때 자동으로 시작되어 백그라운드에서 private key passphrase를 cache한다. default-cache-ttl은 마지막 키 사용 뒤 cache가 유지되는 시간이며, 만료 전에 같은 키를 사용하면 countdown이 다시 시작된다. 기본값은 600초다.

max-cache-ttl은 최초 passphrase 입력 이후의 절대 최대 cache 시간이다. 그 사이에 키를 계속 사용했더라도 이 시간이 지나면 다시 passphrase를 입력해야 한다. 기본값은 30분이다.

# ~/.gnupg/gpg-agent.conf
# 일반 TTL 30분, 최대 TTL 2시간
default-cache-ttl 1800
max-cache-ttl 7200

현대 GnuPG에서는 shell session을 시작할 때 gpg-agent를 수동 실행할 필요가 없다. 이전 버전을 위해 rc 파일에 넣어 둔 agent 시작 코드가 있다면 현재 동작과 충돌하지 않는지 확인하고 제거한다.

Strumenti PGP
=============

Usare GnuPG 2.2 o successivo
----------------------------

La vostra distribuzione potrebbe avere già installato GnuPG, dovete solo
verificare che stia utilizzando la versione abbastanza recente. Per controllate
usate::

    $ gpg --version | head -n1

Se state utilizzando la version 2.2 o successiva, allora siete pronti a partire.
Se invece state usando una versione precedente, allora alcuni comandi elencati
in questa guida potrebbero non funzionare.

Configurare le opzioni di gpg-agent
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

L'agente GnuPG è uno strumento di aiuto che partirà automaticamente ogni volta
che userete il comando ``gpg`` e funzionerà in *background* con l'obiettivo di
individuare la passphrase. Ci sono due opzioni che dovreste conoscere
per personalizzare la scadenza della passphrase nella cache:

- ``default-cache-ttl`` (secondi): Se usate ancora la stessa chiave prima
  che il time-to-live termini, il conto alla rovescia si resetterà per un
  altro periodo. Di base è di 600 (10 minuti).

- ``max-cache-ttl`` (secondi): indipendentemente da quanto sia recente l'ultimo
  uso della chiave da quando avete inserito la passphrase, se il massimo
  time-to-live è scaduto, dovrete reinserire nuovamente la passphrase.
  Di base è di 30 minuti.

Se ritenete entrambe questi valori di base troppo corti (o troppo lunghi),
potete creare il vostro file ``~/.gnupg/gpg-agent.conf`` ed impostare i vostri
valori::

    # set to 30 minutes for regular ttl, and 2 hours for max ttl
    default-cache-ttl 1800
    max-cache-ttl 7200

.. note::

    Non è più necessario far partire l'agente gpg manualmente all'inizio della
    vostra sessione. Dovreste controllare i file rc per rimuovere tutto ciò che
    riguarda vecchie le versioni di GnuPG, poiché potrebbero non svolgere più
    bene il loro compito.

.. _it_protect_your_key:

Primary key 보호와 offline backup

118-382

이 문서는 이미 커널 개발용 PGP 키가 있다고 가정한다. 키가 없으면 Protecting Code Integrity의 생성 절차를 따르고, 기존 RSA 키가 2048비트보다 약하다면 새 키를 만든다.

PGP key는 보통 하나의 keypair가 아니라 서로 독립된 여러 subkey의 묶음이다. 생성할 때 각 subkey에 capability를 부여한다. [S]는 서명, [E]는 암호화, [A]는 인증, [C]는 다른 키를 인증하는 용도다.

[C] capability를 가진 키를 흔히 master key라고 부르지만, 다른 subkey를 대신할 수 있다는 오해를 부른다. 실제로 [C] 키가 [E] 또는 [S] 키의 private operation을 대신할 수 없으므로 이 문서는 Certify key라고 부른다.

  • 각 private subkey는 완전히 독립적이다. 하나를 잃어버리면 같은 key chain의 다른 private key로 복원하거나 다시 만들 수 없다.
  • Certify key를 제외하면 같은 capability의 유효한 subkey를 여러 개 둘 수 있다. 한 [E] subkey로 암호화한 메시지를 다른 [E] subkey로 복호화할 수는 없다.
  • 하나의 subkey가 여러 capability를 가질 수 있다. 예를 들어 [C]와 [S]를 함께 가진 [SC] 키가 가능하다.

Certify key만 key chain의 관계를 바꿀 수 있다. S/E/A subkey 추가와 폐기, UID 추가·변경·폐기, 자신과 subkey의 만료일 변경, Web of Trust를 위한 다른 사람 키 서명을 수행한다.

GnuPG 기본 생성 결과는 Certify와 Sign을 함께 가진 [SC] key 하나와 별도 [E] subkey 하나다. gpg --list-secret-keys 출력의 sec 아래 긴 40자리 문자열이 fingerprint이며, 아래 명령에서 [fpr]로 표시한 자리에 이 값을 사용한다.

sec   ed25519 2022-12-20 [SC] [expires: 2024-12-19]
      000000000000000000000000AAAABBBBCCCCDDDD
uid           [ultimate] Alice Dev <[email protected]>
ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]

GnuPG는 disk에 저장하는 private key를 passphrase로 암호화한다. .gnupg 디렉터리 전체가 유출되어도 공격자가 passphrase를 얻지 못하면 private key를 바로 사용할 수 없다. 따라서 강한 passphrase는 필수이며 다음 명령으로 설정하거나 바꾼다.

$ gpg --change-passphrase [fpr]

# [SC]만 있다면 독립된 signing subkey 생성
$ gpg --quick-add-key [fpr] ed25519 sign

목표는 Certify key를 offline media로 옮기고 일상 signing 작업에는 별도 [S] subkey를 쓰는 것이다. [SC] 결합 키만 있다면 먼저 signing subkey를 추가한다.

PGP key chain의 권한 분리
Certify [C]: offlinesubkey 추가·폐기UID·만료일 관리다른 사람 키 서명
Signing [S]: smartcardGit tag·commit 서명patch attestation
Encryption [E]: smartcard수신 메시지 복호화
Authentication [A]: 선택인증 작업

Certify key는 관계와 수명을 관리하고, 일상 작업은 독립 subkey가 맡는다.

다른 개발자에게 받은 서명이 많을수록 key identity를 잃었을 때의 복구 비용이 커진다. 디지털 저장장치 전체가 손상되는 재해에 대비해 private key의 종이 백업을 만든다.

paperkey는 private key의 핵심 데이터를 출력 가능한 형식으로 만드는 도구다. 형식과 다른 방식보다 나은 점은 man paperkey에서 확인하며, 대부분의 배포판에서 package로 제공한다.

$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt

파일을 출력하고 그 당시의 passphrase를 종이 여백에 손으로 기록하는 것을 강하게 권장한다. 출력된 key material도 passphrase로 암호화되어 있으며, 이후 passphrase를 바꾸면 백업을 만들던 때의 값을 기억하지 못할 가능성이 높다.

출력물과 수기 passphrase를 봉투에 넣어 집과 떨어진 은행 금고 같은 안전한 장소에 둔다. key data가 passphrase로 암호화되어 있으므로 cloud 연동 printer를 통한 출력도 상대적으로 안전하다고 원문은 설명한다.

이 단계는 생략하면 안 된다. 이후 Certify key를 working homedir에서 제거하므로, 검증된 전체 백업이 없으면 key chain을 사용할 수 없게 만들 수 있다.

paperkey는 재해 수준의 최후 복구본이고, 일상적인 key 변경에 사용할 수 있는 외부 백업은 별도로 필요하다. UID 편집, subkey 추가·폐기, 만료일 변경, conference나 summit 뒤 다른 사람 키 서명에는 Certify key가 든 이 복사본을 사용한다.

가급적 두 개의 외부 media를 준비하고 배포판 안내에 따라 LUKS 암호화 partition을 만든다. 암호화 passphrase는 PGP key와 같은 값을 사용할 수 있다고 원문은 제안한다. 장치를 mount한 다음 .gnupg 전체를 속성과 함께 복사한다.

$ cp -a ~/.gnupg /media/disk/foo/gnupg-backup

# 복사본을 직접 사용해 읽기 시험
$ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]

오류 없이 key가 표시되는지 반드시 시험한다. 장치를 unmount하고 실수로 덮어쓰지 않도록 분명히 표시해 안전한 곳에 보관한다. 다만 Certify 작업 때마다 꺼내야 하므로 재해 복구용 종이보다 접근 가능한 위치여야 한다.

home directory는 새 workstation을 위한 임시 복사, 시스템 관리자의 실수나 악의, 취약한 backup, browser·PDF viewer 같은 desktop app의 malware, 국경 통과 중 강제 조사 등 여러 경로로 유출될 수 있다.

강한 passphrase는 위험을 낮추지만 keylogger, 어깨너머 관찰과 다른 수단으로 노출될 수 있다. 따라서 Certify key는 일상 homedir에서 제거해 offline storage에만 둔다. 이 작업 전에 전체 .gnupg 백업이 정상 동작하는지 다시 확인해야 한다.

먼저 Certify key의 keygrip을 찾는다. 출력에서 pub 줄과 Certify fingerprint 바로 아래에 있는 Keygrip이 대상이다. 각 keygrip은 ~/.gnupg/private-keys-v1.d의 같은 이름 .key 파일에 대응한다.

$ gpg --with-keygrip --list-key [fpr]

pub   ed25519 2022-12-20 [SC] [expires: 2022-12-19]
      000000000000000000000000AAAABBBBCCCCDDDD
      Keygrip = 1111000000000000000000000000000000000000
uid           [ultimate] Alice Dev <[email protected]>
sub   cv25519 2022-12-20 [E] [expires: 2022-12-19]
      Keygrip = 2222000000000000000000000000000000000000
sub   ed25519 2022-12-20 [S]
      Keygrip = 3333000000000000000000000000000000000000
$ cd ~/.gnupg/private-keys-v1.d
$ ls
1111000000000000000000000000000000000000.key
2222000000000000000000000000000000000000.key
3333000000000000000000000000000000000000.key

# 백업을 검증한 뒤 Certify key 파일만 제거
$ rm 1111000000000000000000000000000000000000.key

이후 gpg --list-secret-keys에서 sec#가 표시되어야 한다. #은 public 정보는 있지만 해당 private key가 현재 homedir에 없다는 뜻이다. [E]와 새 [S] subkey는 ssb로 계속 표시된다.

$ gpg --list-secret-keys
sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
      000000000000000000000000AAAABBBBCCCCDDDD
uid           [ultimate] Alice Dev <[email protected]>
ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]
ssb   ed25519 2022-12-20 [S]

이전 GnuPG가 남긴 ~/.gnupg/secring.gpg에도 private key가 들어 있을 수 있으므로 제거한다. private-keys-v1.d가 없다면 아직 GnuPG v1의 legacy secring.gpg를 쓰는 상태다. passphrase 변경이나 subkey 추가 같은 key 변경을 수행하면 새 형식으로 자동 변환되며, 변환과 백업 확인 뒤 obsolete secring.gpg를 삭제한다.

Proteggere la vostra chiave PGP primaria
========================================

Questa guida parte dal presupposto che abbiate già una chiave PGP che usate
per lo sviluppo del kernel Linux. Se non ne avete ancora una, date uno sguardo
al documento "`Protecting Code Integrity`_" che abbiamo menzionato prima.

Dovreste inoltre creare una nuova chiave se quella attuale è inferiore a 2048
bit (RSA).

Le sottochiavi PGP
------------------

Raramente le chiavi PGP sono composte da una singola coppia -- solitamente, sono
una collezione di sottochiavi indipendenti usate per diversi scopi in funzione
delle capacità assegnate al momento della creazione. Una chiave PGP può avere
quattro capacità:

- **[S]** può essere usata per firmare
- **[E]** può essere usata per criptare
- **[A]** può essere usata per autenticare
- **[C]** può essere usata per certificare altre chiavi

La chiave con la capacità **[C]** viene spesso chiamata chiave "passepartout"
(*master key*), ma è una terminologia fuorviante perché lascia intendere che la
chiave di certificato possa essere usate in sostituzione delle altre (proprio
come le vere chiavi passpartout in grado di aprire diverse serrature). Dato che
questo non è il caso, per evitare fraintendimenti, in questa guida ci riferiremo
a questa chiave chiamandola "La chiave di certificazione".

I seguenti punti sono molto importanti:

1. Tutte le sottochiavi sono indipendenti. Se perdete una sottochiave privata
   non potrete recuperarla usando le altre.
2. Ad eccezione della chiave di certificazione, ci possono essere più
   sottochiavi con le stesse capacità (per esempio, potete avere 2 sottochiavi
   per criptare, 3 per firmare, ma solo una per una sola per certificare). Tutte
   le sottochiavi sono indipendenti -- un messaggio criptato usando una chiave
   **[E]** non può essere decriptato usano altre sottochiavi **[E]**.
3. Una sottochiave può avere più capacità (per esempio, la chiave **[C]** può
   anche essere una chiave **[S]**).

La chiave con capacità **[C]** (certificazione) è la sola che può essere usata
per indicare relazioni fra chiavi. Solo la chiave **[C]** può essere usata per:

- aggiungere o revocare altre chiavi (sottochiavi) che hanno capacità S/E/A;
- aggiungere, modificare o eliminare le identità (unids) associate alla chiave;
- aggiungere o modificare la propria data di scadenza o delle sottochiavi;
- firmare le chiavi di altre persone a scopo di creare una rete di fiducia.

Di base, alla creazione di nuove chiavi, GnuPG genera quanto segue:

- Una chiave la capacità di certificazione che quella di firma (**[SC]**)
- Una sottochiave separata con capacità di criptare (**[E]**)




Se avete usato i parametri predefiniti per generare la vostra chiave, quello
sarà il risultato. Potete verificarlo utilizzando ``gpg --list-secret-keys``,
per esempio::

    sec   ed25519 2022-12-20 [SC] [expires: 2024-12-19]
          000000000000000000000000AAAABBBBCCCCDDDD
    uid           [ultimate] Alice Dev <[email protected]>
    ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]

La lunga riga sotto la voce ``sec`` è la vostra impronta digitale --
negli esempi che seguono, quando vedere ``[fpr]`` ci si riferisce a questa
stringa di 40 caratteri.

Assicuratevi che la vostra passphrase sia forte
-----------------------------------------------

GnuPG utilizza le passphrases per criptare la vostra chiave privata prima
di salvarla sul disco. In questo modo, anche se il contenuto della vostra
cartella ``.gnupg`` venisse letto o trafugato nella sia interezza, gli
attaccanti non potrebbero comunque utilizzare le vostre chiavi private senza
aver prima ottenuto la passphrase per decriptarle.

È assolutamente essenziale che le vostre chiavi private siano protette da
una passphrase forte. Per impostarla o cambiarla, usate::

    $ gpg --change-passphrase [fpr]

Create una sottochiave di firma separata
----------------------------------------

Il nostro obiettivo è di proteggere la chiave primaria spostandola su un
dispositivo sconnesso dalla rete, dunque se avete solo una chiave combinata
**[SC]** allora dovreste creare una sottochiave di firma separata::

    $ gpg --quick-add-key [fpr] ed25519 sign

Ricordate di informare il keyserver del vostro cambiamento, cosicché altri
possano ricevere la vostra nuova sottochiave::

    $ gpg --send-key [fpr]

.. note:: Supporto ECC in GnuPG

   Tenete presente che se avete intenzione di usare un dispositivo che non
   supporta chiavi ED25519 ECC, allora dovreste usare "nistp256" al posto di
   "ed25519". Più avanti ci sono alcune raccomandazioni per i dispositivi.

Copia di riserva della chiave primaria per gestire il recupero da disastro
--------------------------------------------------------------------------

Maggiori sono le firme di altri sviluppatori che vengono applicate alla vostra,
maggiori saranno i motivi per avere una copia di riserva che non sia digitale,
al fine di effettuare un recupero da disastro.

Il modo migliore per creare una copia fisica della vostra chiave privata è
l'uso del programma ``paperkey``. Consultate ``man paperkey`` per maggiori
dettagli sul formato dell'output ed i suoi punti di forza rispetto ad altre
soluzioni. Paperkey dovrebbe essere già pacchettizzato per la maggior parte
delle distribuzioni.

Eseguite il seguente comando per creare una copia fisica di riserva della
vostra chiave privata::

    $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt

Stampate il file (o fate un pipe direttamente verso lpr), poi prendete
una penna e scrivete la passphare sul margine del foglio.  **Questo è
caldamente consigliato** perché la copia cartacea è comunque criptata con
la passphrase, e se mai doveste cambiarla non vi ricorderete qual'era al
momento della creazione di quella copia -- *garantito*.

Mettete la copia cartacea e la passphrase scritta a mano in una busta e
mettetela in un posto sicuro e ben protetto, preferibilmente fuori casa,
magari in una cassetta di sicurezza in banca.

.. note::

    Probabilmente la vostra stampante non è più quello stupido dispositivo
    connesso alla porta parallela, ma dato che il suo output è comunque
    criptato con la passphrase, eseguire la stampa in un sistema "cloud"
    moderno dovrebbe essere comunque relativamente sicuro.

Copia di riserva di tutta la cartella GnuPG
-------------------------------------------

.. warning::

    **!!!Non saltate questo passo!!!**

Quando avete bisogno di recuperare le vostre chiavi PGP è importante avere
una copia di riserva pronta all'uso. Questo sta su un diverso piano di
prontezza rispetto al recupero da disastro che abbiamo risolto con
``paperkey``. Vi affiderete a queste copie esterne quando dovreste usare la
vostra chiave Certify -- ovvero quando fate modifiche alle vostre chiavi o
firmate le chiavi di altre persone ad una conferenza o ad un gruppo d'incontro.

Incominciate con una piccola chiavetta di memoria USB (preferibilmente due)
che userete per le copie di riserva. Dovrete criptarle usando LUKS -- fate
riferimento alla documentazione della vostra distribuzione per capire come
fare.

Per la passphrase di criptazione, potete usare la stessa della vostra chiave
primaria.

Una volta che il processo di criptazione è finito, reinserite il disco USB ed
assicurativi che venga montato correttamente. Copiate interamente la cartella
``.gnugp`` nel disco criptato::

    $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup

Ora dovreste verificare che tutto continui a funzionare::

    $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]

Se non vedete errori, allora dovreste avere fatto tutto con successo.
Smontate il disco USB, etichettatelo per bene di modo da evitare di
distruggerne il contenuto non appena vi serve una chiavetta USB a caso, ed
infine mettetelo in un posto sicuro -- ma non troppo lontano, perché vi servirà
di tanto in tanto per modificare le identità, aggiungere o revocare
sottochiavi, o firmare le chiavi di altre persone.

Togliete la chiave primaria dalla vostra home
---------------------------------------------

I file che si trovano nella vostra cartella home non sono poi così ben protetti
come potreste pensare. Potrebbero essere letti o trafugati in diversi modi:

- accidentalmente quando fate una rapida copia della cartella home per
  configurare una nuova postazione
- da un amministratore di sistema negligente o malintenzionato
- attraverso copie di riserva insicure
- attraverso malware installato in alcune applicazioni (browser, lettori PDF,
  eccetera)
- attraverso coercizione quando attraversate confini internazionali

Proteggere la vostra chiave con una buona passphare aiuta notevolmente a
ridurre i rischi elencati qui sopra, ma le passphrase possono essere scoperte
attraverso i keylogger, il shoulder-surfing, o altri modi. Per questi motivi,
nella configurazione si raccomanda di rimuove la chiave primaria dalla vostra
cartella home e la si archivia su un dispositivo disconnesso.

.. warning::

    Per favore, fate riferimento alla sezione precedente e assicuratevi
    di aver fatto una copia di riserva totale della cartella GnuPG. Quello
    che stiamo per fare renderà la vostra chiave inutile se non avete delle
    copie di riserva utilizzabili!

Per prima cosa, identificate il keygrip della vostra chiave primaria::

    $ gpg --with-keygrip --list-key [fpr]

L'output assomiglierà a questo::

    pub   ed25519 2022-12-20 [SC] [expires: 2022-12-19]
          000000000000000000000000AAAABBBBCCCCDDDD
          Keygrip = 1111000000000000000000000000000000000000
    uid           [ultimate] Alice Dev <[email protected]>
    sub   cv25519 2022-12-20 [E] [expires: 2022-12-19]
          Keygrip = 2222000000000000000000000000000000000000
    sub   ed25519 2022-12-20 [S]
          Keygrip = 3333000000000000000000000000000000000000

Trovate la voce keygrid che si trova sotto alla riga ``pub`` (appena sotto
all'impronta digitale della chiave primaria). Questo corrisponderà direttamente
ad un file nella cartella ``~/.gnupg``::

    $ cd ~/.gnupg/private-keys-v1.d
    $ ls
    1111000000000000000000000000000000000000.key
    2222000000000000000000000000000000000000.key
    3333000000000000000000000000000000000000.key

Quello che dovrete fare è rimuovere il file .key che corrisponde al keygrip
della chiave primaria::

    $ cd ~/.gnupg/private-keys-v1.d
    $ rm 1111000000000000000000000000000000000000.key

Ora, se eseguite il comando ``--list-secret-keys``, vedrete che la chiave
primaria non compare più (il simbolo ``#`` indica che non è disponibile)::

    $ gpg --list-secret-keys
    sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
          000000000000000000000000AAAABBBBCCCCDDDD
    uid           [ultimate] Alice Dev <[email protected]>
    ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]
    ssb   ed25519 2022-12-20 [S]

Dovreste rimuovere anche i file ``secring.gpg`` che si trovano nella cartella
``~/.gnupg``, in quanto rimasugli delle versioni precedenti di GnuPG.

Se non avete la cartella "private-keys-v1.d"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Se non avete la cartella ``~/.gnupg/private-keys-v1.d``, allora le vostre
chiavi segrete sono ancora salvate nel vecchio file ``secring.gpg`` usato
da GnuPG v1. Effettuare una qualsiasi modifica alla vostra chiave, come
cambiare la passphare o aggiungere una sottochiave, dovrebbe convertire
automaticamente il vecchio formato ``secring.gpg``nel nuovo
``private-keys-v1.d``.

Una volta che l'avete fatto, assicuratevi di rimuovere il file ``secring.gpg``,
che continua a contenere la vostra chiave privata.

.. _it_smartcards:

Smartcard와 offline Certify key 운용

383-669

Certify key를 offline으로 옮겨도 [S]와 [E] subkey가 homedir에 남아 있으면 passphrase를 아는 공격자가 서명을 위조하거나 통신을 복호화할 수 있다. GnuPG operation 때 private key가 system memory에 올라오므로 Meltdown과 Spectre 같은 고급 공격으로 memory에서 탈취될 가능성도 고려해야 한다.

smartcard는 private key를 chip 안에 저장하고 암호 연산을 card 자체에서 수행한다. key 내용이 card 밖으로 나오지 않으므로 연결된 computer OS가 private key 자체를 읽을 수 없다. mount 중인 암호화 외장 media에서는 OS가 private key를 읽을 수 있다는 점과 근본적으로 다르다. 암호화 media는 smartcard의 대체재가 아니다.

장치특징
Nitrokey StartFSIJ GnuK 기반 open hardware와 Free Software. ECC ED25519를 지원하지만 tamper 및 일부 side-channel 저항 기능은 적음
Nitrokey Pro 2Start와 비슷하지만 tamper 저항과 보안 기능이 더 많고 NISTP ECC를 지원
Yubikey 5proprietary hardware와 software를 사용하며 USB-C 모델, FIDO, U2F와 NISTP ECC를 지원

가격, 지역 배송 가능성, open 또는 proprietary hardware에 대한 요구를 기준으로 선택한다. MAINTAINERS에 등재되었거나 kernel.org 계정이 있는 개발자는 Linux Foundation이 제공하는 무료 Nitrokey Start 대상이 될 수 있다.

private key가 노출되는 범위
저장 방식OS가 key를 읽을 수 있는 때용도
01 LUKS 외장 mediamount 후 GnuPG가 private key를 읽음Certify 작업과 복구
02 smartcardprivate key는 chip 밖으로 나오지 않음서명·복호화 operation
03 paperkey사람이 복원 절차를 수행할 때만최후 재해 복구

암호화 backup과 smartcard는 목적이 다르다. backup은 복구 가능성을, smartcard는 일상 operation 중 key 비노출을 제공한다.

현대 Linux workstation에서는 smartcard USB 장치를 연결하면 보통 바로 인식된다. gpg --card-status로 card 세부 정보가 표시되는지 확인한다. 인식 실패 원인 분석은 장치와 배포판별 지원 문서를 따른다.

$ gpg --card-status

$ gpg --card-edit
[...omitted...]
gpg/card> admin
Admin commands are allowed
gpg/card> passwd

card menu에서 user PIN(1), Admin PIN(3), Reset Code(4)를 설정하고 안전한 장소에 기록한다. 특히 자주 쓰지 않는 Admin PIN과 card를 완전히 초기화할 수 있는 Reset Code를 잊지 않게 보관해야 한다. 이름, 성별, login data 같은 값은 필수가 아니며 card 분실 시 불필요한 개인정보를 노출할 수 있다. PIN이라는 이름과 달리 숫자만 사용할 필요는 없다.

일부 장치는 passphrase를 바꾸기 전에 subkey를 먼저 장치로 옮겨야 할 수 있으므로 제조사 문서를 확인한다. card menu에서 q로 나가 변경을 저장한 뒤, PGP passphrase와 card Admin PIN을 준비하고 key edit menu를 연다.

$ gpg --edit-key [fpr]

Secret subkeys are available.

pub  ed25519/AAAABBBBCCCCDDDD
     created: 2022-12-20  expires: 2024-12-19  usage: SC
     trust: ultimate      validity: ultimate
ssb  cv25519/1111222233334444
     created: 2022-12-20  expires: never       usage: E
ssb  ed25519/5555666677778888
     created: 2017-12-07  expires: never       usage: S
[ultimate] (1). Alice Dev <[email protected]>

gpg>

gpg> menu에서 key 1은 첫 번째 [E] subkey를 선택한다. 출력의 ssb* 별표가 현재 선택된 key를 나타내며 같은 명령을 다시 입력하면 선택이 해제되는 toggle이다. keytocard를 실행하고 Encryption key slot 2를 선택한다. PGP passphrase와 Admin PIN 입력 뒤 오류가 없으면 이전된 것이다.

gpg> key 1
gpg> keytocard
Please select where to store the key:
   (2) Encryption key
Your selection? 2

다음 key를 옮기기 전에 key 1을 다시 입력해 [E] 선택을 반드시 해제하고 key 2로 [S]를 선택한다. [S] key를 Signature와 Authentication에 모두 쓸 수 있어도 이 절차에서는 Signature slot 1에 넣는다.

gpg> key 1
gpg> key 2
gpg> keytocard
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1

gpg> q
Save changes? (y/N) y

변경을 저장하면 card로 옮긴 private subkey가 homedir에서 삭제된다. 교체 card에 다시 넣어야 할 때는 앞에서 만든 검증된 offline backup을 사용한다.

gpg --list-secret-keys를 다시 실행하면 Certify key는 sec#, card의 subkey는 ssb>로 표시된다. >는 private subkey가 smartcard에만 있다는 뜻이다.

$ gpg --list-secret-keys
sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
      000000000000000000000000AAAABBBBCCCCDDDD
uid           [ultimate] Alice Dev <[email protected]>
ssb>  cv25519 2022-12-20 [E] [expires: 2024-12-19]
ssb>  ed25519 2022-12-20 [S]

private-keys-v1.d의 .key 파일은 실제 key가 아니라 card 위치를 가리키는 stub으로 바뀐다. strings 출력에 shadowed-private-key가 있으면 실제 내용은 smartcard에 있다는 뜻이다.

$ cd ~/.gnupg/private-keys-v1.d
$ strings *.key | grep 'private-key'

실제 서명으로 card 동작을 시험한다. 첫 명령에서 smartcard PIN을 요구하고, verify 결과에 Good signature가 나와야 한다.

$ echo "Hello world" | gpg --clearsign > /tmp/test.asc
$ gpg --verify /tmp/test.asc

Certify 작업을 시작할 때 암호화된 offline storage를 mount하고 GNUPGHOME을 그 백업 디렉터리로 지정한다. gpg --list-secret-keys에서 sec#가 아니라 sec가 표시되어 실제 Certify private key를 읽고 있는지 확인한다.

$ export GNUPGHOME=/media/disk/foo/gnupg-backup
$ gpg --list-secret-keys

Certify key의 기본 만료 기간은 생성 후 2년이다. 키가 무기한 유효하지 않게 하는 보안 목적과, 사용하지 않는 key가 keyserver에서 결국 사라지게 하는 목적이 있다. 현재 날짜에서 1년 연장하거나 기억하기 쉬운 특정 날짜를 지정할 수 있다.

$ gpg --quick-set-expire [fpr] 1y
$ gpg --quick-set-expire [fpr] 2025-07-01
$ gpg --send-key [fpr]

변경한 public key를 keyserver로 다시 보낸다. offline storage에서 변경한 내용을 평소 working keyring으로 export/import한 뒤 GNUPGHOME을 해제한다.

$ gpg --export | gpg --homedir ~/.gnupg --import
$ unset GNUPGHOME

원격 system에서 tag나 commit을 서명해야 한다면 gpg-agent를 SSH로 forwarding할 수 있다. 원격 sshd 설정을 수정할 수 있을 때 더 원활하며, 구체적인 socket forwarding 절차는 GnuPG wiki를 따른다.

Spostare le sottochiavi in un apposito dispositivo criptato
===========================================================

Nonostante la chiave primaria sia ora al riparo da occhi e mani indiscrete,
le sottochiavi si trovano ancora nella vostra cartella home. Chiunque riesca
a mettere le sue mani su quelle chiavi riuscirà a decriptare le vostre
comunicazioni o a falsificare le vostre firme (se conoscono la passphrase).
Inoltre, ogni volta che viene fatta un'operazione con GnuPG, le chiavi vengono
caricate nella memoria di sistema e potrebbero essere rubate con l'uso di
malware sofisticati (pensate a Meltdown e a Spectre).

Il miglior modo per proteggere le proprie chiave è di spostarle su un
dispositivo specializzato in grado di effettuare operazioni smartcard.

I benefici di una smartcard
---------------------------

Una smartcard contiene un chip crittografico che è capace di immagazzinare
le chiavi private ed effettuare operazioni crittografiche direttamente sulla
carta stessa. Dato che la chiave non lascia mai la smartcard, il sistema
operativo usato sul computer non sarà in grado di accedere alle chiavi.
Questo è molto diverso dai dischi USB criptati che abbiamo usato allo scopo di
avere una copia di riserva sicura -- quando il dispositivo USB è connesso e
montato, il sistema operativo potrà accedere al contenuto delle chiavi private.

L'uso di un disco USB criptato non può sostituire le funzioni di un dispositivo
capace di operazioni di tipo smartcard.

Dispositivi smartcard disponibili
---------------------------------

A meno che tutti i vostri computer dispongano di lettori smartcard, il modo
più semplice è equipaggiarsi di un dispositivo USB specializzato che
implementi le funzionalità delle smartcard.  Sul mercato ci sono diverse
soluzioni disponibili:

- `Nitrokey Start`_: è Open hardware e Free Software, è basata sul progetto
  `GnuK`_ della FSIJ. Questo è uno dei pochi dispositivi a supportare le chiavi
  ECC ED25519, ma offre meno funzionalità di sicurezza (come la resistenza
  alla manomissione o alcuni attacchi ad un canale laterale).
- `Nitrokey Pro 2`_: è simile alla Nitrokey Start, ma è più resistente alla
  manomissione e offre più funzionalità di sicurezza. La Pro 2 supporta la
  crittografia ECC (NISTP).
- `Yubikey 5`_: l'hardware e il software sono proprietari, ma è più economica
  della  Nitrokey Pro ed è venduta anche con porta USB-C il che è utile con i
  computer portatili più recenti. In aggiunta, offre altre funzionalità di
  sicurezza come FIDO, U2F, e ora supporta anche le chiavi ECC (NISTP)

La vostra scelta dipenderà dal costo, la disponibilità nella vostra regione, e
sulla scelta fra dispositivi aperti e proprietari.

.. note::

    Se siete nella lista MAINTAINERS o avete un profilo su kernel.org, allora
    `potrete avere gratuitamente una Nitrokey Start`_ grazie alla fondazione
    Linux.

.. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
.. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nitrokey-pro-2-3
.. _`Yubikey 5`: https://www.yubico.com/product/yubikey-5-overview/
.. _Gnuk: https://www.fsij.org/doc-gnuk/
.. _`potrete avere gratuitamente una Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html

Configurare il vostro dispositivo smartcard
-------------------------------------------

Il vostro dispositivo smartcard dovrebbe iniziare a funzionare non appena
lo collegate ad un qualsiasi computer Linux moderno. Potete verificarlo
eseguendo::

    $ gpg --card-status

Se vedete tutti i dettagli della smartcard, allora ci siamo. Sfortunatamente,
affrontare tutti i possibili motivi per cui le cose potrebbero non funzionare
non è lo scopo di questa guida. Se avete problemi nel far funzionare la carta
con GnuPG, cercate aiuto attraverso i soliti canali di supporto.

Per configurare la vostra smartcard, dato che non c'è una via facile dalla
riga di comando, dovrete usate il menu di GnuPG::

    $ gpg --card-edit
    [...omitted...]
    gpg/card> admin
    Admin commands are allowed
    gpg/card> passwd

Dovreste impostare il PIN dell'utente (1), quello dell'amministratore (3) e il
codice di reset (4). Assicuratevi di annotare e salvare questi codici in un
posto sicuro -- specialmente il PIN dell'amministratore e il codice di reset
(che vi permetterà di azzerare completamente la smartcard).  Il PIN
dell'amministratore viene usato così raramente che è inevitabile dimenticarselo
se non lo si annota.

Tornando al nostro menu, potete impostare anche altri valori (come il nome,
il sesso, informazioni d'accesso, eccetera), ma non sono necessari e aggiunge
altre informazioni sulla carta che potrebbero trapelare in caso di smarrimento.

.. note::

    A dispetto del nome "PIN", né il PIN utente né quello dell'amministratore
    devono essere esclusivamente numerici.

.. warning::

    Alcuni dispositivi richiedono la presenza delle sottochiavi nel dispositivo
    stesso prima che possiate cambiare la passphare. Verificate la
    documentazione del produttore.

Spostare le sottochiavi sulla smartcard
---------------------------------------

Uscite dal menu (usando "q") e salverete tutte le modifiche. Poi, spostiamo
tutte le sottochiavi sulla smartcard. Per la maggior parte delle operazioni
vi serviranno sia la passphrase della chiave PGP che il PIN
dell'amministratore::

    $ gpg --edit-key [fpr]

    Secret subkeys are available.

    pub  ed25519/AAAABBBBCCCCDDDD
         created: 2022-12-20  expires: 2024-12-19  usage: SC
         trust: ultimate      validity: ultimate
    ssb  cv25519/1111222233334444
         created: 2022-12-20  expires: never       usage: E
    ssb  ed25519/5555666677778888
         created: 2017-12-07  expires: never       usage: S
    [ultimate] (1). Alice Dev <[email protected]>

    gpg>

Usando ``--edit-key`` si tornerà alla modalità menu e noterete che
la lista delle chiavi è leggermente diversa. Da questo momento in poi,
tutti i comandi saranno eseguiti nella modalità menu, come indicato
da ``gpg>``.

Per prima cosa, selezioniamo la chiave che verrà messa sulla carta --
potete farlo digitando ``key 1`` (è la prima della lista, la sottochiave
**[E]**)::

    gpg> key 1

Nel'output dovreste vedere ``ssb*`` associato alla chiave **[E]**. Il simbolo
``*`` indica che la chiave è stata "selezionata". Funziona come un
interruttore, ovvero se scrivete nuovamente ``key 1``, il simbolo ``*`` sparirà
e la chiave non sarà più selezionata.

Ora, spostiamo la chiave sulla smartcard::

    gpg> keytocard
    Please select where to store the key:
       (2) Encryption key
    Your selection? 2

Dato che è la nostra chiave  **[E]**, ha senso metterla nella sezione criptata.
Quando confermerete la selezione, vi verrà chiesta la passphrase della vostra
chiave PGP, e poi il PIN dell'amministratore. Se il comando ritorna senza
errori, allora la vostra chiave è stata spostata con successo.

**Importante**: digitate nuovamente ``key 1`` per deselezionare la prima chiave
e selezionate la seconda chiave **[S]** con ``key 2``::

    gpg> key 1
    gpg> key 2
    gpg> keytocard
    Please select where to store the key:
       (1) Signature key
       (3) Authentication key
    Your selection? 1

Potete usare la chiave **[S]** sia per firmare che per autenticare, ma vogliamo
che sia nella sezione di firma, quindi scegliete (1). Ancora una volta, se il
comando ritorna senza errori, allora l'operazione è avvenuta con successo::

    gpg> q
    Save changes? (y/N) y

Salvando le modifiche cancellerete dalla vostra cartella home tutte le chiavi
che avete spostato sulla carta (ma questo non è un problema, perché abbiamo
fatto delle copie di sicurezza nel caso in cui dovessimo configurare una
nuova smartcard).

Verificare che le chiavi siano state spostate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ora, se doveste usare l'opzione ``--list-secret-keys``, vedrete una
sottile differenza nell'output::

    $ gpg --list-secret-keys
    sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
          000000000000000000000000AAAABBBBCCCCDDDD
    uid           [ultimate] Alice Dev <[email protected]>
    ssb>  cv25519 2022-12-20 [E] [expires: 2024-12-19]
    ssb>  ed25519 2022-12-20 [S]

Il simbolo ``>`` in ``ssb>`` indica che la sottochiave è disponibile solo
nella smartcard. Se tornate nella vostra cartella delle chiavi segrete e
guardate al suo contenuto, noterete che i file ``.key`` sono stati sostituiti
con degli stub::

    $ cd ~/.gnupg/private-keys-v1.d
    $ strings *.key | grep 'private-key'

Per indicare che i file sono solo degli stub e che in realtà il contenuto è
sulla smartcard, l'output dovrebbe mostrarvi ``shadowed-private-key``.

Verificare che la smartcard funzioni
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Per verificare che la smartcard funzioni come dovuto, potete creare
una firma::

    $ echo "Hello world" | gpg --clearsign > /tmp/test.asc
    $ gpg --verify /tmp/test.asc

Col primo comando dovrebbe chiedervi il PIN della smartcard, e poi dovrebbe
mostrare "Good signature" dopo l'esecuzione di ``gpg --verify``.

Complimenti, siete riusciti a rendere estremamente difficile il furto della
vostra identità digitale di sviluppatore.

Altre operazioni possibili con GnuPG
------------------------------------

Segue un breve accenno ad alcune delle operazioni più comuni che dovrete
fare con le vostre chiavi PGP.

Montare il disco con la chiave primaria
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Vi servirà la vostra chiave principale per tutte le operazioni che seguiranno,
per cui per prima cosa dovrete accedere ai vostri backup e dire a GnuPG di
usarli::

    $ export GNUPGHOME=/media/disk/foo/gnupg-backup
    $ gpg --list-secret-keys

Dovete assicurarvi di vedere ``sec`` e non ``sec#`` nell'output del programma
(il simbolo ``#`` significa che la chiave non è disponibile e che state ancora
utilizzando la vostra solita cartella di lavoro).

Estendere la data di scadenza di una chiave
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

La chiave principale ha una data di scadenza di 2 anni dal momento della sua
creazione. Questo per motivi di sicurezza e per rendere obsolete le chiavi
che, eventualmente, dovessero sparire dai keyserver.

Per estendere di un anno, dalla data odierna, la scadenza di una vostra chiave,
eseguite::

    $ gpg --quick-set-expire [fpr] 1y

Se per voi è più facile da memorizzare, potete anche utilizzare una data
specifica (per esempio, il vostro compleanno o capodanno)::

    $ gpg --quick-set-expire [fpr] 2025-07-01

Ricordatevi di inviare l'aggiornamento ai keyserver::

    $ gpg --send-key [fpr]

Aggiornare la vostra cartella di lavoro dopo ogni modifica
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Dopo aver fatto delle modifiche alle vostre chiavi usando uno spazio a parte,
dovreste importarle nella vostra cartella di lavoro abituale::

    $ gpg --export | gpg --homedir ~/.gnupg --import
    $ unset GNUPGHOME

Usare gpg-agent con ssh
~~~~~~~~~~~~~~~~~~~~~~~

Se dovete firmare tag o commit su un sistema remoto, potete ridirezionare il
vostro gpg-agent attraverso ssh. Consultate le istruzioni disponibili nella wiki
GnuPG:

- `Agent Forwarding over SSH`_

Funziona senza troppi intoppi se avete la possibilità di modificare le
impostazioni di sshd sul sistema remoto.

.. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding

.. _it_pgp_with_git:

Git tag, commit과 patch 서명

670-854

Git 저장소를 clone하면 tag, commit, branch를 포함한 전체 history가 로컬에 생긴다. 여러 곳에 복제된 linux.git 가운데 어떤 사본이 악의적으로 바뀌지 않았는지, commit Author에 자신의 이름을 넣은 코드가 실제 자신이 만든 것인지 확인하려면 별도 암호학적 증거가 필요하다.

signed tag는 그 tag가 가리키는 repository 내용이 tag를 만든 개발자의 workstation과 동일하다는 무결성 기준점을 제공한다. signed commit은 공격자가 private key 없이 개발자를 사칭하기 어렵게 한다.

secret key가 하나뿐이면 기본 key로 선택된다. 여러 key가 있다면 Git이 사용할 fingerprint를 전역 설정한다.

$ git config --global user.signingKey [fpr]

$ git tag -s [tagname]

다른 개발자가 pull할 repository의 변조 여부를 확인할 수 있도록 모든 Git tag에 서명하는 것을 권장한다. tag는 git verify-tag로 직접 검증한다. 다른 fork에서 tag를 pull하면 Git은 merge 과정에서 tip의 signature를 자동 검증하고 결과를 merge message에 넣는다.

$ git verify-tag [tagname]
$ git pull [url] tags/sometag

Merge tag 'sometag' of [url]

[Tag message]

# gpg: Signature made [...]
# gpg: Good signature from [...]

다른 사람의 tag를 검증하려면 먼저 그 개발자의 public key를 가져와 identity를 검증해야 한다. annotated tag를 항상 서명하도록 강제하려면 tag.forceSignAnnotated를 설정한다.

$ git config --global tag.forceSignAnnotated true

커널 개발 workflow에서는 commit을 patch로 변환해 mailing list로 보내는데, 이 변환은 Git commit signature를 보존하지 않는다. upstream을 기준으로 rebase해도 기존 commit object가 새로 생성되어 서명이 사라진다. 이 때문에 많은 커널 개발자는 commit signing을 필수로 보지 않고 외부 저장소의 signed commit도 workflow 증거로 사용하지 않는다.

그럼에도 kernel.org, infradead.org, ozlabs.org 같은 공개 hosting에 working tree를 제공한다면 모든 commit에 서명할 것을 권장한다. 훗날 code provenance와 forensic 분석이 필요할 때 외부 tree의 signature도 증거가 되며, system 재설치 후 다시 clone한 저장소 무결성을 확인할 수 있고, 다른 사람이 cherry-pick 전에 commit을 빠르게 검증할 수 있다.

# 한 commit 서명: 소문자 -s와 다른 옵션이므로 대문자 -S
$ git commit -S

# 모든 commit 자동 서명
$ git config --global commit.gpgSign true

자동 commit signing을 켜기 전에 gpg-agent의 passphrase cache와 smartcard 동작을 먼저 구성한다.

커널 mailing list로 보내는 patch도 PGP key로 서명할 수 있다. PGP-MIME이나 PGP-inline은 일반 code review와 patch 적용을 방해할 수 있으므로, kernel.org가 만든 patatt를 이용해 DKIM과 비슷한 cryptographic attestation을 message header에 넣는다.

먼저 배포판에서 patatt package를 찾고, 없다면 PyPI의 `pip install patatt`로 설치한다. Git `user.signingKey`가 이미 설정되어 있다면 별도 key 설정 없이 repository에 git-send-email hook을 설치할 수 있다.

pip install patatt

patatt install-hook

이후 git send-email로 보내는 patch에는 자동으로 cryptographic signature가 붙는다. b4로 patch를 가져와 적용하면 발견한 DKIM과 patatt signature를 자동으로 검증한다.

$ b4 am [email protected]
[...]
Checking attestation on all messages, may take a moment...
---
  [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers
  [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall
  [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls
  ---
  Signed: openpgp/[email protected]
  Signed: DKIM/kernel.org

patatt와 b4는 계속 개발되고 있으므로 현재 project 문서에서 새 기능과 변경된 사용법을 확인한다.

Usare PGP con Git
=================

Una delle caratteristiche fondanti di Git è la sua natura decentralizzata --
una volta che il repositorio è stato clonato sul vostro sistema, avete la
storia completa del progetto, inclusi i suoi tag, i commit ed i rami. Tuttavia,
con i centinaia di repositori clonati che ci sono in giro, come si fa a
verificare che la loro copia di linux.git non è stata manomessa da qualcuno?

Oppure, cosa succede se viene scoperta una backdoor nel codice e la riga
"Autore" dice che sei stato tu, mentre tu sei abbastanza sicuro di
`non averci niente a che fare`_?

Per risolvere entrambi i problemi, Git ha introdotto l'integrazione con PGP.
I tag firmati dimostrano che il repositorio è integro assicurando che il suo
contenuto è lo stesso che si trova sulle macchine degli sviluppatori che hanno
creato il tag; mentre i commit firmati rendono praticamente impossibile
ad un malintenzionato di impersonarvi senza avere accesso alle vostre chiavi
PGP.

.. _`non averci niente a che fare`: https://github.com/jayphelps/git-blame-someone-else

Configurare git per usare la vostra chiave PGP
----------------------------------------------

Se avete solo una chiave segreta nel vostro portachiavi, allora non avete nulla
da fare in più dato che sarà la vostra chiave di base. Tuttavia, se doveste
avere più chiavi segrete, potete dire a git quale dovrebbe usare (``[fpg]``
è la vostra impronta digitale)::

    $ git config --global user.signingKey [fpr]

Come firmare i tag
------------------

Per creare un tag firmato, passate l'opzione ``-s`` al comando tag::

    $ git tag -s [tagname]

La nostra raccomandazione è quella di firmare sempre i tag git, perché
questo permette agli altri sviluppatori di verificare che il repositorio
git dal quale stanno prendendo il codice non è stato alterato intenzionalmente.

Come verificare i tag firmati
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Per verificare un tag firmato, potete usare il comando ``verify-tag``::

    $ git verify-tag [tagname]

Se state prendendo un tag da un fork del repositorio del progetto, git
dovrebbe verificare automaticamente la firma di quello che state prendendo
e vi mostrerà il risultato durante l'operazione di merge::

    $ git pull [url] tags/sometag

Il merge conterrà qualcosa di simile::

    Merge tag 'sometag' of [url]

    [Tag message]

    # gpg: Signature made [...]
    # gpg: Good signature from [...]

Se state verificando il tag di qualcun altro, allora dovrete importare
la loro chiave PGP. Fate riferimento alla sezione ":ref:`it_verify_identities`"
che troverete più avanti.

Configurare git per firmare sempre i tag con annotazione
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Se state creando un tag con annotazione è molto probabile che vogliate
firmarlo. Per imporre a git di firmare sempre un tag con annotazione,
dovete impostare la seguente opzione globale::

    $ git config --global tag.forceSignAnnotated true

Come usare commit firmati
-------------------------

Creare dei commit firmati è facile, ma è molto più difficile utilizzarli
nello sviluppo del kernel linux per via del fatto che ci si affida alle
liste di discussione e questo modo di procedere non mantiene le firme PGP
nei commit. In aggiunta, quando si usa *rebase* nel proprio repositorio
locale per allinearsi al kernel anche le proprie firme PGP verranno scartate.
Per questo motivo, la maggior parte degli sviluppatori del kernel non si
preoccupano troppo di firmare i propri commit ed ignoreranno quelli firmati
che si trovano in altri repositori usati per il proprio lavoro.

Tuttavia, se avete il vostro repositorio di lavoro disponibile al pubblico
su un qualche servizio di hosting git (kernel.org, infradead.org, ozlabs.org,
o altri), allora la raccomandazione è di firmare tutti i vostri commit
anche se gli sviluppatori non ne beneficeranno direttamente.

Vi raccomandiamo di farlo per i seguenti motivi:

1. Se dovesse mai esserci la necessità di fare delle analisi forensi o
   tracciare la provenienza di un codice, anche sorgenti mantenuti
   esternamente che hanno firme PGP sui commit avranno un certo valore a
   questo scopo.
2. Se dovesse mai capitarvi di clonare il vostro repositorio locale (per
   esempio dopo un danneggiamento del disco), la firma vi permetterà di
   verificare l'integrità del repositorio prima di riprendere il lavoro.
3. Se qualcuno volesse usare *cherry-pick* sui vostri commit, allora la firma
   permetterà di verificare l'integrità dei commit prima di applicarli.

Creare commit firmati
~~~~~~~~~~~~~~~~~~~~~

Per creare un commit firmato, dovete solamente aggiungere l'opzione ``-S``
al comando ``git commit`` (si usa la lettera maiuscola per evitare
conflitti con un'altra opzione)::

    $ git commit -S

Configurare git per firmare sempre i commit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Potete dire a git di firmare sempre i commit::

    git config --global commit.gpgSign true

.. note::

    Assicuratevi di aver configurato ``gpg-agent`` prima di abilitare
    questa opzione.

.. _it_verify_identities:

Come lavorare con patch firmate
-------------------------------

Esiste la possibilità di usare la vostra chiave PGP per firmare le patch che
invierete alla liste di discussione del kernel. I meccanismi esistenti per la
firma delle email (PGP-Mime o PGP-inline) tendono a causare problemi
nell'attività di revisione del codice. Si suggerisce, invece, di utilizare lo
strumento sviluppato da kernel.org che mette nell'intestazione del messaggio
un'attestazione delle firme crittografiche (tipo DKIM):

- `Patatt Patch Attestation`_

.. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/

Installare e configurate patatt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Lo strumento patatt è disponibile per diverse distribuzioni, dunque cercatelo
prima lì. Oppure potete installarlo usano pypi "``pip install patatt``"

Se avete già configurato git con la vostra chiave PGP (usando
``user.signingKey``), allora patatt non ha bisogno di alcuna configurazione
aggiuntiva. Potete iniziare a firmare le vostre patch aggiungendo un aggancio a
git-send-email nel vostro repositorio::

    patatt install-hook

Ora, qualsiasi patch che invierete con ``git send-email`` verrà automaticamente
firmata usando la vostra firma crittografica.

Verificare le firme di patatt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Se usate ``b4`` per verificare ed applicare le patch, allora tenterà
automaticamente di verificare tutte le firme DKIM e patatt disponibili. Per
esempio::

    $ b4 am [email protected]
    [...]
    Checking attestation on all messages, may take a moment...
    ---
      ✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers
      ✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall
      ✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls
      ---
      ✓ Signed: openpgp/[email protected]
      ✓ Signed: DKIM/kernel.org

.. note::

   Lo sviluppo di patatt e b4 è piuttosto attivo. Si consiglia di verificare la
   documentazione più recente.

.. _it_kernel_identities:

개발자 identity와 trust 검증

855-941

서명이 수학적으로 유효하다는 사실만으로 그 key가 실제 커널 개발자의 것임을 증명할 수는 없다. 공격자가 같은 이름과 이메일로 새 key를 만들 수 있으므로, public key 획득 경로와 identity binding을 검증해야 한다.

다른 개발자 public key collection이 충분하지 않다면 GnuPG의 자동 발견을 이용할 수 있다. WKD와 DANE는 각각 TLS와 DNSSEC이라는 위임된 신뢰 기술을 통해 public key를 찾고 가져온다.

# ~/.gnupg/gpg.conf
auto-key-locate wkd,dane,local
auto-key-retrieve

DANE는 public key를 DNS에 게시하고 DNSSEC-signed zone으로 보호한다. WKD는 HTTPS 조회를 사용한다. GnuPG는 자동으로 가져온 key를 local keyring에 추가하기 전에 DANE에서는 DNSSEC을, WKD에서는 TLS certificate를 검증한다.

kernel.org는 계정이 있는 모든 개발자의 WKD를 게시한다. 설정 뒤 Linus Torvalds와 Greg Kroah-Hartman의 key를 이메일 주소로 찾을 수 있다. kernel.org 계정이 있다면 자신의 key에 kernel.org UID를 추가해 다른 개발자의 WKD 검색을 돕는다.

$ gpg --locate-keys [email protected] [email protected]

PGP의 Web of Trust는 HTTPS/TLS의 중앙 Certification Authority를 대신하려는 분산 trust delegation 방식이다. software vendor가 신뢰할 인증자를 정하는 대신 각 사용자가 누구의 인증을 신뢰할지 결정한다.

Web of Trust의 실제 운용은 이해하기 어렵다. GnuPG 2.2 이상은 대안으로 Trust on First Use를 제공한다. SSH가 첫 연결의 host key fingerprint를 기억하고 이후 변경을 경고하듯, TOFU는 처음 가져온 identity-key 연결을 기록한다.

나중에 같은 identity를 가진 다른 key가 나타나면 기존 key와 새 key를 모두 검증 대상으로 표시하고 사용자가 어느 것을 유지할지 판단하게 한다. 문서는 GnuPG v2의 새 기본값인 TOFU+PGP 결합 trust model을 권장한다.

# ~/.gnupg/gpg.conf
trust-model tofu+pgp

기존 복제형 keyserver network가 최근 수년 동안 대부분 제대로 동작하지 않게 되자 kernel.org는 개발자 public key를 모은 Git repository를 운영한다. 이 저장소를 public key source로 구성하는 전체 절차는 Kernel developer PGP Keyring 문서에 있다.

커널 개발자라면 다른 개발자가 자신의 서명을 검증할 수 있도록 해당 keyring에 public key를 제출하는 것을 검토한다.

Come verificare l'identità degli sviluppatori del kernel
========================================================

Firmare i tag e i commit è facile, ma come si fa a verificare che la chiave
usata per firmare qualcosa appartenga davvero allo sviluppatore e non ad un
impostore?

Configurare l'auto-key-retrieval usando WKD e DANE
--------------------------------------------------

Se non siete ancora in possesso di una vasta collezione di chiavi pubbliche
di altri sviluppatori, allora potreste iniziare il vostro portachiavi
affidandovi ai servizi di auto-scoperta e auto-recupero. GnuPG può affidarsi
ad altre tecnologie di delega della fiducia, come DNSSEC e TLS, per sostenervi
nel caso in cui iniziare una propria rete di fiducia da zero sia troppo
scoraggiante.

Aggiungete il seguente testo al vostro file ``~/.gnupg/gpg.conf``::

    auto-key-locate wkd,dane,local
    auto-key-retrieve

La *DNS-Based Authentication of Named Entities* ("DANE") è un metodo
per la pubblicazione di chiavi pubbliche su DNS e per renderle sicure usando
zone firmate con DNSSEC. Il *Web Key Directory* ("WKD") è un metodo
alternativo che usa https a scopo di ricerca. Quando si usano DANE o WKD
per la ricerca di chiavi pubbliche, GnuPG validerà i certificati DNSSEC o TLS
prima di aggiungere al vostro portachiavi locale le eventuali chiavi trovate.

Kernel.org pubblica la WKD per tutti gli sviluppatori che hanno un account
kernel.org. Una volta che avete applicato le modifiche al file ``gpg.conf``,
potrete auto-recuperare le chiavi di Linus Torvalds e Greg Kroah-Hartman
(se non le avete già)::

    $ gpg --locate-keys [email protected] [email protected]

Se avete un account kernel.org, al fine di rendere più utile l'uso di WKD
da parte di altri sviluppatori del kernel, dovreste `aggiungere alla vostra
chiave lo UID di kernel.org`_.

.. _`aggiungere alla vostra chiave lo UID di kernel.org`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key

Web of Trust (WOT) o Trust on First Use (TOFU)
----------------------------------------------

PGP incorpora un meccanismo di delega della fiducia conosciuto come
"Web of Trust". Di base, questo è un tentativo di sostituire la necessità
di un'autorità certificativa centralizzata tipica del mondo HTTPS/TLS.
Invece di avere svariati produttori software che decidono chi dovrebbero
essere le entità di certificazione di cui dovreste fidarvi, PGP lascia
la responsabilità ad ogni singolo utente.

Sfortunatamente, solo poche persone capiscono come funziona la rete di fiducia.
Nonostante sia un importante aspetto della specifica OpenPGP, recentemente
le versioni di GnuPG (2.2 e successive) hanno implementato un meccanisco
alternativo chiamato "Trust on First Use" (TOFU). Potete pensare a TOFU come
"ad un approccio all fidicia simile ad SSH". In SSH, la prima volta che vi
connettete ad un sistema remoto, l'impronta digitale della chiave viene
registrata e ricordata. Se la chiave dovesse cambiare in futuro, il programma
SSH vi avviserà e si rifiuterà di connettersi, obbligandovi a prendere una
decisione circa la fiducia che riponete nella nuova chiave. In modo simile,
la prima volta che importate la chiave PGP di qualcuno, si assume sia valida.
Se ad un certo punto GnuPG trova un'altra chiave con la stessa identità,
entrambe, la vecchia e la nuova, verranno segnate come invalide e dovrete
verificare manualmente quale tenere.

Vi raccomandiamo di usare il meccanisco TOFU+PGP (che è la nuova configurazione
di base di GnuPG v2). Per farlo, aggiungete (o modificate) l'impostazione
``trust-model`` in ``~/.gnupg/gpg.conf``::

    trust-model tofu+pgp

Usare il repositorio kernel.org per il web of trust
---------------------------------------------------

Il progetto kernel.org mantiene un repositorio git con le chiavi pubbliche degli sviluppatori in alternativa alla replica dei server di chiavi che negli ultimi anni sono spariti. La documentazione completa su come impostare il repositorio come vostra sorgente di chiavi pubbliche può essere trovato qui:

- `Kernel developer PGP Keyring`_

Se siete uno sviluppatore del kernel, per favore valutate l'idea di inviare la
vostra chiave per l'inclusione in quel portachiavi.


If you are a kernel developer, please consider submitting your key for
inclusion into that keyring.

.. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html