Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 | .. include:: ../disclaimer-ita.rst :Original: :ref:`Documentation/process/maintainer-pgp-guide.rst <pgpguide>` :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> .. _it_pgpguide: ========================================= La guida a PGP per manutentori del kernel ========================================= :Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org> 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: Strumenti PGP ============= Usare GnuPG v2 -------------- La vostra distribuzione potrebbe avere già installato GnuPG, dovete solo verificare che stia utilizzando la versione 2.x e non la serie 1.4 -- molte distribuzioni forniscono entrambe, di base il comando ''gpg'' invoca GnuPG v.1. Per controllate usate:: $ gpg --version | head -n1 Se visualizzate ``gpg (GnuPG) 1.4.x``, allora state usando GnuPG v.1. Provate il comando ``gpg2`` (se non lo avete, potreste aver bisogno di installare il pacchetto gnupg2):: $ gpg2 --version | head -n1 Se visualizzate ``gpg (GnuPG) 2.x.x``, allora siete pronti a partire. Questa guida assume che abbiate la versione 2.2.(o successiva) di GnuPG. Se state usando la versione 2.0, alcuni dei comandi indicati qui non funzioneranno, in questo caso considerate un aggiornamento all'ultima versione, la 2.2. Versioni di gnupg-2.1.11 e successive dovrebbero essere compatibili per gli obiettivi di questa guida. Se avete entrambi i comandi: ``gpg`` e ``gpg2``, assicuratevi di utilizzare sempre la versione V2, e non quella vecchia. Per evitare errori potreste creare un alias:: $ alias gpg=gpg2 Potete mettere questa opzione nel vostro ``.bashrc`` in modo da essere sicuri. 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. Impostare un *refresh* con cronjob ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Potreste aver bisogno di rinfrescare regolarmente il vostro portachiavi in modo aggiornare le chiavi pubbliche di altre persone, lavoro che è svolto al meglio con un cronjob giornaliero:: @daily /usr/bin/gpg2 --refresh >/dev/null 2>&1 Controllate il percorso assoluto del vostro comando ``gpg`` o ``gpg2`` e usate il comando ``gpg2`` se per voi ``gpg`` corrisponde alla versione GnuPG v.1. .. _it_master_key: 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). Chiave principale o sottochiavi ------------------------------- Le sottochiavi sono chiavi PGP totalmente indipendenti, e sono collegate alla chiave principale attraverso firme certificate. È quindi importante comprendere i seguenti punti: 1. Non ci sono differenze tecniche tra la chiave principale e la sottochiave. 2. In fesa di creazione, assegniamo limitazioni funzionali ad ogni chiave assegnando capacità specifiche. 3. Una chiave PGP può avere 4 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 4. Una singola chiave può avere più capacità 5. Una sottochiave è completamente indipendente dalla chiave principale. Un messaggio criptato con la sottochiave non può essere decrittato con quella principale. Se perdete la vostra sottochiave privata, non può essere rigenerata in nessun modo da quella principale. La chiave con capacità **[C]** (certify) è identificata come la chiave principale perché è l'unica che può essere usata per indicare la relazione con altre 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 data di termine di sé stessa o di ogni sottochiave - 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 madre che porta sia la capacità di certificazione che quella di firma (**[SC]**) - Una sottochiave separata con capacità di criptaggio (**[E]**) Se avete usato i parametri di base per generare la vostra chiave, quello sarà il risultato. Potete verificarlo utilizzando ``gpg --list-secret-keys``, per esempio:: sec rsa2048 2018-01-23 [SC] [expires: 2020-01-23] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev <adev@kernel.org> ssb rsa2048 2018-01-23 [E] [expires: 2020-01-23] Qualsiasi chiave che abbia la capacità **[C]** è la vostra chiave madre, indipendentemente da quali altre capacità potreste averle assegnato. 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 GnuPG 2.1 e successivi supportano pienamente *Elliptic Curve Cryptography*, con la possibilità di combinare sottochiavi ECC con le tradizionali chiavi primarie RSA. Il principale vantaggio della crittografia ECC è che è molto più veloce da calcolare e crea firme più piccole se confrontate byte per byte con le chiavi RSA a più di 2048 bit. A meno che non pensiate di utilizzare un dispositivo smartcard che non supporta le operazioni ECC, vi raccomandiamo ti creare sottochiavi di firma ECC per il vostro lavoro col kernel. Se per qualche ragione preferite rimanere con sottochiavi RSA, nel comando precedente, sostituite "ed25519" con "rsa2048". In aggiunta, se avete intenzione di usare un dispositivo hardware che non supporta le chiavi ED25519 ECC, come la Nitrokey Pro o la Yubikey, allora dovreste usare "nistp256" al posto di "ed25519". 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. Un'opzione potrebbe essere quella di cambiare la passphrase della vostra chiave primaria subito dopo aver finito con paperkey. 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 rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 000000000000000000000000AAAABBBBCCCCDDDD Keygrip = 1111000000000000000000000000000000000000 uid [ultimate] Alice Dev <adev@kernel.org> sub rsa2048 2018-01-24 [E] [expires: 2020-01-24] Keygrip = 2222000000000000000000000000000000000000 sub ed25519 2018-01-24 [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# rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev <adev@kernel.org> ssb rsa2048 2018-01-24 [E] [expires: 2020-01-24] ssb ed25519 2018-01-24 [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: 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) `Su LWN c'è una buona recensione`_ dei modelli elencati qui sopra e altri. La scelta dipenderà dal costo, dalla disponibilità nella vostra area geografica e vostre considerazioni sull'hardware aperto/proprietario. Se volete usare chiavi ECC, la vostra migliore scelta sul mercato è la Nitrokey Start. .. _`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: http://www.fsij.org/doc-gnuk/ .. _`Su LWN c'è una buona recensione`: https://lwn.net/Articles/736231/ 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. 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 rsa2048/AAAABBBBCCCCDDDD created: 2018-01-23 expires: 2020-01-23 usage: SC trust: ultimate validity: ultimate ssb rsa2048/1111222233334444 created: 2018-01-23 expires: never usage: E ssb ed25519/5555666677778888 created: 2017-12-07 expires: never usage: S [ultimate] (1). Alice Dev <adev@kernel.org> 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# rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev <adev@kernel.org> ssb> rsa2048 2018-01-24 [E] [expires: 2020-01-24] ssb> ed25519 2018-01-24 [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] 2020-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 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] **IMPORTANTE**: se avete una comando dedicato per ``gpg2``, allora dovreste dire a git di usare sempre quello piuttosto che il vecchio comando ``gpg``:: $ git config --global gpg.program gpg2 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 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 torvalds@kernel.org gregkh@kernel.org 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 Come usare i keyserver in sicurezza ----------------------------------- Se ottenete l'errore "No public key" quando cercate di validate il tag di qualcuno, allora dovreste cercare quella chiave usando un keyserver. È importante tenere bene a mente che non c'è alcuna garanzia che la chiave che avete recuperato da un keyserver PGP appartenga davvero alla persona reale -- è progettato così. Dovreste usare il Web of Trust per assicurarvi che la chiave sia valida. Come mantenere il Web of Trust va oltre gli scopi di questo documento, semplicemente perché farlo come si deve richiede sia sforzi che perseveranza che tendono ad andare oltre al livello di interesse della maggior parte degli esseri umani. Qui di seguito alcuni rapidi suggerimenti per aiutarvi a ridurre il rischio di importare chiavi maligne. Primo, diciamo che avete provato ad eseguire ``git verify-tag`` ma restituisce un errore dicendo che la chiave non è stata trovata:: $ git verify-tag sunxi-fixes-for-4.15-2 gpg: Signature made Sun 07 Jan 2018 10:51:55 PM EST gpg: using RSA key DA73759BF8619E484E5A3B47389A54219C0F2430 gpg: issuer "wens@...org" gpg: Can't check signature: No public key Cerchiamo nel keyserver per maggiori informazioni sull'impronta digitale della chiave (l'impronta digitale, probabilmente, appartiene ad una sottochiave, dunque non possiamo usarla direttamente senza trovare prima l'ID della chiave primaria associata ad essa):: $ gpg --search DA73759BF8619E484E5A3B47389A54219C0F2430 gpg: data source: hkp://keys.gnupg.net (1) Chen-Yu Tsai <wens@...org> 4096 bit RSA key C94035C21B4F2AEB, created: 2017-03-14, expires: 2019-03-15 Keys 1-1 of 1 for "DA73759BF8619E484E5A3B47389A54219C0F2430". Enter number(s), N)ext, or Q)uit > q Localizzate l'ID della chiave primaria, nel nostro esempio ``C94035C21B4F2AEB``. Ora visualizzate le chiavi di Linus Torvalds che avete nel vostro portachiavi:: $ gpg --list-key torvalds@kernel.org pub rsa2048 2011-09-20 [SC] ABAF11C65A2970B130ABE3C479BE3E4300411886 uid [ unknown] Linus Torvalds <torvalds@kernel.org> sub rsa2048 2011-09-20 [E] Poi, aprite il `PGP pathfinder`_. Nel campo "From", incollate l'impronta digitale della chiave di Linus Torvalds che si vede nell'output qui sopra. Nel campo "to", incollate il key-id della chiave sconosciuta che avete trovato con ``gpg --search``, e poi verificare il risultato: - `Finding paths to Linus`_ Se trovate un paio di percorsi affidabili è un buon segno circa la validità della chiave. Ora, potete aggiungerla al vostro portachiavi dal keyserver:: $ gpg --recv-key C94035C21B4F2AEB Questa procedura non è perfetta, e ovviamente state riponendo la vostra fiducia nell'amministratore del servizio *PGP Pathfinder* sperando che non sia malintenzionato (infatti, questo va contro :ref:`it_devs_not_infra`). Tuttavia, se mantenete con cura la vostra rete di fiducia sarà un deciso miglioramento rispetto alla cieca fiducia nei keyserver. .. _`PGP pathfinder`: https://pgp.cs.uu.nl/ .. _`Finding paths to Linus`: https://pgp.cs.uu.nl/paths/79BE3E4300411886/to/C94035C21B4F2AEB.html |