
Sicurezza prima di tutto. Difenditi con OpenSSL
La guida definitiva all’uso del più potente sistema di cifratura che ti permette di tenere sempre al sicuro i dati e comunicare senza la paura di essere spiati
(pagina 3 di 4)
TranSport Layer Security
Il protocollo SSL si evolve ancora
Possiamo definire TLS l’evoluzione di SSL, anche questo,
infatti, utilizza un sistema di cifratura per creare connessioni
sicure via rete. Le differenze con il predecessore sono
poche e il concetto di base rimane uguale. In pratica, anche
lo scopo di questo protocollo è quello di evitare che vi siano
possibilità di instaurare una comunicazione non sicura e
che i dati possano essere letti da altri all’infuori del client e
del server che operano la transazione.
Cosa si può fare con openSSL
L’utility openssl, che fa parte del pacchetto, è una semplice
interfaccia
alla libreria stessa che, tramite riga di comando, permette di fare
moltissime cose interessanti, come la creazione di chiavi RSA, DH
o DSA, la creazione di certificati X.509 o CSR o CRL, il calcolo di
un digest di un messaggio, la cifratura o decifratura di file
utilizzando
uno dei vari cipher, il test di comunicazione client server utilizzando
il protocollo SSL o TLS e non ultima la gestione di e-mail firmate o
cifrate. Alcuni dei nomi o delle sigle appena citate sono molto comuni
a tutti gli utilizzatori di sistemi GNU/Linux e di Internet, visto che
tutti
le avranno sentite almeno una volta, ma nel caso in cui vi siano alcuni
dubbi si può consultare il box specifico.
 |
OpenSSL è presente tra i software di default |
 |
