Home > Sicurezza & Privacy > Sicurezza con GNU GPG

Sicurezza con GNU GPG

November 12th, 2008

GNU Privacy Guard (GnuPG - d’ora in poi GPG) è un’applicazione che consente di cifrare e firmare un qualsiasi documento che può essere elaborato da un computer. GPG è rilasciato secondo la licenza GPL, e può essere usato anche a fini commerciali senza alcuna restrizione.
Installazione e configurazione

In genere quasi tutte le distribuzioni GNU/Linux installano il programma. Per verificare se è presente o meno, da terminale digitare il comando

$ gpg –version[Invio]

L’output dovrebbe essere simile al seguente:

gpg (GnuPG) 1.4.1
Copyright (C) 2005 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
Home: ~/.gnupg
Algoritmi gestiti:
A chiave pubblica: RSA, RSA-E, RSA-S, ELG-E, DSA
Cifrari: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
Compressione: Non compresso, ZIP, ZLIB, BZIP2

Controllare il numero di versione che appare a video, ed assicurarsi di utilizzare sempre l’ultima versione stabile disponibile sul sito del progetto.

Anche se alla macchina GNU/Linux accedono 10 utenti, ogni singolo utente avrà a disposizione la propria coppia di chiavi, mediante la creazione della directory utente personale che si troverà in /home/user1/.gnupg; /home/user2/.gnupg; ecc. L’utente user1 non potrà usare le chiavi di user2 (e quindi fingersi di essere user2) a meno che non conosca la parola d’ordine della chiave privata di user1

. E cosi via.
Creazione coppia di chiavi

Per creare una nuova coppia di chiavi, digitare il comando

$ gpg –gen-key[Invio]

quindi scegliere la prima voce (DSA and ElGamal) impostare la dimensione delle chiave a scelta - consiglio 2 048 o 4 096 bit; quindi inserire un nome (oppure un soprannome), l’indirizzo di posta elettronica e la parola d’ordine. La parola d’ordine (4) dovrebbe essere composta da un minimo di 7-8 caratteri, fra lettere maiuscole, minuscole e, cosa più importante, inserire anche caratteri speciali - simboli e lettere accentate. Nota importante: durante la creazione delle chiavi muovere il mouse e contemporaneamente premere tasti a caso sulla tastiera.

Effettuata la generazione delle chiavi saranno creati due file: secring.gpg e pubring.gpg. Il primo contiene le chiavi private mentre il secondo contiene le chiavi pubbliche: la propria e quelle importate. Prestare particolarmente cura al primo dei due file in quanto contiene informazioni sulla propria chiave privata. In ogni caso questo file è memorizzato in modo cifrato, per questo motivo quando si utilizza la propria chiave privata è richiesta l’immissione della parola d’ordine personale.

Si tenga presente che se si perde la propria chiave segreta o si dimentica la parola d’ordine, non sarà possibile recuperarla in alcun modo. In questi casi non è possibile decifrare/verificare digitalmente nessun documento e la chiave pubblica associata sarà dunque inutilizzabile. Se cosi non fosse la crittografia non avrebbe senso.

Per maggiore sicurezza (non si sa mai) il consiglio è di: non condividere il file secring.gpg in rete, non lasciarlo memorizzato su un computer che non è il proprio - e magari neanche su quest’ultimo. In poche parole: mai nessuno deve entrare in possesso del file secring.gpg. È difficile risalire alla propria parola d’ordine analizzando il file secring.gpg, però considerando che la sicurezza al 100% non esiste, allora è bene agire di conseguenza.

Un’efficace precauzione sarebbe quella di memorizzare questi file su di un supporto mobile - una penna USB o un semplice dischetto - ed impostare il programma in modo che quando lo si utilizza andrà a ricercare la chiave privata nel file sul supporto mobile anziché sull’hard disk - si deve modificare il file gpg.conf o options. Un altro trucco può rivelarsi molto efficace per gli amministratori di server: rinominare i file di default che usa il programma (secring.gpg, pubring.gpg e trustdb.gpg) e quindi impostare il programma in questo senso.

I comandi e le opzioni richiedono un UserID che serve ad identificare una chiave pubblica, una persona. A tal proposito, è possibile indicare come UserID il nome e cognome (o solo il cognome - soprannome), un indirizzo posta elettronica, il KeyID. Il KeyID è un identificativo univoco associato ad una chiave, ed in genere rappresenta i 64 bit meno significativi del fingerprint. Quindi il KeyID potrebbe essere: 4C5A2608 oppure in notazione esadecimale 0×4C5A2608. Inoltre, in tutti i comandi si può includere l’opzione -a per creare l’output in formato ASCII Armored (Base64).

