Guida alla crittografia MySQL nelle impostazioni di transito e crittografia obbligatoria

Guida alla crittografia MySQL nelle impostazioni di transito e crittografia obbligatoria
Per impostazione predefinita, la trasmissione di dati MySQL tra client e server avviene senza crittografia. La trasmissione dei dati non crittografata è accettabile solo quando il client e il server si trovano all'interno della stessa rete che garantisce la sicurezza. Tuttavia, i dati sono a rischio potenziale se entrambe le parti sono su una rete separata. La mancanza di crittografia introduce un grave rischio di intercettazione dei dati mediante attacco man-in-the-middle (MITM).

Per superare questo rischio, MySQL supporta la crittografia in transito tra il client e il server tramite protocollo TLS/SSL. L'articolo si concentra sulla generazione manuale di certificati SSL e file di chiavi in ​​MySQL per configurare SSL. Successivamente, l'articolo si concentra anche sull'abilitazione di requisiti di crittografia obbligatoria dai clienti.

Iniziare

Versioni mysql 5.7.28+ fornisce uno strumento utile noto come mysql_sssl_rsa_setup, che si basa sui binari OpenSSL per generare automaticamente i certificati e le chiavi SSL richieste per supportare una connessione sicura.

Pertanto, prima di iniziare, controllare lo stato di connessione SSL predefinito del server MySQL. Digitare il seguente comando per verificare il valore della sessione SSL:

MySQL> Mostra variabili globali come "%ssl%";
+---------------+-----------------+
| Variabile_name | Valore |
+---------------+-----------------+
| have_openssl | Disabile |
| have_ssl | Disabile |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
+---------------+-----------------+
9 righe in set (0.53 sec)

L'output sopra mostra che MySQL non supporta la crittografia in transito per la sessione corrente.

Utilizzare OpenSSL per creare certificato SSL e tasti

Per fornire la crittografia in transito, MySQL richiede certificati X509 sul lato client e sul lato server firmati dall'autorità di certificazione per convalidare la proprietà del dominio. Genereremo certificati autofirmati, nonché certificati sul server e sul lato client tramite l'utilità della linea di comando OpenSSL. È uno strumento OpenSSL Library che genera chiavi private, crea richieste di certificato X509, le firma come CA e le verifica.

Prima di iniziare, creare una directory per archiviare tutti i file:

ubuntu@ubuntu: ~ $ mkdir/var/lib/mysql/transit
ubuntu@ubuntu: ~ $ cd/var/lib/mysql/transit

Il seguente set di comandi genererà diversi istruzioni che devono avere risposte non vuote.

Chiave dell'autorità certificata e generazione di certificati

La creazione di un certificato autofirmato richiede un certificato di autorità di certificazione (CA) tramite un file chiave privato. Utilizzare il comando OpenSSL per generare una chiave privata RSA 2048 bit per la CA.

ubuntu@ubuntu: ~ $ opensssl genrsa 2048> ca-key.PEM

Utilizzare il tasto sopra con un comando OpenSSL REQ per generare un certificato per la propria CA con una scadenza di 3000 giorni.

ubuntu@ubuntu: ~ $ openssl req -new -x509 -nodes -days 3000 -key ca -key.pem -out ca.PEM

I comandi sopra creano nuovi file ca-key.PEM e CA.PEM per firmare i certificati X509 del server MySQL e del client.

Genera una chiave privata e un certificato autofirmato per MySQL Server

Utilizzare OpenSSL per generare la chiave RSA MySQL Server RSA e il certificato di firma (CSR):

ubuntu@ubuntu: ~ $ OpenSSL GENRSA 2048> Server-Key.PEM
ubuntu@ubuntu: ~ $ openssl req -new -key server -key.PEM -out Server -Req.PEM

Ora rimuovi la passphrase dalla chiave del server:

ubuntu@ubuntu: ~ $ OpenSSL RSA -in Server -Key.PEM -Out Server -Key.PEM

