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)