This is a translation of the original English documentation page. Help us make it better.

1 MySQL encryption configuration

Aperçu

Cette section fournit plusieurs exemples de configuration de chiffrement pour CentOS 8.2 et MySQL 8.0.21 et peut être utilisé 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 disponible. Dans ce cas, une connexion entre l'interface Zabbix et la base de données utilise un fichier socket (sous Unix) ou une mémoire partagée (sous Windows) et ne peut pas être crypté.

La liste de combinaisons de cryptage ne se limitent pas à celles répertoriées sur cette page. Il y a beaucoup plus de combinaisons disponibles.

Conditions préalables

Installez la base de données MySQL à partir du référentiel officiel.

Voir la documentation MySQL pour plus de détails sur l'utilisation du référentiel 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 (le schéma de performances doit être activé) :

mysql> 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'
               ORDRE BY tls_version ;

Mode requis

Configuration MySQL

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

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

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 l'utilisateur est configuré pour utiliser uniquement des connexions cryptées. Voir Documentation MySQL pour plus de détails sur la configuration des utilisateurs.

Exécuter pour vérifier la connexion (la connexion socket ne peut pas être utilisée pour tester les 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

Frontend

Pour activer le chiffrement de transport uniquement pour les connexions entre Zabbix frontend et la base de données :

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

Serveur

Pour activer le chiffrement de 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
       NomDB=zabbix
       DBUser=zbx_srv
       DBPassword=<strong_password>
       DBTLSConnect=obligatoire
       ...

Vérifier le mode CA

Copiez l'autorité de certification MySQL requise sur le serveur frontal Zabbix, attribuez les autorisations pour autoriser le serveur Web à lire ce fichier.

Le mode Vérify CA ne fonctionne pas sur SLES 12 et RHEL 7 en raison d'anciennes bibliothèques MySQL.

Frontend

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

  • Cochez Database TLS encryption et Verify database certificate
  • Spécifiez le chemin d'accès au fichier CA TLS de la base de données

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

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

Dépannez l'utilisateur à l'aide de l'outil de ligne de commande pour vérifier si la connexion est possible pour l'utilisateur requis :

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

Serveur

Pour activer le chiffrement avec vérification de 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
       NomDB=zabbix
       DBUser=zbx_srv
       DBPassword=<strong_password>
       DBTLSConnect=verify_ca
       DBTLSCAFile=/etc/ssl/mysql/ca.pem
       ...

Vérifier le mode Full

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 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 et le client MySQL CE (interface Zabbix) doivent être créées manuellement conformément à la documentation MySQl CE : Création de certificats et de clés SSL et RSA à l'aide de MySQL ou Création de certificats et de clés SSL à l'aide d'openssl

Le certificat du serveur MySQL doit contenir le champ Nom commun 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 un utilisateur MySQL :

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 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 des connexions entre l'interface Zabbix et la base de données :

  • Vérifiez le cryptage TLS de la base de données et vérifier le certificat de la base de données
  • Spécifiez le chemin d'accès au fichier de la clé TLS de la base de données
  • Spécifiez le chemin d'accès au fichier CA TLS de la base de données
  • Spécifiez le chemin d'accès au fichier de certificat TLS de la base de données

Notez que la vérification de l'hôte de la base de données est cochée et grisée - cette étape ne peut pas être ignorée pour MySQL.

La liste de chiffrement doit être vide, afin que l'interface et le serveur puissent négocier celui requis supporté par les deux extrémités.

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

...
       // Utilisé pour la connexion TLS avec une liste de chiffrement strictement définie.
       $DB['ENCRYPTION'] = vrai ;
       $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' ;
       ...
       // ou
       ...
       // Utilisé pour la connexion TLS sans liste de chiffrement définie - sélectionné par le serveur MySQL
       $DB['ENCRYPTION'] = vrai ;
       $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 des connexions entre le serveur Zabbix et la base de données, configurez /etc/zabbix/zabbix_server.conf :

...
       DBHost=10.211.55.9
       NomDB=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
       ...