Configurazione della crittografia MySQL

Panoramica

Questa sezione fornisce diversi esempi di configurazione della crittografia per CentOS 8.2 e MySQL 8.4.0 e può essere utilizzata come guida rapida per crittografare la connessione al database.

Se l'host MySQL è impostato su localhost, le opzioni di crittografia non saranno disponibili. In questo caso, una connessione tra il frontend di Zabbix e il database utilizza un file socket (su Unix) o la memoria condivisa (su Windows) e non può essere crittografata.

L'elenco delle combinazioni di crittografia non è limitato a quelle elencate in questa pagina. Sono disponibili molte altre combinazioni.

Prerequisiti

Installa il database MySQL dal repository ufficiale.

Consulta la documentazione MySQL per i dettagli su come utilizzare il repository MySQL.

Il server MySQL è pronto ad accettare connessioni sicure utilizzando un certificato autofirmato.

Per vedere quali utenti stanno utilizzando una connessione crittografata, esegui la seguente query (Performance Schema deve essere impostato su ON):

SELECT sbt.variable_value AS tls_version, t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host 
FROM performance_schema.status_by_thread  AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher'
ORDER BY tls_version;

Crittografia solo del trasporto

Configurazione MySQL

Le versioni moderne del database sono pronte all'uso per la modalità di crittografia required mode di crittografia. Un certificato lato server verrà creato dopo la configurazione iniziale e l'avvio.

Creare utenti e ruoli per i componenti principali:

mysql> CREATE USER
 'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
 'zbx_web'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>'
 REQUIRE SSL
 PASSWORD HISTORY 5; 

mysql> CREATE ROLE 'zbx_srv_role', 'zbx_web_role'; 

mysql> GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, INDEX, REFERENCES ON zabbix.* TO 'zbx_srv_role'; 
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON zabbix.* TO 'zbx_web_role'; 

mysql> GRANT 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> GRANT 'zbx_web_role' TO 'zbx_web'@'%'; 

mysql> SET DEFAULT ROLE 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> SET DEFAULT ROLE 'zbx_web_role' TO 'zbx_web'@'%';

Si noti che il protocollo X.509 non viene usato per verificare l'identità, ma l'utente è configurato per usare solo connessioni crittografate. Per ulteriori dettagli sulla configurazione degli utenti, vedere la documentazione MySQL.

Eseguire il comando seguente per verificare la connessione (la connessione socket non può essere usata per testare connessioni sicure):

mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED

Verificare lo stato corrente e i cipher suite disponibili:

mysql> status
--------------
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id: 62
Current database:
Current user: [email protected]
SSL: Cipher in use is TLS_AES_256_GCM_SHA384

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
*************************** 1. row ***************************
Variable_name: Ssl_cipher_list
Value: TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA
1 row in set (0.00 sec)

ERROR:
Nessuna query specificata

Frontend

Per abilitare la crittografia solo del trasporto per le connessioni tra il frontend di Zabbix e il database:

  • Selezionare Database TLS encryption
  • Lasciare deselezionato Verify database certificate

Server

Per abilitare la crittografia solo del trasporto per le connessioni tra il server e il database, modificare il file di configurazione del server:

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...

Crittografia con verifica dell'autorità di certificazione

Copia il CA MySQL richiesto sul server frontend di Zabbix e assegna le autorizzazioni appropriate per consentire al webserver di leggere questo file.

Questa modalità non funziona su RHEL 7 a causa delle versioni più datate delle librerie MySQL.

frontend

Per abilitare la crittografia con verifica del certificato per le connessioni tra il frontend di Zabbix e il database:

  • Selezionare Crittografia TLS del database e Verifica certificato del database
  • Specificare il percorso del file CA TLS del database

In alternativa, è possibile configurare questa impostazione nel file di configurazione del frontend (zabbix.conf.php):

...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...

Risoluzione dei problemi: utilizzare lo strumento da riga di comando per verificare se la connessione è possibile per l'utente richiesto:

    mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem

Server

Per abilitare la crittografia con verifica del certificato per le connessioni tra Zabbix server e il database, modificare il file di configurazione del server:

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_ca
DBTLSCAFile=/etc/ssl/mysql/ca.pem
...

Crittografia con verifica completa

Configurazione MySQL

Impostare l'opzione di configurazione del server MySQL CE (/etc/my.cnf.d/server-tls.cnf) su:

[mysqld]
...
# in questi esempi le chiavi si trovano nella directory datadir di MySQL CE
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

require_secure_transport=ON
tls_version=TLSv1.3
...

Le chiavi per il server MySQL CE e per il client (frontend di Zabbix) devono essere create manualmente in base alla documentazione di MySQL CE: Creating SSL and RSA certificates and keys using MySQL oppure Creating SSL certificates and keys using openssl

Il certificato del server MySQL deve contenere il campo Common Name impostato al nome FQDN, poiché il frontend di Zabbix utilizzerà il nome DNS per comunicare con il database o l'indirizzo IP dell'host del database.

Creare l'utente MySQL:

mysql> CREATE USER
  'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
  'zbx_web'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>'
  REQUIRE X509
  PASSWORD HISTORY 5;

Verificare se è possibile accedere con quell'utente:

mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem

frontend

Per abilitare la crittografia con verifica completa per le connessioni tra il frontend di Zabbix e il database:

  • Selezionare Crittografia TLS del database e Verifica certificato del database
  • Specificare il percorso del file della chiave TLS del database
  • Specificare il percorso del file CA TLS del database
  • Specificare il percorso del file del certificato TLS del database

Si noti che Verifica host del database è selezionato e disabilitato: questo passaggio non può essere ignorato per MySQL.

Se il campo Elenco di cifrari TLS del database viene lasciato vuoto, verranno abilitati i cifrari comuni consentiti sia dal frontend (client) sia dal server. In alternativa, i cifrari possono essere impostati esplicitamente, in conformità con i requisiti di configurazione dei cifrari.

In alternativa, questa impostazione può essere configurata nel file di configurazione del frontend (zabbix.conf.php):

...
// Utilizzato per la connessione TLS con un elenco di cifrari definito esplicitamente.
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GC';
...
// oppure
...
// Utilizzato per la connessione TLS senza un elenco di cifrari definito: selezionato dal server MySQL
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...

Server

Per abilitare la crittografia con verifica completa per le connessioni tra il server Zabbix e il database, modificare il file di configurazione del server:

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_full
DBTLSCAFile=/etc/ssl/mysql/ca.pem
DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
...