Commenti(3)
Transazioni sicure con MySQL grazie a OpenSSL
Un interessante esperienza sulla configurazione SSL di MySQL per Windows
Gli scambi di dati che avvengono tra MySQL Server e i vari Clients possono essere intercettati e siccome viaggiano 'in chiaro', degli estranei potrebbero 'ficcare il naso' nelle nostre cose.
Un modo per impedire questo è la crittografazione delle transazioni.
Un programma Open Source che assolve questo compito è OpenSSL che utilizza la crittografia a chiave asincrona (pubblica/privata)
Per chi utilizza Windows, esiste una versione denominata Win32OpenSSL che, al momento in cui scrivo, è arrivata alla release 1.0.0c e si può scaricare da http://www.slproweb.com/products/Win32OpenSSL.html
Procedo ad elencare i passi necessari per impostare MySQL e OpenSSL. Il tutto è stato eseguito su SO WindowsXP e MySQL 5.5.9 oltre al predetto Win32OpenSSL 1.0.0c
- Per prima cosa installare OpenSSL lanciando l'eseguibile Win32OpenSSL_Light-1.0.0c.exe
Attenzione - Prima di eseguire l'installazione è necessario che sul computer sia presente Visual C++ 2008 Redistributables
(release 2008 non precedenti e, a quanto pare, non successive)Siccome OpenSSL viene comandato da riga di comando, è necessario che venga inserito un opportuno riferimento in Windows, quindi
da Start/Pannello di controllo/Sistema/Linguetta Avanzate/Variabili d'ambiente/Variabili di sistema scorrere fino a trovare la variabile Path
selezionare Modifica e comparirà una finestra Modifica variabile di sistema, nella casella Valore variabile, andare alla fine dello scritto ed aggiungere
l'indirizzo della cartella bin di OpenSSL vale a dire, per esempio,1C:\Programmi\OpenSSL-Win32\bin
IMPORTANTE: prima dell'indirizzo bisogna inserire un ; per separare l'indirizzo in questione dagli altri preesistenti
Se tutto questo è stato fatto correttamente, aprendo il terminale,
i comandi di openssl si potranno eseguire da qualunque directory senza doversi posizionare in quella dove è installato OpenSSL. - Creare una directory dove inserire i certificati e le chiavi da creare (es. C:\MyOpenSSL-Data)
- In questa cartella, aggiungerne altre due denominate C:\MyOpenSSL-Data\Certificati e ...SL-Data\Privato
Nella prima cartella verranno inserite le richieste di certificati ed i certificati stessi, nella seconda le chiavi private. - Creare due files txt da inserire in C:\MyOpenSSL-Data e denominati Index.txt e serial
Index.txt DEVE essere vuoto mentre serial (attenzione NON deve avere alcuna estensione) deve avere all'interno il numero 01
Questi due files riportano alcuni dati dei certificati creati: index.txt i dati identificativi, serial il numero dei certificati creati
I predetti files vengono aggiornati automaticamente da OpenSSL al momento della creazione dei certificati - A questo punto c'è ancora un passo da eseguire per essere pronti alla creazione delle chiavi/certificati. Impostare il file di configurazione di OpenSSL per specificare la directory dei dati.
Posizionarsi nella cartella del programma in ...OpenSSL-Win32\bin ed aprire con un editor il file openssl.cfg (magari facendone prima una copia) - Scorrendo il file, nella sezione CA_default si trova la voce dir = ./demoCA sostituire ./demoCA con l'indirizzo della directory creata al punto 3.
(es. dir = C:/MyOpenSSL-Data e occhio allo slash)
Rettificare eventualmente le directories Certificate e Private in base a quelle create al punto 4
Tutto il resto può essere lasciato così come è. Al massimo, successivamente, si potranno modificare altri parametri a proprio piacimento, una volta che si è ottenuta una maggior conoscenza e praticità al riguardo. - A questo punto si è pronti per la creazione delle chiavi/certificati, tuttavia vorrei analizzare un attimo - per quanto in mia conoscenza - il funzionamento della criptazione in chiave asincrona.
Il sistema di criptazione è basato su di due chiavi una privata da non divulgare ed una pubblica da inviare a coloro con i quali si vuole effettuare lo scambio protetto dei dati.Es.
A ha una chiave privata Aprv ed un certificato Acrt (chiave pubblica) A consegna a B il certificato Acrt, B invia i dati ad A crittografando gli stessi con Acrt e solo A tramite Aprv può decrittarli.
Naturalmente lo stesso passaggio inverso viene fatto da A verso B, quindi A con chiave pubblica di B crittografa i dati e li invia a B che li legge con Bprv (chiave privata di B)
Come detto in vari siti Internet, i punti deboli di tutto questo sono:
- Le chiavi private vanno tenute sul computer, e qualcuno potrebbe rubarle
- Una volta ricevuta una chiave pubblica da XY, non vi è l'assoluta certezza che sia stato proprio XY ad avermela inviata
Poichè se un terzo estraneo, che in qualche modo si è intromesso, e mi ha inviato un suo certificato spacciandolo per certificato di B, tutti i dati potranno essere letti dall'estraneo con la sua chiave privata.
Ed è per questo che vi sono le Autorità di Certificazione che firmano le chiavi garantendo la correttezza della loro origine e confermando l'abbinamento alla persona in oggetto.Nel nostro caso, trattandosi di dati che viaggiano in una intranet, possiamo effettuare la certificazione in proprio, ovvero sostituirci alla CA (autorità di certificazione)
se invece dobbiamo uscire all'esterno bisognerà utilizzare delle chiavi certificate (e quindi...pagare) poichè la nostra certificazione sarebbe sconosciuta a tutti e quindi considerata inattendibile.Dopo questo preambolo passiamo quindi a creare la Chiave/Certificato della CA personale (detta anche di root) e successivamente i certificati/chievi del server e del client
Navigando in Internet ho trovato diversi metodi per fare il tutto, alcuni funzionanti altri - pare - meno.
Qua di seguito indico quello da me utilizzato e ritenuto valido, in quanto funzionante sul mio sistema.
Aprire la finestra del terminale e posizionarsi sulla cartella creata C:\MyOpenSSL-Data e digitare i comandi seguenti:A - Chiave CA o di root
> openssl genrsa -des3 -out My-CAkey.pem 4096 (generazione di una chiave RSA di 4096 bit)
Verrà chiesta una passphrase perché con l'opzione -des3 abbiamo richiesto di criptare la chiave privata con l'algoritmo DES;
Questa passphrase verrà richiesta ogni volta che OpenSSL deve utilizzare la chiave privataB - Certificato CA o di root
> openssl req -new -x509 -days 0000 -nodes -key My-CAkey.pem -out My-CAcert.pem
Verrà chiesta la passphrase della chiave privata e alcune informazioni standard presenti nei certificati
l'opzione -days sta ad indicare il numero di giorni di validità della chiave.Sostituire gli zeri con la durata voluta.- Country name: : IT
- State or Province (full name) : Italia
- Locality name : Torino
- Organization name : CA MyAutority
- Organizational Unit : Admin
- Common name : Pinco Pallino
- Address email : pincopallino@hotmail.itLe risposte indicate qua sopra sono indicative e possono naturalmente
essere modificate ma servono pe rla comprensione dei passi successivi.C - Chiave per il Server
> openssl genrsa -out My-serverkey.pem 2048 (richiesta di una chiave RSA di 2048 bit)D - Certificato per il Server
> openssl req -new -days 0000 -nodes -key My-serverkey.pem -out My-serverreq.pem (creazione di una CSR - richiesta di certificato)
anche qua indicare il numero dei giorni di validità dopo -days- Country name: : IT
- Locality name : Torino
- Organizational Unit : SettoreSecurity
- Address email : pincopallino@hotmail.it
- Country name: : IT
- State or Province (full name) : Italia
- Organization name : CA MyAutority
- Common name : Indicare il nome o l'indirizzo del computer Server
Adesso siamo pronti, dalla richiesta di certificato ecco la firma vera e propria e l'emissione del certificato My-servercert.pem
> openssl ca -day 3624/-enddate YYMMDDHHMMSSZ -keyfile My-CAkey.pem -cert My-CAcert.pem -in My-serverreq.pem -out My-servercert.pem
Nel comando sopra indicato, ci sono due opzioni in alternativa: -days ed -enddate
days indica i giorni di validità del certificato
enddate indica la data di scadenza del certificato
indicare naturalmente solo uno dei due, li ho proposti in quanto per comodità preferisco enddate
Attenzione al formato della data YYMMDDHHMMSSZ ed alla Z finale (15/04/2011 ore 23:59:59 > 110415235959Z)
Per creare la chiave ed il certificato per il Client si eseguono gli stessi passi C e D sopra descritti con le seguenti accortezze:
Cambiare il nome della chiave/richiesta cert/certificato (es. My-clientkey.pem)
1Al momento della richiesta del certificato: 2 3- Country name: : IT 4- State or Province (full name) : Italia 5- Locality name : Torino 6- Organization name : CA MyAutority 7- Organizational Unit : SettoreSecurity 8- Common name : Indicare un dato DIVERSO da quello indicato nel certificato Server (punto D) 9- Address email : pincopallino@hotmail.it
Siamo quindi arrivati alla fine della creazione dei vari certificati e chiavi che si dovrebbero trovare nelle directory impostate all'inizio (punti 3 e 4)
Non rimane quindi che effettuare i settaggi in MySQL e programmi di front-end per l'utilizzo del protocollo SSL
MySQL
Aprire il file my.ini, posizionarsi alla fine (e quindi nella sezione SERVER) ed aggiungere le seguenti voci (in relazione agli esempi):
1#*** Impostazioni SSL SERVER *** 2# Impostazioni da utilizzare nel file di configurazione my.ini del server 3ssl = On 4# Certificato CA 5ssl-ca = "C:/MyOpenSSL-Data/Certificati/My-CAcert.pem" 6# Certificato del Server 7ssl-cert = "C:/MyOpenSSL-Data/Certificati/My-servercert.pem" 8# Chiave del Server 9ssl-key = "C:/MyOpenSSL-Data/Privato/My-serverkey.pem" 10# Elenco dei sistemi di cifratura abilitati 11ssl-cipher=ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA 12# Indirizzo dei certificati 13ssl-capath = "C:/MyOpenSSL-Data/Certificati"
Le ultime due voci ssl-cipher e ssl-capath ritengo possano essere superflue, la prima limita i sistemi di cifratura a quelli indicati la seconda è l'indirizzo del certificato CA
Personalmente ho aggiunto anche le seguenti voci nella sezione CLIENT ma, vedo che funziona anche senza indicarle. Le riporto per completezza.
1#*** Impostazioni SSL CLIENT *** 2# Impostazioni da utilizzare nel file di configurazione my.ini del server 3 4# Certificato CA 5ssl-ca = "C:/MyOpenSSL-Data/Certificati/My-CAcert.pem" 6# Certificato del Server 7ssl-cert = "C:/MyOpenSSL-Data/Certificati/My-clientcert.pem" 8# Chiave del Server 9ssl-key = "C:/MyOpenSSL-Data/Privato/My-clientkey.pem" 10# Elenco dei sistemi di cifratura abilitati 11ssl-cipher=ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA 12# Indirizzo dei certificati 13ssl-capath = "C:/MyOpenSSL-Data/Certificati"
Ora MySQL è pronto, bisogna però riavviare il tutto.
Per tutti gli altri programmi, MySQL Workbench / ConnectorODBC / HeidySQL ecc... sarà sufficiente
- copiare in una apposita directory del computer client, il certificato CA, il certificato client e la chiave client
- indicare nelle tre voci ssl-ca/ssl-cert/ssl-key dei vari programmi che prevedono l'utilizzo di SSL l'indirizzo per il collegamento ai files suddetti
e tutto dovrebbe funzionare egregiamente.
P.S.
Per chi volesse saperne un pò di più su SSL OpenSSL:
http://www.dia.unisa.it/~ads/corso-security/www/CORSO-0001/OpenSSL/index.htm
Allego 3 file batch per la creazione delle chiavi e dei certificati (verificare le directory di destinazione)
***** File1 *****
1REM File di creazione dei Certificati e delle chiavi OpenSSL 2C: 3CHDIR C:\MyOpenSSL-Data 4PAUSE Creazione della Chiave di CA - Premere un tasto 5openssl genrsa -des3 -out C:\MyOpenSSL-Data\Privato\My-CAkey.pem 4096 6 7PAUSE Creazione del Certificato di CA - Premere un tasto 8openssl req -new -x509 -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-CAkey.pem -out C:\MyOpenSSL-Data\Certificati\My-CAcert.pem
***** File2 *****
1REM File di creazione dei Certificati e delle chiavi OpenSSL 2C: 3CHDIR C:\MyOpenSSL-Data 4 5PAUSE Creazione della Chiave server - Premere un tasto 6openssl genrsa -out C:\MyOpenSSL-Data\Privato\My-serverkey.pem 2048 7 8PAUSE Creazione della richiesta del Certificato server - Premere un tasto 9openssl req -new -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-serverkey.pem -out C:\MyOpenSSL-Data\Certificati\My-serverreq.pem 10 11PAUSE Creazione del Certificato server - Premere un tasto 12openssl ca -enddate 201231235959Z -keyfile C:\MyOpenSSL-Data\Privato\My-CAkey.pem -cert C:\MyOpenSSL-Data\Certificati\My-CAcert.pem -in C:\MyOpenSSL-Data\Certificati\My-serverreq.pem -out C:\MyOpenSSL-Data\Certificati\My-servercert.pem
***** File3 *****
1REM File di creazione dei Certificati e delle chiavi OpenSSL 2C: 3CHDIR C:\MyOpenSSL-Data 4 5PAUSE Creazione della Chiave client - Premere un tasto 6openssl genrsa -out C:\MyOpenSSL-Data\Privato\My-clientkey.pem 2048 7 8PAUSE Creazione della richiesta del Certificato client - Premere un tasto 9openssl req -new -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-clientkey.pem -out C:\MyOpenSSL-Data\Certificati\My-clientreq.pem 10 11PAUSE Creazione del Certificato client - Premere un tasto 12openssl ca -enddate 201231235959Z -keyfile C:\MyOpenSSL-Data\Privato\My-CAkey.pem -cert C:\MyOpenSSL-Data\Certificati\My-CAcert.pem -in C:\MyOpenSSL-Data\Certificati\My-clientreq.pem -out C:\MyOpenSSL-Data\Certificati\My-clientcert.pem
Condividi su:
Esprimi un voto:
Argomenti chiave:
Ultimi commenti
g2d scrive: circa un anno faEra un bel pò di tempo che volevo provare mySQL e l'SSL Seguirò tutti i tuoi consigli .... Grazie per il tuo contributo
lucapette scrive: circa un anno faArgomento nuovo per me e anche per la community. Il tipo di aiuto che riteniamo prezioso! Grazie :)
re-verse scrive: circa un anno faGrazie Walter! :)

MySQL Report un tool di shell per tenere tutto sotto controllo