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:

Installazione per CentOS7 / RHEL7

Questo esempio presuppone due server:

  1. dbserver (dove vive il nostro database)
  2. 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow