Linux in Viaggio Copertina Recens. Libro

Articoli


PGP: gestiamoci le chiavi

Nello scorso numero abbiamo visto cos'è il PGP, abbiamo creato la nostra chiave e provato ad usarlo nella posta elettronica. Vediamo adesso come gestire le chiavi pubbliche e cosa significa ``firmarle''.

Il punto debole del PGP: la chiave pubblica

PGP serve ad autenticare i messaggi scritti da una persona. Come fa il destinatario (o i destinatari) ad essere sicuro di avere la giusta chiave pubblica? Non sempre è possibile riceverla personalmente.

Può succedere, infatti, che una chiave pubblica venga sostituita prima di essere distribuita con quella di una persona capace di intercettare e sostituire anche i messaggi del proprietario originale, facendosi quindi a tutti gli effetti passare per lui. Un po' complicato, vediamolo in pratica.

A crea la sua chiave pubblica e la mette in rete. B riesce ad intercettarla e sostituirla subito con un'altra fatta da lui ma dichiarata appartenente ad A.

B quindi intercetta i messaggi firmati da A, eventualmente li altera e li rifirma. Il destinatario non se ne accorge, perché ha prelevato una chiave credendola di A e in effetti per lui è tale (verifica correttamente i messaggi che crede arrivino da A).

Proprio per evitare questo, PGP mette a disposizione un potente mezzo per autenticare le chiavi.

Verificare il fingerprint

Il fingerprint è in pratica un ``riassunto'' della chiave pubblica. È composto da 16 cifre esadecimali (128 bit) e risulta quindi semplice da stampare e/o comunicare per telefono. Ovviamente non si accettano ``fingerprint dagli sconosciuti''. Cioè non si verifica una chiave accettando un foglietto o da una telefonata qualsiasi: bisogna accertarsi dell'identità di chi comunica il proprio fingerprint, quindi tramite una tessera di riconoscimento se di persona, oppure riconoscendo la voce se per telefono. Ai ``PGP party'', di solito, si autentica una chiave solo dietro presentazione della propria carta d'identità.

Per vedere il fingerprint della propria chiave o di una chiave presente nel proprio ``portachiavi'', si usa il comando:
tizio@host:~$ pgp -kvc utente

utente è facoltativo, e permette di limitare il listato alle chiavi che contengono quella stringa nello userID. Un altro parametro utile è il file contenente le chiavi: infatti è possibile gestire più portachiavi.

I comandi per estrarre ed inserire le chiavi li ho già mostrati:

pgp -kx utente filedest       Estrae la chiave di un utente in un file
pgp -kxa utente filedest      Estrae la chiave in formato ascii (comodo
                              per spedirlo in un messaggio email)
pgp -kxaf utente              Estrae su stdout

pgp -ka nomefile              Inserisce la/le chiave/i presenti in un file
pgp -kaf                      Inserisce la chiave da stdin

Firmare le chiavi pubbliche

Detta fin qui sembra che bisogna complicarsi con moltissime autenticazioni prima di essere sicuri di una chiave pubblica, e la cosa più difficile è che non ci si può fidare di una telefonata se non si può riconoscere la voce.

PGP possiede un metodo per semplificare tutto questo: una chiave pubblica può essere firmata da altre chiavi, e garantire la sua autenticità se si verifica anche una sola delle chiavi che hanno firmato. Rivediamo un attimo come funziona.

A crea la sua chiave, e la verifica correttamente con B. B quindi firma la chiave pubblica di A, e gliela restituisce.

