MySQL
Configurazione della connessione SSL
Ricerca…
Installazione per sistemi basati su Debian
(Questo presuppone che MySQL sia stato installato e che sudo
sia in uso.)
Generazione di una CA e chiavi SSL
Assicurarsi che OpenSSL e le librerie siano installate:
apt-get -y install openssl
apt-get -y install libssl-dev
Quindi fai e inserisci una directory per i file SSL:
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
Per generare chiavi, creare un'autorità di certificazione (CA) per firmare le chiavi (autofirmato):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
I valori immessi in ciascun prompt non influiscono sulla configurazione. Quindi creare una chiave per il server e firmare utilizzando la CA di prima:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Quindi crea una chiave per un cliente:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Per assicurarti che tutto sia stato impostato correttamente, verifica i tasti:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Aggiungere le chiavi a MySQL
Apri il file di configurazione di MySQL . Per esempio:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Sotto la sezione [mysqld]
, aggiungi le seguenti opzioni:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
Riavvia MySQL. Per esempio:
service mysql restart
Testare la connessione SSL
Connetti allo stesso modo, passando le opzioni extra ssl-ca
, ssl-cert
e ssl-key
, usando la chiave del client generata. Ad esempio, assumendo cd /home/ubuntu/mysqlcerts
:
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p
Dopo aver effettuato l'accesso, verificare che la connessione sia effettivamente sicura:
[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /home/ubuntu/mysqlcerts/ca.pem |
| ssl_capath | |
| ssl_cert | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /home/ubuntu/mysqlcerts/server-key.pem |
+---------------+-----------------------------------------+
Puoi anche controllare:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
Applicare SSL
Questo è via GRANT
, usando REQUIRE SSL
:
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
Ora, superman
deve connettersi tramite SSL.
Se non si desidera gestire le chiavi del client, utilizzare la chiave del client da prima e utilizzarla automaticamente per tutti i client. Aprire il file di configurazione MySQL , ad esempio:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Sotto la sezione [client]
, aggiungi le seguenti opzioni:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
Ora superman
deve solo digitare quanto segue per accedere tramite SSL:
mysql -h 127.0.0.1 -u superman -p
Il collegamento da un altro programma, ad esempio in Python, richiede in genere solo un parametro aggiuntivo per la funzione di connessione. Un esempio di Python:
import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)
Riferimenti e ulteriori letture:
- https://www.percona.com/blog/2013/06/22/setting-up-mysql-ssl-and-secure-connections/
- https://lowendbox.com/blog/getting-started-with-mysql-over-ssl/
- http://xmodulo.com/enable-ssl-mysql-server-client.html
- https://ubuntuforums.org/showthread.php?t=1121458
Installazione per CentOS7 / RHEL7
Questo esempio presuppone due server:
- dbserver (dove vive il nostro database)
- appclient (dove vivono le nostre applicazioni)
FWIW, entrambi i server sono Enforcing di SELinux.
Innanzitutto, accedere a dbserver
Creare una directory temporanea per la creazione dei certificati.
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
Creare i certificati del server
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Sposta i certificati del server in / etc / pki / tls / certs / mysql /
Il percorso della directory assume CentOS o RHEL (regolare come necessario per altre distribuzioni):
mkdir /etc/pki/tls/certs/mysql/
Assicurati di impostare i permessi sulla cartella e sui file. mysql richiede piena proprietà e accesso.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Ora configura MySQL / MariaDB
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
Poi
systemctl restart mariadb
Non dimenticare di aprire il firewall per consentire le connessioni da appclient (usando IP 1.2.3.4)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
Ora riavvia firewalld
service firewalld restart
Quindi, accedere al server mysql di dbserver:
mysql -uroot -p
Emettere quanto segue per creare un utente per il client. nota RICHIESTA SSL nell'istruzione GRANT.
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
Dovresti essere ancora in / root / certs / mysql dal primo passaggio. In caso contrario, ritorna ad esso per uno dei comandi seguenti.
Creare i certificati client
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Nota : ho usato lo stesso nome comune per entrambi i certificati server e client. YMMV.
Assicurati di essere ancora / root / certs / mysql / per questo comando successivo
Combina il certificato CA del server e del client in un singolo file:
cat server-cert.pem client-cert.pem > ca.pem
Assicurati di vedere due certificati:
cat ca.pem
FINE DEL SERVER LAVORO LATERALE PER ORA.
Aprire un altro terminale e
ssh appclient
Come prima, creare una casa permanente per i certificati client
mkdir /etc/pki/tls/certs/mysql/
Ora, posiziona i certificati client (creati su dbserver) su appclient. Puoi scoppiarli o semplicemente copiare e incollare i file uno per uno.
scp dbserver
# copy files from dbserver to appclient
# exit scp
Anche in questo caso, assicurarsi di impostare le autorizzazioni sulla cartella e sui file. mysql richiede piena proprietà e accesso.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Dovresti avere tre file, ognuno di proprietà dell'utente mysql:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
Ora modifica la configurazione MariaDB / MySQL di appclient nella sezione [client]
.
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
Riavvia il servizio mariadb dell'appclient:
systemctl restart mariadb
ancora sul cliente qui
Questo dovrebbe restituire: ssl TRUE
mysql --ssl --help
Ora, accedi all'istanza mysql di appclient
mysql -uroot -p
Dovrebbe vedere SÌ per entrambe le variabili di seguito
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
Inizialmente ho visto
have_openssl NO
Una rapida occhiata a mariadb.log ha rivelato:
Errore SSL: impossibile ottenere il certificato da '/etc/pki/tls/certs/mysql/client-cert.pem'
Il problema era che root-owned client-cert.pem e la cartella contenente. La soluzione era impostare la proprietà di / etc / pki / tls / certs / mysql / su mysql.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Riavvia mariadb se necessario dal passaggio immediatamente precedente
ORA, SIAMO PRONTI A TESTARE IL COLLEGAMENTO SICURO
Siamo ancora in appclient qui
Tentativo di connessione all'istanza mysql di dbserver utilizzando l'account creato sopra.
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
Con un po 'di fortuna dovresti essere loggato senza errori.
Per confermare di essere connessi con SSL abilitato, emettere il seguente comando dal prompt MariaDB / MySQL:
\s
Questo è un backslash s, ovvero lo stato
Questo mostrerà lo stato della tua connessione, che dovrebbe assomigliare a questo:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
Se ti viene negata l'autorizzazione durante il tentativo di connessione, controlla la tua dichiarazione GRANT sopra per assicurarti che non ci siano caratteri vaganti o segni.
Se hai errori SSL, torna su questa guida per assicurarti che i passaggi siano ordinati.
Questo ha funzionato su RHEL7 e probabilmente funzionerà anche su CentOS7. Non posso confermare se questi passaggi esatti funzioneranno altrove.
Spero che questo salvi qualcun altro un po 'di tempo e di irritazione.