Tutte le informazioni relative alla versione |
Quanti comandi!
Il comando openssl permette, quindi, di gestire una notevole quantità
di operazioni di cifratura, alcune delle quali molto complesse,
pertanto è facile supporre che metta a disposizione una grande quantità
di comandi all’utente. Esistono diversi modi per poter conoscere
l’elenco completo di tutti i comandi e delle loro relativi sintassi;
il primo posto dove guardare è sicuramente la pagina del manuale
relativo, ottenibile eseguendo man openssl, ma è anche possibile
ottenere informazioni specifiche direttamente da linea di comando.
Ad esempio digitando gli pseudo-comandi (ovvero i comandi che
seguono il nome dell’applicativo stesso) list-standard-commands
o list-message-digest-commands e list-cipher-commands si avrà
in output una lista (con ogni comando per singola riga) contenente
i nomi di tutti i comandi specifici relativi alla sezione indicata (comandi,
digest e cipher) che sono presenti nella versione OpenSSL
installata. Per una lettura semplificata può anche essere ridirezionato
l’output su di un file di testo:
openssl list-standard-commands > elenco_comandi
È importante comprendere che non tutte le versioni installate sulle
varie
distro conterranno tutti i comandi possibili, visto che la stessa
utility
può essere liberamente configurata al momento della sua compilazione,
anche se, molto probabilmente, le differenze saranno minime. Esiste
anche un piccolo trucco, per ottenere più informazioni, non disponendo
OpenSSL del tipico comando -help, ed è quello di digitare uno pseudo
comando sbagliato, come ad esempio:
openssl aiuto
e poiché il comando di aiuto non verrà interpretato, sarà lo stesso applicativo a fornire un elenco dei comandi corretti.
Come funziona TLS
Dall’algoritmo alle chiavi di cifratura
Il funzionamento di TLS prevede tre passaggi. Per prima
cosa il client e il server “negoziano” l’algoritmo (cipher)
da usare per la cifratura dei dati. Subito dopo vengono
scambiate le chiavi ed eseguita l’autenticazione. Infine, si
procede con la cifratura mediante il cipher e la conseguente
autenticazione dei dati. È proprio durante la prima fase che
vengono scelti tra il client ed il server i cipher impiegati per
lo scambio delle chiavi e per la successiva autenticazione.
Tipi di autenticazione
Mutua o server a seconda della situazione
Generalmente, quindi nell’uso quotidiano, la connessione
sicura è quella verso un server autenticato, ovvero di cui
si è certi della sua identità e dove il client rimane invece
ignoto. Il livello superiore è chiamato “mutua autenticazione”
e richiede che entrambi i partecipanti siano autenticati
e definiti. Generalmente la mutua autenticazione richiede
l’uso di chiavi pubbliche che permettano di instaurare questo
speciale rapporto.
Un po’ di esempi pratici
Dopo aver visto il nutrito elenco di comandi messi a disposizione
dalla suite OpenSSL è arrivato il momento di gettarsi nella pratica,
partendo logicamente dagli aspetti più semplici (dal punto di vista
dell’utilizzatore) e anche più comuni. Il primo passo è quindi quello
di calcolare il digest di un file, una operazione estremamente comune
quando ad esempio si scarica un file da Internet e prima di
usarlo se ne vuole verificare l’autenticità. I digest più comunemente
utilizzati su Internet sono l’MD5 e l’SHA1, sebbene OpenSSL sia in
grado di gestirne un numero maggiore (l’elenco dei quali è ottenibile
digitando openssl list-message-digest-commands). Per creare un
digest MD5 di un file basta eseguire:
openssl dgst -md5 file_da_calcolare
In maniera analoga, per utilizzare altri algoritmi, basta sostituire
-md5 con l’opportuno comando. A questo punto non rimane che verificare
l’output con quello pubblicato dal creatore del file per essere
certi che esso non sia stato modificato e che quindi possa essere usato
in totale tranquillità. Il passo successivo consiste nell’utilizzare
la potenza di OpenSSL per cifrare e decifrare file o documenti; procedura
utilissima per salvaguardare al massimo la propria privacy e
per mettere al sicuro i dati sensibili. Gli scenari possibili di utilizzo
sono infiniti, dalla cifratura di documenti su chiavi USB e quindi potenzialmente
smarribili, alla conservazione su dischi pubblici di dati
personali. Qualunque sia il proprio caso, la procedura è facilissima;
per prima cosa è necessario scegliere, tra i tanti messi a disposizione,
il cipher che si desidera utilizzare (l’elenco completo come
detto è ottenibile con lo pseudo comando list-cipher-commands) e
digitare:
openssl enc -e -des3 -salt -in file_
da_cifrare.txt -out file_cifrato
Il comando è formattato indicando lo pseudo-comando enc per eseguire
la cifratura, seguito dal cipher, che in questo esempio è il des3.
Lo switch -salt va sempre attivato (a patto di disporre almeno di una
versione di OpenSSL 0.9.5 o superiore) per impiegare delle routine
di derivazioni particolari e, infine, gli switch -in e -out servono per
indicare il file di ingresso e quello cifrato. Può anche essere una buona
norma utilizzare una propria estensione per i file cifrati (ad esempio
file_cifrato.des3), in modo da poterli riconoscere più facilmente e per
utilizzarli in maniera corretta. Una volta premuto Invio, openssl richiederà,
per due volte, di digitare la password con cui cifrare il file (la
seconda richiesta è necessaria per verificare che la password sia proprio
quella che si desidera impostare) e nel giro di poco tempo (dipende
logicamente dalle dimensioni del file) verrà creato il file binario cifrato.
Il file binario potrà quindi essere messo ovunque, certi che i dati al
suo interno non potranno essere estratti a meno di non conoscerne la
password e il cipher. Proprio per questo, è bene non limitarsi a digitare
come password il proprio nome o la propria data di nascita ma utilizzare
quelle comuni norme di sicurezza che consigliano di usare password
mediamente lunghe, contenenti caratteri speciali come @#!$? e numeri;
in modo da rendere il più possibile difficile l’eventuale decifratura
del file. Per eseguire la riconversione del file da cifrato a normale sarà
sufficiente ricordarsi della password e del cipher utilizzato e sostituire
lo switch -e (per cifrare) con -d:
openssl enc -d -des3 -salt -in file_cifrato
-out file_decifrato.txt
Nel caso in cui si voglia spedire il file via e-mail è necessario invece
formattarlo in modo ben specifico ovvero utilizzando la modalità base64
specificata con lo switch -a; quindi, ad esempio per cifrare un file utilizzando il Blowfish in base 64 basta digitare:
openssl bf -a -salt -in file_da_cifrare.txt
-file_cifrato.bf
L’estensione qui indicata per il file cifrato ci permette di ricordare più
facilmente il tipo di cipher impiegato (Blowfish) anche se, per la massima
sicurezza, sarebbe opportuno evitare di dare informazioni preziose
al potenziale decriptatore abusivo. Un passo ulteriore può essere quello
di creare archivi di intere directory integralmente cifrati in modo da
poterli registrare su CD/DVD senza aver più paura di smarrirli. Il modo
più semplice è quello di utilizzare il comando tar (usato per la creazione
di archivi, anche compressi) e di far elaborare il tutto da OpenSSL
in maniera automatica, appoggiandosi infine al comando dd per la creazione
del file finale. Più difficile a dirsi che a farsi:
tar -zcvf – cartella_da_cifrare |openssl
des3 -salt -k parola_chiave | dd of=cartella.des
Il comando openssl è molto simile a quelli già visti in precedenza, con
solo in più lo switch -k per passare direttamente la password da impiegare,
procedura necessaria perché l’archivio verrà creato in automatico
e quindi non in modalità interattiva. La decompressione avviene di
conseguenza digitando:
dd if=cartella.des |openssl des3 -d -k
parola_chiave|tar zxf -
Da non dimenticare, in entrambi i casi, il segno – (meno) al fondo del comando tar che gli indica di comprimere e ecomprimere tutto ciò che gli verrà passato.
 |
