1 Configuration du chiffrement MySQL
Aperçu
Cette section fournit plusieurs exemples de configuration du chiffrement pour CentOS 8.2 et MySQL 8.4.0 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 le frontend Zabbix et la base de données utilise un fichier socket (sous Unix) ou la mémoire partagée (sous Windows) et ne peut pas être chiffrée.
La liste des combinaisons de chiffrement n’est pas limitée à celles indiquées sur cette page. Il existe beaucoup d’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 de 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 démarrage.
Créez des utilisateurs et des rôles pour les composants principaux :
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'@'%';
Notez que le protocole X.509 n’est pas utilisé pour vérifier l’identité, mais que l’utilisateur est configuré pour utiliser uniquement 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.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:
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 de MySQL
Définissez l'option de configuration du serveur MySQL CE (/etc/my.cnf.d/server-tls.cnf) comme suit :
[mysqld]
...
# dans cet exemple, les clés sont situées 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 (frontend 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 le frontend 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 :
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;
Vérifiez s'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 web
Pour activer le chiffrement avec vérification complète pour les connexions entre l’interface web Zabbix et la base de données :
- Cochez Database TLS encryption et Verify database certificate
- Indiquez le chemin vers Database TLS key file
- Indiquez le chemin vers Database TLS CA file
- Indiquez le chemin vers Database TLS certificate file
Notez que Database host verification est coché et grisé : cette étape ne peut pas être ignorée pour MySQL.
Si le champ Database TLS cipher list est laissé vide, les suites de chiffrement communes autorisées à la fois par l’interface web (client) et le serveur seront activées. Sinon, les suites de chiffrement peuvent être définies explicitement, conformément aux exigences de configuration des suites de chiffrement.

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