C ha la chiave pubblica di B correttamente verificata, e preleva dalla rete la chiave di A firmata da B. La questione adesso non è più sull'autenticità della chiave pubblica di A, ma sulla fiducia dell'operato di B (infatti C è certo di avere la chiave di B, e questa chiave conferma la validità della chiave di A, ma quest'ultima non è stata ricevuta direttamente dalle mani di A).

La questione adesso diventa: B ha firmato la vera chiave di A?

Infatti una delle domande che fa PGP quando si include una nuova chiave, è proprio ``Ci si può fidare di questa chiave per autenticare chiavi firmate da questa?''. Naturalmente la chiave di A può essere firmata da più persone, quindi quando C la recupera da rete (un canale insicuro), può avere più possibilità di riscontrarne l'autenticità.

Durante l'inserimento di una nuova chiave, PGP chiede se la si vuole autenticare. Ovviamente la si autentifica solo se si è in possesso di informazioni sufficienti, tipo un foglietto con il fingerprint consegnato a mano dal vero possessore della chiave, oppure facendosi dettare al volo il fingerprint per telefono. Una volta verificato il fingerprint, viene chiesta la propria pass phrase per aggiungere la firma alla nuova chiave.

La firma si può sempre fare successivamente se non si può verificare subito la chiave. Questa resta pur sempre valida, anche se apparirà un avviso che la chiave non è verificata tutte le volte che verrà usata. Questo per sicurezza: in fondo si è preso una chiave, ma non si è certi di chi sia.

Per firmare e togliere le firme ad una chiave, i comandi sono:

pgp -ks altroutente           Firma una chiave
pgp -krs utente               Elimina una firma da una chiave
pgp -kvc utente               Mostra alcune informazioni (fingerprint)
pgp -kvv utente               Mostra i firmatari di una chiave
pgp -kvcv utente              Informazioni e firmatari di una chiave

Un comando utile è ``pgp -ke utente'', che permette di verificare il grado di autenticità di una chiave. Ogni chiave infatti può essere valida perché verificata direttamente, o grazie ad un'altra firma più o meno valida. Permette anche di modificare il ``grado di fiducia'' che ha una certa chiave nei confronti di altre chiavi firmate da questa. Premendo [Invio] si mantiene inalterato lo stato della chiave.

Lo stesso comando permette anche di cambiare la propria pass phrase o aggiungere altri identificativi alla propria chiave (usando come userID quello della propria chiave): quando è necessario criptare un messaggio, viene cercata la chiave che ha l'email di destinazione come user-id. Chi ha più di un indirizzo email deve aggiungerli alla propria chiave con questo comando e digitare Y alla richiesta di aggiungere un altro userID.

Gestire più portachiavi

Normalmente l'aggiunta di chiavi viene eseguita sul portachiavi di default, che in Linux si trova in $HOME/.pgp/pubring.pgp.

Però quasi tutti (ma forse tutti) i comandi di PGP permettono di specificare un file alternativo in cui cercare e/o aggiornare le chiavi. Questo file va dato come ultimo parametro, e alla fin fine la gestione è identica a quella del portachiavi di default.

La cosa interessante è che si possono tenere alcune chiavi in portachiavi separati, e scambiarsele con facilità. Si può anche includere un intero portachiavi nel proprio portachiavi di default con ``pgp -ka file''. Le chiavi già presenti non vengono duplicate, e se ci sono nuove firme vengono aggiunte in automatico.

Se volete recuperare un po' di chiavi e fare delle prove, trovate un portachiavi con un po' di chiavi di plutini nei mirror del Pluto, nella directory pluto/pluto-keyring.pgp, e le chiavi degli sviluppatori Debian nei mirror Debian, sotto la directory doc.

Firmiamo e verifichiamo un testo

Vediamo un attimo quali sono le operazioni semplici per usare PGP per firmare un file di testo esternamente a PGP. La cosa più semplice e portabile è quella di avere un unico file di uscita, possibilmente leggibile (ovvero non in binario criptico) e verificabile al volo.

Dato quindi un file di testo, ad esempio messaggio, si può ottenere un altro file di testo con lo stesso messaggio e una firma allegata tramite il comando:
tizio@host:~$ pgp +clearsig=on -ast messaggio -o messaggio.pgp

Otterrete quindi il file messaggio.pgp contenente il testo firmato (ovviamente chiede la pass phrase). Potete spedirlo ovunque, e solo se non verrà modificato, tutti i possessori della chiave pubblica potranno verificarlo ed essere certi che l'autore è tizio. Magari vi conviene fare uno script, comunque questa riga la trovate in /usr/lib/pinepgp/sign (se non avete Debian, procuratevi il pacchetto sorgente di pinepgp).

Per verificare la firma contenuta in un file, il modo più semplice è:
tizio@host:~$ pgp nomefile

Normalmente estrae il contenuto testuale, eventualmente chiede se sovrascrivere il file di origine, e mostra il risultato della firma (se valida o no). Dando l'opzione ``-f'' (uso di pipe) potete mandare il file originale in stdin, ottenere il testo decodificato in stdout e lo stato della decodifica in stderr. Su quest'ultimo è scritto se la firma è valida, non valida, manca la chiave, la chiave non è autenticata.

Con questo articolo ho finito di descrivere i passi di base di PGP, sapendo creare le chiavi e gestendo le firme delle stesse, l'uso vero e proprio per firmare messaggi è spesso gestito automaticamente dal programma di posta. Con il comando ``pgp -h'' potete vedere molte altre opzioni di pgp.

di Michele Dalla Silvestra


Linux in Viaggio Copertina Recens. Libro