Perché usare TLS/SSL con MySQL

TLS/SSL è lo standard per la crittografia delle connessioni TCP e UDP. Scopriamo perché sceglierlo e come utilizzarlo con MySQL e la tua infrastruttura web

I vantaggi della crittografia e di SSL

SSL ed il suo successore TLS, sono librerie software e protocolli crittografici che permettono l'interscambio di dati in sicurezza grazie all'utilizzo di complessi algoritmi per la cifratura dei messaggi.

Ogni qualvolta sia necessaria l'assoluta autenticità e riservatezza dei dati durante la comunicazione tra un client ed un server andrebbe attivato SSL al fine di offuscare il contenuto dei messaggi.

Esistono implementazioni di SSL per la stragrande maggioranza dei servizi e dei protocolli di rete ed anche MySQL, dalla versione 4.1 del 2003, include il supporto per le connessioni SSL/TLS.

Purtroppo però l'utilizzo di SSL con MySQL può rappresentare un problema specialmente se l'obiettivo è quello di utilizzarlo come backend per la nostra infrastruttura web: moltissimi motori CMS e Wiki infatti non offrono l'opportunità di connettersi a MySQL sfruttando la libreria OpenSSL e se la tua installazione di MySQL risiede su un host diverso da quello locale è consigliabile usare SSL.

Se invece il tuo webserver risiede sul medesimo host su cui "gira" MySQL (ovvero entrambi su 127.0.0.1) non hai di che preoccuparti e puoi dormire sonni tranquilli anche se le transazioni da Webapp/CMS a MySQL avvengono in chiaro. Puoi comunque continuare a leggere questo articolo per scoprire come usare Stunnel.

Il supporto di MySQL over SSL

Come già anticipato la stragrande maggioranza dei motori CMS e Wiki non supportano l'uso di SSL per le connessioni a MySQL rendendone di fatto impossibile, o quantomeno problematica, l'implementazione.

A seguire riportiamo una tabella che mostra il supporto della connessione a MySQL con SSL da parte dei più famosi applicativi web CMS, eCommerce e Wiki.

 
Applicativo WebTipo di AppVersione con supporto MySQL SSLSoluzione / Hack
Wordpress CMS / Blog -- È possibile modificare un sorgente (db.php) per aggiungere il supporto MySQL con SSL - Maggiori info su [1] e [2]
Joomla (2.5/3) CMS -- È necessario modificare alcuni sorgenti fondamentali del pacchetto - Maggiori info su [1]
Mediawiki Wiki A partire dalla 1.20 È possibile valorizzare la variabile $wgDBssl in LocalSettings.php
Prestashop  eCommerce/CMS  -- --

Magento 

eCommerce/CMS  -- È possibile modificare/estendere manualmente la classe Zend_Db_Adapter_Pdo_Abstract - Maggiori info su [1]
Drupal  CMS engine  -- È possibile modificare uno o più sorgenti - Maggiori info su [1]
Typo 3  CMS -- È possibile creare un'estensione per il supporto di MySQL over SSL - Maggiori info su [1] e [2]
vTiger CRM/Web app Tutte (a partire dalla 5.1.0) È possibile valorizzare la variabile $dbconfigoption['ssl'] nel file conf.inc.php
PhpMyAdmin  Administrative A partire dalla 4.0 È possibile valorizzare la variabile $cfg['Servers'][$i]['ssl'] nel file di configurazione

Una soluzione al problema: Stunnel

Sebbene quasi tutti gli applicativi web elencati in tabella possano essere modificati ed adattati per l'uso di SSL, preferiamo consigliarvi l'utilizzo di Stunnel perché meno invasivo e più elegante.

Bisogna sempre ricordarsi che modificare un sorgente che fa parte del cuore di un applicativo richiede interventi di manutenzione ogni qualvolta sia disponibile un aggiornamento e si decida di effettuarlo. Tali soluzioni risultano sempre poco eleganti e richiedono quasi sempre sforzi maggiori per il loro mantenimento.

Stunnel è un Proxy leggerissimo (i sorgenti compressi pesano poco più di 600Kb) sviluppato da Michal Trojnara e Brian Hatch con l'obiettivo di fornire connessioni sicure tra client e server sfruttando le librerie OpenSSL o SSLeavy ed i loro protocolli SSL/TLS.