L’elenco dei comandi di OpenSSL |
 |
Cifratura e decifratura di un file |
 |
Il test di velocità dei vari algoritmi |
Aggiornamenti delicati
Rendono OpenSSL ancora più sicuro
Vista l’importanza strategica della cifratura, sia che si operi
su file locali e maggiormente nel caso in cui la si utilizzi per
stabilire connessioni protette via Internet, è bene sempre
tenere aggiornata la propria versione di OpenSSL. Per cui
attenzione ad utilizzare bene i programmi di aggiornamento
rilasciati con la propria distro ed essere sempre pronti ad
utilizzare ogni patch di sicurezza.
Uno sguardo alle prestazioni
Quando si devono cifrare grandi archivi, ci si rende conto che il
tempo impiegato può allungarsi rispetto alla pura e semplice creazione
dell’archivio stesso. La cosa è più che logica, visto che tutti
i dati debbono essere processati da OpenSSL prima di finire su disco;
ma il fatto meno noto è che non tutti gli algoritmi di cifratura
sono ugualmente veloci. Allora cosa bisogna fare per scoprire qual
è quello più adatto da utilizzare ? Fortunatamente esiste un apposito
pseudo comando che provvede a calcolare la velocità dei singoli
cipher e quindi, in base alle prestazioni della propria macchina,
scegliere quello più opportuno. Per eseguire l’algoritmo per il calcolo
della velocità basta eseguire il comando riportato di seguito,
senza argomenti aggiuntivi:
openssl speed
Una volta premuto Invio, openssl provvederà a testare tutti i motori
disponibili rendendo quindi possibile scoprire quali siano
i più veloci e quali invece vadano scartati quando si lavora su
grandi archivi. L’analisi che viene compiuta e che impiegherà un
po’ di tempo, provvede a cifrare dati, utilizzando singolarmente
i vari algoritmi, per un ben determinato periodo di tempo (che è
di 3 secondi). Il risultato sarà il numero di volte in cui la cifratura
avrà avuto successo in quel lasso di tempo. Quindi maggiore
sarà il numero, più veloce sarà l’algoritmo. Il software mostrerà
interattivamente i risultati specificando algoritmo usato, tempo e
dimensioni del blocco su cui opera e i risultati vengono elencati
sulla singola linea. Alla fine, verrà presentato un chiaro report con
l’elenco completo e le singole prestazioni con cui poter attentamente
valutare la scelta. Infine, una volta scelto un algoritmo è
anche possibile verificarne le prestazioni (magari su di un altro
computer e senza testarli nuovamente tutti) indicandolo dopo lo
pseudo comando speed, ad esempio:
openssl speed md5
Testare un web Server https
Attraverso lo pseudo comando s_client si possono direttamente stabilire
connessioni a server sicuri attraverso l’uso del protocollo SSL, una funzione
ideale per quando si sta installando un server SSL e lo si vuole provare in
maniera estensiva, ma anche molto interessante per imparare alcune cose
sulla gestione della sicurezza dei sistemi. Per prima cosa bisogna stabilire la
connessione eseguendo il comando riportato di seguito:
openssl s_client -connect nome_del_server:443
Dopo i due punti viene indicata la porta che in questo caso è la 443, ovvero
quella che viene utilizzata quando il browser interpreta il protocollo https.
Una volta premuto Invio, se la connessione avrà successo, dopo aver visto
l’elenco dei certificati e varie altre informazioni si potrà agire manualmente
e scaricare le pagine web digitando semplicemente il comando GET /.
 |
Con l’interfaccia TinyCA tutto è più facile |
 |