Genera il certificato autofirmato MySQL Server dalla richiesta di certificato utilizzando la chiave privata CA e il certificato.

ubuntu@ubuntu: ~ $ openssl x509 -req -in server -req.PEM -days 3600 -ca CA.PEM -CAKEY CA -KEY.PEM -set_serial 01 -out server -cert.PEM

Ora, la configurazione SSL per MySQL non richiede CSR.

Genera la chiave del client e il certificato autofirmato

Allo stesso modo, genera la richiesta chiave e certificato per il client.

ubuntu@ubuntu: ~ $ openssl req -newkey RSA: 2048 -Days 3600 -Nodes -Keyout Client -Key.PEM -out client -req.PEM

Rimuovere la passphrase dalla chiave e generare un certificato client dalla richiesta del certificato utilizzando i file CA.

ubuntu@ubuntu: ~ $ OpenSSL RSA -in Client -Key.PEM -Out Client -Key.PEM
ubuntu@ubuntu: ~ $ openssl x509 -req -in client -req.PEM -days 365000 -ca CA.PEM -CAKEY CA -KEY.PEM -Set_Serial 01 -Out Client -Cert.PEM

Il server accetterà solo connessioni remote dai client con questi file.

Infine, verifica i certificati sul lato client e sul server rispetto al certificato CA.

ubuntu@ubuntu: ~ $ opensssl Verify -cafile ca.PEM Server-Cert.PEM Client-Cert.PEM
Server-Cert.PEM: OK
Cliente-Cliente.PEM: OK

Il valore OK indica che i certificati sono stati generati correttamente e sono pronti per l'uso.

Configurazione del server MySQL

Per abilitare il servizio TLS/SSL per MySQL Server richiede l'impostazione di una serie di variabili di sistema all'interno del file di configurazione principale MySQL mysqld.conf, ad esempio:

  • Utilizzo ssl_cert E ssl_key Per impostare il percorso sul certificato del server e sulla chiave privata.
  • Usa il ssl_ca variabile per impostare il percorso sul certificato della CA sul lato server.

Usa il tuo editor preferito per modificare il file di configurazione situato all'interno /etc/mysql/mysql.conf.D directory.

ubuntu@ubuntu: ~ $ vim/etc/mysql/mysql.conf.d/mysqld.Cnf
[mysqld]
ssl_ca =/var/lib/mysql/new_certs/ca.PEM
ssl_cert =/var/lib/mysql/new_certs/server cert.PEM
ssl_key =/var/lib/mysql/new_certs/server-key.PEM

Infine, modifica le chiavi SSL e la proprietà del certificato e le autorizzazioni.

ubuntu@ubuntu: ~ $ chown -r mysql: mysql/var/lib/mysql/new_certs/
ubuntu@ubuntu: ~ $ chmod 600 client-key.Key server PEM.PEM CA-KEY.PEM

Riavvia il database per caricare le modifiche recenti.

ubuntu@ubuntu: ~ $ sudo servizio mysql riavvio

Accedi al server dopo il riavvio e controlla lo stato di sessione SSL MySQL corrente.

Configurazione lato client

La creazione di una connessione remota sicura dal client richiede il trasferimento dei file di certificato OpenSSL generati dal lato del client sopra generati. Crea una nuova directory e utilizza l'utilità SCP per il trasferimento di file sicuro.

ubuntu@ubuntu: ~ $ mkdir ~/client-cert
ubuntu@ubuntu: ~ $ SCP USER@[ip_address]:/var/lib/mysql/transit/ca-cert.PEM ~/Client-Cert/
ubuntu@ubuntu: ~ $ SCP USER@[IP_ADDRESS]:/var/lib/mysql/transit/client-cert.PEM ~/Client-Cert/
ubuntu@ubuntu: ~ $ SCP User@[ip_address]:/var/lib/mysql/transit/client-key.PEM ~/Client-Cert/

