1 Configuration du chiffrement MySQL

Vue d'ensemble

Cette section fournit plusieurs exemples de configuration du chiffrement pour CentOS 8.2 et MySQL 8.0.30 et peut être utilisée comme guide de démarrage rapide pour chiffrer la connexion à la base de données.

Si l'hôte MySQL est défini sur localhost, les options de chiffrement ne seront pas disponibles. Dans ce cas, une connexion entre l'interface Zabbix et la base de données utilise un fichier socket (sur Unix) ou la mémoire partagée (sur Windows) et ne peut pas être chiffrée.

La liste des combinaisons de chiffrement ne se limite pas à celles indiquées sur cette page. Il existe de nombreuses autres combinaisons disponibles.

Prérequis

Installez la base de données MySQL depuis le dépôt officiel.

Consultez la documentation MySQL pour plus de détails sur l’utilisation du dépôt MySQL.

Le serveur MySQL est prêt à accepter des connexions sécurisées à l’aide d’un certificat auto-signé.

Pour voir quels utilisateurs utilisent une connexion chiffrée, exécutez la requête suivante (Performance Schema doit être activé) :

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;

Chiffrement du transport uniquement

Configuration MySQL

Les versions modernes de la base de données sont prêtes à l'emploi pour le mode de chiffrement required. Un certificat côté serveur sera créé après la configuration initiale et le lancement.

Créez des utilisateurs et des rôles pour les composants principaux :

Pour les versions MySQL 8.4+, caching_sha2_password doit être utilisé à la place de mysql_native_password.

mysql> CREATE USER
 'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
 'zbx_web'@'%' IDENTIFIED WITH mysql_native_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'@'%';

Notez que le protocole X.509 n'est pas utilisé pour vérifier l'identité, mais que l'utilisateur est configuré pour n'utiliser que des connexions chiffrées. Consultez la documentation MySQL pour plus de détails sur la configuration des utilisateurs.

Exécutez la commande suivante pour vérifier la connexion (une connexion par socket ne peut pas être utilisée pour tester des connexions sécurisées) :

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

Vérifiez l'état actuel et les suites de chiffrement disponibles :

mysql> status
--------------
mysql Ver 8.0.21 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:
No query specified

Interface web

Pour activer le chiffrement du transport uniquement pour les connexions entre l’interface web Zabbix et la base de données :

  • Cochez Database TLS encryption
  • Laissez Verify database certificate décoché

Serveur

Pour activer le chiffrement du transport uniquement pour les connexions entre le serveur et la base de données, configurez /etc/zabbix/zabbix_server.conf :

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

Chiffrement avec vérification de l’autorité de certification

Copiez l’autorité de certification MySQL requise sur le serveur frontend Zabbix, puis attribuez les permissions appropriées pour permettre au serveur web de lire ce fichier.

Ce mode ne fonctionne pas sur RHEL 7 en raison de bibliothèques MySQL plus anciennes.

Frontend

Pour activer le chiffrement avec vérification du certificat pour les connexions entre le frontend Zabbix et la base de données :

  • Cochez Database TLS encryption et Verify database certificate
  • Indiquez le chemin vers le fichier CA TLS de la base de données

Vous pouvez également définir cela dans /etc/zabbix/web/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'] = '';
...

Pour le dépannage, utilisez l’outil en ligne de commande afin de vérifier si la connexion est possible pour l’utilisateur requis :

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

Serveur

Pour activer le chiffrement avec vérification du certificat pour les connexions entre le serveur Zabbix et la base de données, configurez /etc/zabbix/zabbix_server.conf :

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

Chiffrement avec vérification complète

Configuration MySQL

Définissez l'option de configuration du serveur MySQL CE (/etc/my.cnf.d/server-tls.cnf) sur :

[mysqld]
...
# dans cet exemple, les clés se trouvent dans le répertoire datadir de MySQL CE
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

require_secure_transport=ON
tls_version=TLSv1.3
...

Les clés pour le serveur MySQL CE et le client (interface Zabbix) doivent être créées manuellement conformément à la documentation MySQL CE : Creating SSL and RSA certificates and keys using MySQL ou Creating SSL certificates and keys using openssl

Le certificat du serveur MySQL doit contenir le champ Common Name défini sur le nom FQDN, car l'interface Zabbix utilisera le nom DNS pour communiquer avec la base de données ou l'adresse IP de l'hôte de la base de données.

Créez l'utilisateur MySQL :

Pour les versions MySQL 8.4+, caching_sha2_password doit être utilisé à la place de mysql_native_password.

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

Vérifiez qu'il est possible de se connecter avec cet utilisateur :

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

Interface

Pour activer le chiffrement avec vérification complète des connexions entre l'interface Zabbix et la base de données :

  • Cochez Database TLS encryption et Verify database certificate
  • Indiquez le chemin du fichier Database TLS key file
  • Indiquez le chemin du fichier Database TLS CA file
  • Indiquez le chemin du fichier Database TLS certificate file

Notez que Database host verification est cochée et grisée - cette étape ne peut pas être ignorée pour MySQL.

Si le champ Database TLS cipher list est laissé vide, les chiffrements communs autorisés à la fois par l'interface (client) et le serveur seront activés. Sinon, les chiffrements peuvent être définis explicitement, conformément aux exigences de configuration des chiffrements.

Sinon, cela peut être défini dans /etc/zabbix/web/zabbix.conf.php :

...
// Used for TLS connection with strictly defined Cipher list.
$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';
...
// or
...
// Used for TLS connection without Cipher list defined - selected by MySQL server
$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'] = '';
...

Serveur

Pour activer le chiffrement avec vérification complète pour les connexions entre le serveur Zabbix et la base de données, configurez /etc/zabbix/zabbix_server.conf :

...
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
...