Gli aggiornamenti sono indispensabili |
Gestire i certificati graficamente
La creazione e la gestione dei certificati può essere un po’ ostica se si
decide di operare solamente da riga di comando, ma per fortuna, come
sempre, la comunità Open Source provvede a porre rimedio. Esiste infatti
una pratica e semplice interfaccia grafica, chiamata TinyCA (http://
freshmeat.net/projects/tinyca) che permette di gestire una piccola authority
per amministrare certificati (una small CA per usare il termine
inglese). TinyCa è scritto in linguaggio Perl con le estensioni Gtk ed è
anche lui presente in molte distribuzioni; attraverso questo software, che
agisce proprio come front-end verso OpenSSL, è possibile gestire certificati x509 ed esportarli in formato PEM o DER solo ed esclusivamente
utilizzando l’interfaccia grafica. Questi ultimi sono due tra i più comuni
formati per archiviare i certificati, il primo, PEM (Privacy Enhanced
Mail) mentre il secondo, DER, è l’acronimo di Definite Encoding Rules.
Senza entrare nel merito della creazione dei certificati, che è di per se
una procedura abbastanza complessa, è importante sapere che con questa
utility è possibile rendere il processo molto più rapido e facile e creare
così certificati utilizzabili su piattaforme Apache, Postfix, OpenLDAP,
Cyrus, FreeS/WAN, OpenVPN, OpenSWAN FreeRadius, senza contare
l’impiego degli stessi anche con Netscape e Konqueror.
Uso della cifratura
Ecco cosa dice la legge a questo proposito
Alcuni algoritmi potrebbero essere coperti da brevetti e
logicamente la responsabilità del loro uso improprio ricade
sull’utilizzatore, quindi, prima di impiegarli è bene verificare che essi non siano coperti da alcun tipo di brevetto nel
proprio paese o quali siano le regole per poterli utilizzare.
Sul sito di OpenSSL (www.openssl.org) vi sono disponibili
informazioni su questo argomento, compreso un elenco
di alcuni algoritmi coperti da brevetti con i link ai relativi
proprietari. Inoltre, il sito spiega anche alcuni importanti
aspetti legali relativi all’uso della cifratura e del suo impiego
nei singoli paesi per potersi muovere nella più completa
legalità.
I termini di openSSL
Per capire meglio questo sistema di cifratura
Cipher: il metodo con cui viene cifrato un testo. Digest: la
rappresentazione di un testo sotto forma di una sola linea di
numeri creata utilizzando una funzione chiamata one-way
hash. Hash: indica un numero generato da una funzione di
hash; tale valore può essere solo generato, cioè non è possibile
risalire da esso al contenuto del file da cui è stato creato.
Poiché tale numero cambia radicalmente anche con una
piccola modifica del file originale è praticamente impossibile
cambiare il file originale mantenendo inalterato il digest.
MD5: (Message Digest algorithm 5) è uno degli hash a 128bit
più usati per la cifratura. Il risultato è un numero formato
da 32 caratteri esadecimali (numeri da 0 a 9 e lettere da A a
F). SHA: con Secure Hash Algorithm si indicano 5 funzioni di
cifratura; anche in questo caso servono per calcolare un numero
fisso partendo da un input specifico come, ad esempio,
un file. Gli algoritmi sono noti con le sigle SHA-1, SHA-224,
SHA-256, SHA-384, e SHA-512. La lunghezza del digest è di
160bits per SHA1, mentre per gli altri è indicata dal numero
che segue la funzione. RSA: uno dei primi algoritmi per la
cifratura a chiave pubblica. X.509: nella cifratura o meglio
nella crittografia questa sigla rappresenta uno standard per
le infrastrutture di chiavi pubbliche o PKI (Public Key Infrastructure).
Questa specifica indica il formato dei certificati
e il percorso dell’algoritmo necessario alla validazione del
certificato stesso. Certificato pubblico: il public key o anche
identity certificate (certificato di identità) è un documento che
contiene una firma digitale che viene legata in modo univoco
con una identità che specifica il nome di una persona o di
una organizzazione, l’indirizzo e altre informazioni univoche.
Viene usato per verificare che una chiave pubblica corrisponda
ad uno specifico utente.PKI: è un sistema che lega chiavi
pubbliche con le identità attraverso un certificato creato da
una autorità specifica (CA). CA: è l’autorità per i certificati, un
ente che gestisce i certificati digitali per essere utilizzati da
terze parti.