Come configurare MariaDB con TLS 1.3 e proteggere le connessioni dei client

Come configurare MariaDB con TLS 1.3 e proteggere le connessioni dei client

Dopo aver installato MariaDB tramite il repository ufficiale per l’ultima versione, creiamo la cartella dove andranno creati i certificati e sistemiamo i diritti:

mkdir -p /etc/mysql/ssl
chmod 740 /etc/mysql/ssl
chown mysql /etc/mysql/ssl
cd /etc/mysql/ssl/
mkdir newcert

Creiamo un file openssl.cnf in cui ci sara’ la configurazione base (scaricabile qui) per i nostri certificati in modo da non dover riscrivere ogni volta i valori località, organizzazione ecc (editare le righe da 81 a 86). Inoltre, abbiamo bisogno di altri due file che verranno utilizzati per tenere traccia del numero progressivo dei certificati generati e del relativo seriale

touch index.txt
echo 1000 > serial

Generiamo la chiave per la nostra Root CA e inseriamo la password per proteggere la nostra chiave:

openssl genrsa -aes256 -out ca.key 4096

Generating RSA private key, 4096 bit long modulus (2 primes)
......................................................................................................................................++++
.............................................++++
e is 65537 (0x010001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

Ora sarà possibile generare il certificato di Root con il comando:

openssl req -config ./openssl.cnf -key ca.key -new -x509 -sha384 -days 7300 -extensions v3_ca -out ca-cert.pem

Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [IT]:
State or Province Name [Italy]:
Locality Name [Rome]:
Organization Name [PCLABS]:
Organizational Unit Name [ICT - Sistemi informatici]:
Common Name []:MariaDB Root CA
Email Address [mail@example.com]:support@mariadb.com 

Inseriamo la password della chiave che abbiamo generato precedentemente,  confermiamo tutti i valori e diamo a Common Name il valore “MariaDB Root CA”. Possiamo verificare il certificato appena creato con:

openssl x509 -noout -text -in ca-cert.pem

in cui verrà mostrato un output con

  • l’algoritmo della firma utilizzato ( Signature Algorithm)
  • le date di validità del certificato
  • la lunghezza del bit della chiave pubblica (RSA Public-Key)
  • l’Issuer, che è l’entità che ha firmato il certificato
  • il Soggetto, che si riferisce al certificato stesso

Molto simile è la creazione del certificato per il server in cui è in esecuzione MySQL/MariaDB.
Creiamo, ancora una volta, una chiave privata per il certificato del server:

openssl genrsa -out server.key 3072

Questa volta, a differenza del precedente comando, è stato omesso il parametro -aes256 per evitare che ci venga richiesta la password per la chiave del certificato server. Inoltre, creiamo una chiave di dimensione minore per migliorare la velocità di handshake tra il server e un client durante una connessione protetta. Per avere un’idea del costo in termini di tempo tra una chiave ed un’altra, eseguiamo sul nostro server il seguente comando:

openssl speed rsa2048 rsa3072 rsa4096

Doing 2048 bits private rsa's for 10s: 12093 2048 bits private RSA's in 9.99s
[...]
Doing 4096 bits public rsa's for 10s: 118746 4096 bits public RSA's in 10.00s
OpenSSL 1.1.1  11 Sep 2018
built on: Tue Nov 12 16:58:35 2019 UTC
                  sign    verify    sign/s verify/s
rsa 2048 bits 0.000826s 0.000024s   1210.5  40979.0
rsa 3072 bits 0.002499s 0.000051s    400.2  19669.7
rsa 4096 bits 0.005508s 0.000084s    181.6  11874.6

Come possiamo notare, le differenze tra una chiave a 2048 bit ed una a 4096 sono notevoli e non sempre tale velocità è giustificata da un minimo di protezione in più offerta da una chiave a 4096 bit.

Dopo questa piccola digressione, generiamo il nostro csr (certificate signing request) per poter creare il nostro certificato X.509 firmato dalla CA per il server:

openssl req -config openssl.cnf -key server.key -new -sha384 -out server.csr.pem

Inseriamo il valore in Common Name “Server MariaDB”e successivamente firmiamo il csr con la nostra CA

openssl ca -config openssl.cnf -extensions server_cert -days 5475 -notext -md sha384 -in server.csr.pem -out server.pem

Inseriamo la password della key della nostra CA e confermiamo con yes le eventuali richieste 

Certificate is to be certified until Jan 3 10:49:17 2035 GMT (5475 days)
Sign the certificate? [y/n]:Y

1 out of 1 certificate requests certified, commit? [y/n]Y

Write out database with 1 new entries
Data Base Updated

Infine creiamo i certificati per il client che effettuerà la connessione al nostro DB MySql

In Common name questa volta scriviamo “Client MariaDB”

openssl genrsa -out client.key 3072
openssl req -config openssl.cnf -key client.key -new -sha384 -out client.csr.pem
openssl ca -config openssl.cnf -extensions usr_cert -days 5475 -notext -md sha384 -in client.csr.pem -out client.pem

Elimiamo pure i file *.csr.pem in quanto non ci servono più.

Sistemiamo i diritti per i certificati:

chown root ca.key
chmod 400 ca.key
chown mysql server.pem server.key client.key client.pem ca-cert.pem
chmod 440 server.pem server.key ca-cert.pem

-r--r----- 1 mysql root 2252 Jan  2 12:20 ca-cert.pem
-r-------- 1 root root 3326 Jan 2 12:01 ca.key
-r--r----- 1 mysql root 2455 Jan 2 14:54 client.key
-r--r----- 1 mysql root 2159 Jan 2 14:57 client.pem
-r--r----- 1 mysql root 2459 Jan 2 12:34 server.key
-r--r----- 1 mysql root 2431 Jan 2 14:47 server.pem

Ora non ci rimane che indicare al servizio MariaDB dove trovare i certificati che abbiamo generato.
Modifichiamo il file /etc/mysql/my.cnf decomentando l’ultima riga in

includedir /etc/mysql/mariadb.conf.d/

In questo modo, le modifiche aggiuntive verranno effettuate in un nuovo file senza toccare il file originale my.cnf. Spostiamo pertanto sotto la cartella cd /etc/mysql/mariadb.conf.d/ e creiamo un nuovo file chiamato 10-client.cnf (qualsiasi altra estensione diversa da .cnf non verrà letta da mysql) il cui contenuto sarà:

[client]
## MySQL SSL Client Configuration ##
ssl-ca          = /etc/mysql/ssl/ca-cert.pem
ssl-cert        = /etc/mysql/ssl/client.pem
ssl-key         = /etc/mysql/ssk/client.key
ssl-cipher      = TLSv1.3

Poi creiamo un ulteriore file chiamato 20-server.cnf il cui contenuto sarà:

[mysqld]
## MySQL SSL Server Configuration ##
ssl
ssl-ca          = /etc/mysql/ssl/ca-cert.pem
ssl-cert        = /etc/mysql/ssl/server.pem
ssl-key         = /etc/mysql/ssl/server.key
ssl-cipher      = TLSv1.3

Ora possiamo riavviare il servizio MariaDB e collegarci al db

systemctl restart mariadb
mysql -uroot

Ora controlliamo che la connessione sia cifrata con TLS1.3 effettuando una query con i seguenti comandi:
\s 
show variables like ‘%ssl%’;

MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.4.11-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id:		36
Current database:	
Current user:		root@localhost
SSL:			Cipher in use is TLS_AES_256_GCM_SHA384
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server:			MariaDB
Server version:		10.4.11-MariaDB-1:10.4.11+maria~bionic-log mariadb.org binary distribution
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			20 sec

Threads: 8  Questions: 59  Slow queries: 0  Opens: 31  Flush tables: 1  Open tables: 25  Queries per second avg: 2.950
--------------
MariaDB [(none)]> show variables like '%ssl%';
+---------------------+----------------------------+
| Variable_name       | Value                      |
+---------------------+----------------------------+
| have_openssl        | YES                        |
| have_ssl            | YES                        |
| ssl_ca              | /etc/mysql/ssl/ca-cert.pem |
| ssl_capath          |                            |
| ssl_cert            | /etc/mysql/ssl/server.pem  |
| ssl_cipher          | TLSv1.3                    |
| ssl_crl             |                            |
| ssl_crlpath         |                            |
| ssl_key             | /etc/mysql/ssl/server.key  |
| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |
+---------------------+----------------------------+
10 rows in set (0.002 sec)

2 Replies to “Come configurare MariaDB con TLS 1.3 e proteggere le connessioni dei client”

  1. I’ve followed this tutorial but:
    [Warning] Failed to setup SSL
    [Warning] SSL error: Failed to set ciphers to use
    [Warning] SSL error: error:1426E0B9:SSL routines:ciphersuite_cb:no cipher match
    [Warning] SSL error: error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match

    OpenSSL v1.1.1d

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *