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%";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:
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:
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à.
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:
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.