Stunnel è un pacchetto software stabile, la sua prima versione fu rilasciata nel 2000 e da quel momento il progetto non ha mai smesso di rendere disponibili nuove versioni e bugfixes.

Stunnel non funziona soltanto con MySQL ma puoi affidarti a lui ogni volta che vuoi realizzare un canale di comunicazione sicuro tra un server ed un client su host diversi connessi su una rete non sicura (Internet, WAN, Cloud).

Installazione e configurazione di Stunnel

I pacchetti binari per Stunnel sono già disponibili sui repository software della maggior parte delle distribuzioni Linux: Debian, Ubuntu, Fedora, RHEL, Archlinux includono Stunnel nei rispettivi repository di pacchetti.

Se stunnel non dovesse essere disponibile per la tua combinazione di distribuzione/versione oppure ti trovi su piattaforma Windows puoi scaricare e compilare i sorgenti o l'eseguibile .exe disponibili alla pagina Download del sito ufficiale.

La configurazione di Stunnel è abbastanza semplice e veloce: ciò che occorre è generare il certificato con OpenSSL e successivamente configurare il client ed il server coinvolti nell'operazione.

Puoi generare un certificato SSL self-signed per Stunnel con lo stesso comando che usi per generare i certificati per altri scopi (per comodità genera il certificato sull'host che userai come server):

   openssl genrsa -out key.pem 2048
   openssl req -new -x509 -key key.pem -out cert.pem -days 1095
   cat key.pem cert.pem >> /etc/stunnel/stunnel.pem

Dopo aver seguito la procedura per la generazione del certificato devi copiare il certificato .pem sull'host client. NOTA: copia il file del certificato usando SSH/SCP altrimenti rischi di vanificare tutto il lavoro svolto.

A questo punto puoi configurare il server ed il client per dar vita alle tue connessioni sicure: Crea il file di configurazione sul server:

# Crea il file di configurazione
vi /etc/stunnel/miostunnel.conf

ed inserisci la porta locale dalla quale accettare connessioni dai client (accept) e la coppia host:porta alla quale agganciarsi e da "proxare" (connect), infine imposta il percorso in cui si trova il certificato già generato:

[mysql]
accept = 3307
connect = 127.0.0.1:3306
cert = /etc/stunnel/stunnel.pem

Adesso puoi passare alla configurazione del client creando nuovamente un file di configurazione in "/etc/stunnel/miostunnel.conf" questa volta esplicitando che si tratta di un client (client=yes) ed impostando la porta in ascolto in locale (accept) e il server stunnel al quale connettersi (connect):

   [mysql]
   client=yes
   cert = /etc/stunnel/stunnel.pem
   accept = localhost:3306
   connect = remote.host.com:3307

Note sulle connessioni MySQL over Stunnel

Come già anticipato, stunnel si occupa di fare da "proxy" tra un client ed un server, per questa ragione qualsiasi connessione a MySQL che avvenga attraverso Stunnel verrà sempre riconosciuta come una connessione "locale" e iniziata dunque da localhost.

Ricordati dunque di modificare gli account MySQL che accedono attraverso stunnel ed accertati che siano tutti del tipo 'username'@'localhost'. Tutti gli account utente del tipo 'username'@'otherhost' smetteranno di funzionare se proxati attraverso Stunnel.

Una valida alternativa: mysql-proxy

Una valida alternativa all'utilizzo di Stunnel per MySQL potrebbe essere mysql-proxy, il quale offre funzionalità aggiuntive come ad esempio il caching dei risultati delle queries (utile per mitigare l'effetto latenza ed alleggerire il carico di lavoro del server).

Sfortunatamente mysql-proxy non supporta TLS/SSL e ci obbliga ad impiegare Stunnel per raggiungere gli obiettivi prefissati in questo articolo.

Ci ripromettiamo di aggiornare questo articolo qualora il team di sviluppo di mysql-proxy decida di implementare la funzionalità TLS/SSL nel pacchetto.

Hai trovato utile questo articolo?
Lasciaci un tuo sincero feedback