Durante la creazione di una connessione remota crittografata, il client ora richiede l'aggiunta di opzioni sul lato client che verificano chiavi e certificati sul lato client. Le opzioni incluse sono simili alle variabili di sistema sul lato server ma, il -SSL-Key E -SSL-Cert Opzioni Identificare i percorsi per la chiave privata del cliente e il certificato. Usa il -SSL-CA Opzione per aggiungere il percorso al certificato CA. Questo file deve essere lo stesso del certificato CA lato server.

Utilizzare il comando seguente con tutte le opzioni richieste per stabilire una connessione remota sicura con il server di database MySQL.

ubuntu@ubuntu: ~ $ mysql -u utente -p -h --ssl-ca = ~/client-cert/ca.PEM--SSL-Cert = ~/client-cert/client-cert.PEM--SSL-Key = Under ~/client-cert/client-key.PEM

Configurare connessioni crittografate obbligatorie

Per alcuni server MySQL, non è necessario solo per il client di connettersi con il server tramite una connessione crittografata, ma è obbligatorio. MySQL consente all'amministratore del server di configurare connessioni crittografate obbligatorie. È reso possibile posizionando tre diversi livelli di controllo:

  • Configurare mysql che richiede al client di accedere al database solo tramite una connessione crittografata.
  • Invoca i programmi client per aver bisogno di una connessione crittografata, anche se MySQL lo consente ma non ne richiede necessariamente uno.
  • Configura account utente specifici per accedere al database solo su un canale crittografato.

In dettaglio ciascuno di essi:

requisito_secure_transport

Per garantire i clienti che utilizzano una connessione crittografata, abilitare il requisito_secure_transport Variabile nel file di configurazione MySQL situato in/etc/mysql/mysql.Cnf.Directory D:

ubuntu@ubuntu: ~ $ sudo vim/etc/mysql/mysql.conf.d/mysqld.Cnf
[mysqld]
requisite_secure_transport = on

La variabile di sistema sopra garantisce che il client utilizza il trasporto sicuro per connettersi con il server e il server consente solo le connessioni TCP tramite SSL. Pertanto, il server rifiuta qualsiasi richiesta di connessione client senza un trasporto sicuro e restituisce un output di errore di ER_SECURE_TRANSPORT_REQUIRED nel programma del client.

Inoltre, la configurazione del server sopra disabilita anche la connessione client remota al server con un -SSLODE = disabilitato corda.

Invocando il programma dei clienti

Questo livello di controllo consente di invocare il programma client di impostare una comunicazione crittografata sicura, indipendentemente dalle impostazioni del server. Cioè, anche se il server non è configurato per essere obbligatorio stabilire un trasporto SSL/TLS, è in grado di mantenere una connessione sicura al desiderio del cliente.

È possibile mediante l'uso di un -SSLODE Opzione disponibile in Mysql 5.7.11 insieme ai suoi vari valori. È utile specificare lo stato di sicurezza desiderato della connessione client al server. I valori di opzione vengono applicati in base al livello crescente di rigidità.

  • DISABILITATO: Il valore ha stabilito una connessione non sicura.
  • Preferito: La modalità è simile a quando non viene specificata l'opzione in modalità tale. Stabilisce la crittografia solo se il server lo supporta altrimenti, ricade alla connessione non crittografata predefinita.
  • NECESSARIO: Il valore garantisce una comunicazione crittografata se il server è abilitato per supportarne una. Il client non riesce il tentativo di connessione se MySQL non supporta TLS/SSL.
  • Verify_ca: il valore funziona simile a NECESSARIO, Ma inoltre, verifica anche il certificato CA del server. Il client non si connette in caso di certificati di corrispondenza validi.
  • Verify_Identity: simile a Verify_ca, Ma per una versione OpenSSL 1.0.2+, i client possono anche verificare il nome host che utilizzano per la connessione contro l'identità nel certificato del server. La connessione si interrompe nel caso di una mancata corrispondenza.

Tuttavia, è importante notare che la verifica del nome host non funziona per i certificati autofirmati. Questi includono certificati generati automaticamente dal server o creati manualmente tramite lo strumento MySQL_SSL_RSA_SETUP.