Creata la coppia di chiavi, impartire questi comandi:

$ gpg -ao nomefile.asc –export UserID [Invio]

$ gpg -ao cert_revoca.asc –gen-revoke UserID[Invio]

La scelta di trasformare un file in codice ASCII Armored oppure no è a scelta dell’utente - in alcuni casi questa operazione è svolta dai sistemi software o hardware in modo trasparente se non l’ha fatto in modo esplicito l’utente. In generale è consigliabile utilizzare la conversione Base64, ciò evita problemi di visualizzazioni dei caratteri su sistemi differenti (GNU/Linux e Windows, GNU/Linux e Mac, e via dicendo).

Si osservi un esempio pratico per notare la differenza: creare un file di testo mediante il comando

$ vim prova.txt[Invio]

ed all’interno di questo inserire la frase “questo e’ un esempio di documento firmato e cifrato”.

Si procede alla firma e decifratura mediante

$ gpg -es -r myid prova.txt[Invio]

Poi digitare

$ less prova.txt.gpg[Invio]

e si osservi l’output di questo file:

<85>^B^N^C<9E>E#¸úµ “^P^GÿA*êÞlG£<99>Â^]Ð7Ñ^K8s^Bv<80>&die;N&^PH^U&die;<8B>-þ-¢<9F>Ý´^Z<8E>
<97>iß^EESC¯é~Rümø<82><93>Cì<88>Åü^LÜ<94>)<9A><82><92>R^C^_B<90>åÁa<8C>sms¤
r¬^PO¶^?ñ½ÄS¸<90>»~:PB@½<98>gO&y~}Ê_~ÿ<8D>æ ^C<9C>a9<87><94> p%<85><94><81>®-<85>_¦<92>
<88><82>fÖå<9E>cì<9E>·<95>÷åGÿ÷*<86>n^Oq[®Ìºz<95>:^?<^V;BXU<92>^?¥àRÃ^B¯Æ7]ö^PZ<87>sZøK¬
´[C§îez^Q1Aø^BV<87>ÿö^S·7^DHú'^A¤
ù'Z^Sð<81>âxj^GÂÏÝèñ<8F>Ä^^@[ÌD<8A>á<86>+~¶j<9E>á9òoY^<88>îã<9F>ESCs(£^Gý^V¹»S©óõUK^Bç
<9E>±<9E>öL¡ºã<9A>^Aªdîâ*JY^^U<8A>]<89>?~E.å<85>qmSó +f2çJ/^W«><92>p<85>á®<8A>jE<89>çw
^Q^C»<94>ã^Zæ<94>_0wýÙ^G<8B> ëâ<89>õ<91>^U¯^N1o<9F>1<82>^E^É<93>^Y¯ì$Æ3ÍM:^BÍ’FëïéLØ>æ^]
^TGN·<91>À<82>Öw<<92>ÙÿÈ<9A>As¬)©HL<8A>%å^VÛÇôGz»â?°>öÉ^NFAË­¿¯ø<85>^Oý,!$b<9F>^_<92>7
<8C>¸6^P<98>^D!^M_Á]gc§¶fáHÍ^^Kwmq1×E^]<96><9F>u^^u¢89Uó<88>$g#ÅE<9C><9F>^U<86>Y’.é<81>Ì
½&die;`<9B><8F><88>Ü»<9C>^_¯Ì*^_ú?^^1yl&die;^AX^AêÒ´^A<8E>Ú¬mO¯¿^U Ë^NÜ^G<99>^ç^D<83>þâ
~Í<86>«i^PÔo<85>’<9A>ÛDD4+î6<88>+^WvsÉ¢^K1²p&die;}Ì87KX½^Að<81>^L^M¹<84>æ¹ÁÔøK<95>1^G<9E>I¯
¤V<8D><84>Â^]P;êÑ¢<88><9C>_<9A>*)ÕÚDÎv<92>[^S<88>1^Uçýð^<80><8C>ÞÕC< <86>²<91>dãnó0£
<85>~^L^^.Ö^Z8
^¢<80>¼7æ<8C>^?ï<80>7ä<90>¢íc^YM@<8F>^]^U^F<88>®Ð·^Nè<9F><9F>ì^B~w<9C>[´ÖESCkÀ¦ot

Si veda adesso l'uso del formato Base64: digitare il comando

$ gpg -aes -r myid prova.txt[Invio]

e di seguito

$ less prova.txt.asc[Invio]

Il risultato in formato Base64 è

—–BEGIN PGP MESSAGE—–
Version: GnuPG v1.4.1 (GNU/Linux)
hQIOA55FI7j6tQkiEAgApBTRTx3qo3sasS6aZSOqspCDOqmNEPHBMitH7dmqiWlh
1Af1LXdd6a9FJLtmN/7sEpyw1bHQJC9FXU8P0b5TpWKhSMi5ywCnXSxJgimRRxuW
Szv60H9UeCpRizc2+kbbMKqiyc6jzrzROSbxvUCagKa2IuOi2X5A3M8Sa/wx8YoE
6BZXes2xQJTqSzeTjsrFHiTn3k1NLw6172rWGPcq5PSk3WqpBCHAIH7SSBIlU+ff
JjggcLJLJBXyhlTvJeaM+4JkLUgags3VVkxJA88cZVrc2v+f1PJYo5KzGXSKK0FR
wzFkJwRfVz1+lHf5Ry4S2AUBhl3AmgYSAaBkfOu39ggAusWwIWniGnxLbpUb2TvM
q/eDLQFsUdoScyZs9ccTUSfepfUfp4/xVleDlkJk0qzAZbahlwlYJQAGvPxeHydo
/gm5136kmZOqVnJBXcsbyi4burJheBAtFikvIqdjJyFCZsJwOiy4ptHdIi5J9xxt
S3jRTVPHhYrJ8ZYiH/0PmciBi1vSy5f8zux2zuqZm1bYlevFSoTQzcKb1QrriOTg
R10yi5PHmmiB8Rwb1HhP5ywisgf6kB0CXHZihkWUByX+r8OxQggShN25tEt+9yJK
UXOJSrhpHBmOKH4rrlxAzK6zNWsqUHdpmCQahb5znog4cvM03buZzC89puHt4qPv
t9K2AdJS8rbhV2eDsPKe+pjD4AgZCm0szMPHeLjiW07fMTu690YxMhYfSjkKjdmV
TzDqOaWCjse54FfXhzFOwjQrJOvyfaCzTIRmKeb2I0/M9/Z8jPE33DhaVvuebVz5
r9YlKu8y+LPejzeyRa7S6NR27L3S3LBsjUuVFcglJfv23IpVdFUrsc4pqIwtjSsU
sq/9MlOkX1VaprClpAbNxUwb7DOH2xc9JfuxArBldB16rGBqPql5Mto=
=yLwR
—–END PGP MESSAGE—–

Stesso file ma stavolta con firma distaccata (senza cifratura):

$ gpg -b prova.txt[Invio]

seguito da

$ less prova.txt.sig[Invio]

<88>?^C^E^@AÅnE/^_<97><8F>È^Dþ<^Q^B^MM^@<9E>2Möì½<9A>ÌU<9C>Uñ^?k°L”¯é^K¡^@<9E>!µ<82>7l
<97>>^CõÎÙ.<88> <89><9D>º<90>y<8B>

Creazione firma digitale separata in formato Base64:

$ gpg -ab prova.txt[Invio]

poi

$ less prova.txt.asc[Invio]

—–BEGIN PGP SIGNATURE—–
Version: GnuPG v1.4.1 (GNU/Linux)
iD8DBQBCPCmLLx+Xj8gE/jwRAi7kAJwJaKgfhbYunBlgw7ObEMVf0b5jiQCaAn6S
TH/06BwlranOrZ2NTKZP30I=
=OihD
—–END PGP SIGNATURE—–

1.12.3 Operazioni comuni

Di seguito sono illustrati i comandi di uso comune.

Cifrare e firmare un documento

$ gpg -aes -r lista UserID nomefile[Invio]

Ad esempio, digitando

$ gpg -aes -r mario letter.sxw[Invio]

si cifrerà e firmerà il file «letter.sxw» con la chiave pubblica associata all’UserID mario.

L’opzione -r richiede una o più chiavi pubbliche separate dalla virgola. Il nuovo file si chiamerà «letter.sxw.asc» (.gpg se non si include -a). La cosa importante da ricordare è che se non si include anche la propria chiave pubblica non si sarà in grado di decifrare il file, per cui nell’elenco dei destinatari dovrebbe comparire anche il proprio UserID - l’inclusione del proprio UserID può essere impostata in automatico mediante il file di configurazione.
Firmare un documento

$ gpg -as nomefile[Invio]

si otterrà un nuovo file chiamato nomefile.asc (.gpg se non si include -a).

Se si desidera separare la firma digitale dal file di origine vero e proprio, digitare il comando

$ gpg -ab nomefile[Invio]

Sarà creato il file di firma nomefile.asc (oppure con estensione .sig). In entrambi i casi è richiesta l’immissione della propria parola d’ordine personale.

In alcuni casi può essere utile firmare un documento senza applicare la compressione alla firma. Ad esempio capita di trovare messaggi firmati sui newsgroup. Questo è possibile mediante il comando

$ gpg –clearsign[Invio]
Cifrare un documento mediante un algoritmo simmetrico

Se per qualche motivo non si vuole usare il metodo a doppia chiave e si desidera cifrare il documento in modo simmetrico, bisogna usare il comando

$ gpg –cipher-algo algoritmo -ac nomefile[Invio]

sarà creato il file nomefile.gpg. Ad esempio:

$ gpg –cipher-algo twofish -ac lettera.sxw[Invio]

si è scelto di cifrare il file «lettera.sxw» con l’algoritmo simmetrico Twofish. Sarà richiesto l’inserimento di una parola d’ordine. Non dimenticare la parola d’ordine inserita altrimenti in seguito non sarà possibile decifrare il documento.
Decifrare e verificare un documento

$ gpg -o nomefile -d nomefile.gpg[Invio]

Il comando è valido per un file cifrato, per uno cifrato e firmato o per uno esclusivamente firmato.

Se nessuno ha modificato il documento apparirà (fra gli altri) il messaggio «GOOD Signature from firmatario» (oppure «Firma valida da firmatario»), altrimenti «BAD Signature from firmatario» (oppure «Firma NON corretta da firmatario»).
Verificare una firma

$ gpg –verify nomefile.sig[Invio]

A differenza del comando precedente, questo verifica la firma senza estrarre il documento di origine, ed è valido solo per i documenti firmati, senza nessuna cifratura.

Se si tratta di un documento con firma distaccata, si deve scrivere il nome del file di firma e quello del file di origine:

$ gpg –verify nomefile.sig nomefile[Invio]
Importare e validare (firmare) una chiave pubblica

Come già detto, una chiave pubblica di un proprio corrispondente per essere usata è indispensabile firmarla.
Per prima cosa è necessario essere sicuri che quella chiave pubblica è del corretto destinatario mediante la verifica dell’impronta digitale (fingerprint): importare la chiave nel portachiavi pubblico mediante

$ gpg –import nomefile.asc[Invio]

effettuare il controllo del fingerprint:

$ gpg –fingerprint UserID[Invio]

$ gpg –sign-key UserID[Invio]

Il comando chiederà la bontà della verifica sull’identità del possessore della chiave. C’è più di una possibile risposta (da 0 a 3) e digitando il carattere< ?> apparirà a video la spiegazione di ogni singolo valore.
Dopo aver firmato questa chiave la si dovrebbe esportare in modo che il possessore importi questa firma. Cosi chi la importerà a sua volta, avrà di fronte anche la propria verifica.

Questi ultimi passaggi fanno parte del concetto di web of trustGnuPG Keysigning Party HOWTO all’indirizzo . (ragnatela di fiducia). Per maggiori informazioni consultare il documento
Lista delle chiavi

Il comando

$ gpg –list-keys[Invio]

mostra la lista delle chiavi pubbliche - come già detto sono contenute nel file pubring.gpg. Mentre con

$ gpg –check-sigs[Invio]

si effettua anche la verifica. Per visualizzare le chiavi con le relative firme si può usare

$ gpg –list-sigs[Invio]
Cambiare la parola d’ordine

Per cambiare la propria parola d’ordine digitare in sequenza questi comandi:

$ gpg –edit-key UserID[Invio]

passwd[Invio]

save[Invio]

quit[Invio]
Aggiungere o eliminare UserID

Se si ha bisogno di usare due o più identità, perché ad esempio si possiedono più indirizzi di posta elettronica, è possibile aggiungere nuovi UserID alla chiave principale. Cosi facendo si evita di creare un’altra coppia di chiavi.

$ gpg –edit-key UserID[Invio]

adduid[Invio]

inserire un nome e cognome, posta elettronica quando richiesto.

save[Invio]

per confermare le modifiche.

Per eliminare un UserID, editare la chiave e servirsi del comando

uid numero[Invio]

indicando il numero desiderato, poi

deluid[Invio]

save[Invio]

per confermare le modifiche.
Cambiare lista preferenze

Per prima cosa impartire il comando

$ gpg -v –version[Invio]

si avrà cosi a disposizione un elenco con le sigle che è necessario indicare. Editare la chiave con il solito

$ gpg –edit-key UserID[Invio]

e poi in sequenza

showpref[Invio]

mostra le impostazioni attuali

setpref S3 S4 S7 S8 S9 S10 H1 H2 H3 H8 H9 H10 Z0 Z1 Z2 Z3[Invio]

updpref[Invio]

save[Invio]
Eliminare una chiave

Per cancellare una chiave pubblica digitare

$ gpg –delete-keys UserID[Invio]

mentre per una chiave segreta servirsi del comando

$ gpg –delete-secret-and-public-key UserID[Invio]
Altri comandi

$ man gpg[Invio]

oppure

$ gpg –help[Invio]

Riepilogo funzionamento programma

*

il documento del mittente viene compresso con un algoritmo di tipo zip;
*

il risultante documento compresso viene cifrato mediante l’algoritmo CAST5 - oppure un altro algoritmo, a seconda delle preferenze impostate;
*

viene generata una sequenza casuale di minimo 128 bit chiamata session key con appositi algoritmi allo scopo di ottenere una sequenza di numeri pseudo-casuali che hanno determinate proprietà statistiche - devono essere equi-probabili; come nel lancio di un dado: escono numeri da 1 a 6;
*

la session key è cifrata con l’algoritmo DSA (oppure con l’algoritmo RSA) utilizzando la chiave pubblica del destinatario ed il risultato è concatenato al documento;
*

la session key cifrata sarà concatenata al file cifrato;
*

infine, viene applicato l’algoritmo di trasformazione reversibile a testo ASCII Armored. Questo algoritmo produce un documento formato da solo caratteri compatibili con tutti i server e client di posta elettronica.

Il destinatario naturalmente, esegue i passaggi al contrario.

*

il documento del mittente viene compresso con un algoritmo di tipo zip;
*

viene calcolato l’hashing del documento compresso mediante l’algoritmo SHA-1 (oppure con uno diverso). Il codice hash generato viene cifrato tramite DSA con la chiave privata del mittente ed accodato al file di origine;
*

il file risultante dalle due operazioni precedenti viene trasformato in codice ASCII Armored;
*

il destinatario effettua le operazioni al contrario e verifica se i codici di hashing sono identici.
*
Note finali

Ricordare sempre che per ogni modifica apportata alla propria coppia di chiavi, si deve nuovamente esportare ed inviare ai propri corrispondenti la chiave pubblica aggiornata - modifica della parola d’ordine, aggiunta di UserID, ecc.

Non c’è dubbio che se si fa uso del programma in modo frequente, usarlo sempre da terminale è piuttosto noioso. A tal proposito esistono delle opportune interfacce grafiche all’uso da console. È chiaro però che i front-end non hanno la stessa potenza e completezza dei comandi e delle opzioni disponibili da terminale.

Ad esempio in KDE è presente il tool KGPG, mentre per GNOME è disponibile SeaHorse.
*

Vi sono poi molti programmi che permettono l’uso di GPG per quanto riguarda la firma digitale e crittografia. Ad esempio i client di posta elettronica: Thunderbird, KMail, Evolution. Il programma Thunderbird necessita del plug-in chiamato Enigmail ().

È consigliata la lettura, almeno una volta, delle FAQ sul GPG (http://www.gnupg.org/(it)/documentation/faqs.html).
*

Per chi desidera collaborare ad un qualsiasi progetto open source (al codice sorgente, alla documentazione, o altro), possedere una coppia di chiavi GPG è senz’altro necessario per garantire l’autenticità del mittente e l’integrità del codice (o documentazione) a cui si partecipa. È necessario anche che la propria chiave pubblica sia stata firmata da qualche partecipante del progetto.

<–adsense–>


View this Post in: English Chinese(S) Chinese(T) French Arabic Bulgarian Croatian Czech Danish Dutch Finnish German Greek Hindi Italian Japanese Korean Norwegian Polish Portuguese Romanian Russian Spanish Swedish

Sicurezza & Privacy

  1. No comments yet.
  1. No trackbacks yet.