Oltre alla crittografia predefinita, MySQL consente al client di includere ulteriori impostazioni di sicurezza fornendo un certificato CA, come il server, e abilitando la verifica dell'identità del nome host. Queste impostazioni consentono a entrambe le parti di fidarsi di un'entità comune e il client può verificare che si stia connettendo all'host giusto.

Ora comprendiamo come la modalità sopra interagisce con le opzioni di certificato CA:

  • Specificare il certificato CA con l'opzione -SSL -CA con -SSLODE = Verify_CA.
  • Abilita la verifica dell'identità del nome host utilizzando -SSLODE = Verify_Identity
  • Un valore -sssl-in modalità diversa da Verify_Identity o Verify_CA con -SSL-CA genererà un avviso che dichiara la non verifica del certificato del server.

Configurare gli account utente

Per abilitare la comunicazione crittografata da parte del client, configurare un account utente specifico per accedere al server MySQL su SSL. Crea un account utente CREARE UN UTENTE con il RICHIEDERE Dichiarazione della clausola. Oppure usa il file Altera l'utente Dichiarazione per aggiungere la clausola richiesta. Questo controllo termina i tentativi di connessione client sul server se non supporta una connessione crittografata.

La clausola richiesto è utile per eseguire una configurazione relativa alla crittografia che impone i rigidi requisiti di sicurezza. Consente di specificarne uno o più di uno tls_option valore.

Entriamo nei dettagli delle opzioni di comando richieste dai client configurati con vari valori richiesti:

NESSUNO: non richiede una connessione SSL
SSL: Il server consente solo una connessione crittografata dagli account abilitati SSL.
X509: Richiede al cliente di presentare la chiave privata e il certificato. Questo valore non richiede la necessità di mostrare il certificato, l'oggetto ed emittente CA.

La clausola specifica le caratteristiche di crittografia richieste in modo tale che non sia necessario includere l'opzione SSL.

mysql> Crea utente "utente"@"localhost" richiede x509;

Ora, il client deve specificare le opzioni -SSL -Ke e -SSL -Cert per connettersi, mentre -SSL -CA non è necessario (questo vale anche per il emittente E soggetto valori).

ubuntu@ubuntu: ~ $ mysql -u utente -p -h --SSL-CERT = Client-Cert.PEM--SSL-key = client-key.PEM

EMITTENTE: L'account creato con l'istruzione emittente richiede, richiede al client di specificare le opzioni -SSL -Ke e -SSL -Cert con un certificato valido emesso dall'emittente CA '. Crea l'account utente come segue:

mysql> crea l'utente 'utente'@'localhost' richiedi emittente '/c = se/st = stockholm/l = stockholm/o = mysql/cn = ca/emailaddress = [email protected] ';

Se il certificato è valido con un emittente diverso, il tentativo di connessione fallisce.

SOGGETTO: richiedere al client di presentare il certificato con a soggetto valore fornito durante la creazione del proprio account. Una connessione con un certificato valido ma un risultato diverso nelle terminazioni di connessione.

mysql> crea l'utente 'utente'@'localhost' richiede soggetto '/c = se/st = stockholm/l = stockholm/o = mysql Demo Client Certificate/cn = client/emailaddress = [email protected] ';

CIFRA: L'account creato con l'istruzione richiede al client di includere il metodo cifrato utilizzato per crittografare la comunicazione. È necessario garantire se le cifre e le lunghezze chiave sono sufficientemente forti.

mysql> Crea utente 'utente'@'localhost' richiede cipher 'edh-rsa-des-cbc3-sha';

Conclusione

L'articolo illustra come garantire la comunicazione tra MySQL Server e client abilitando il protocollo SSL. Impariamo a creare un certificato autofirmato manuale poiché ci fidiamo dell'host nella rete. Applichiamo anche la crittografia in transito per la comunicazione del server MySQL al di fuori della rete e apprendiamo i modi per configurare il server per i requisiti di crittografia obbligatoria.