[comment]: # ({f745f323-f745f323})
# 1 Configuration du chiffrement MySQL

[comment]: # ({/f745f323-f745f323})

[comment]: # ({ef7f6a8e-f87c5964})
### 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.

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

::: noteclassic
 La liste des combinaisons de chiffrement
n'est pas limitée à celles répertoriées sur cette page. De nombreuses autres
combinaisons sont disponibles.
:::

[comment]: # ({/ef7f6a8e-f87c5964})

[comment]: # ({30b5ee7b-30b5ee7b})
### Prérequis

Installez la base de données MySQL depuis le [dépôt officiel](https://dev.mysql.com/downloads/repo/yum/).

Consultez la [documentation MySQL](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/) 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é) :

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

[comment]: # ({/30b5ee7b-30b5ee7b})

[comment]: # ({7b44fd81-fda36821})
### Chiffrement du transport uniquement

[comment]: # ({/7b44fd81-fda36821})

[comment]: # ({e7c676d6-9ebeae19})
#### Configuration MySQL

Les versions modernes de la base de données sont prêtes à l'emploi pour le mode de chiffrement `required` [mode de chiffrement](/manual/appendix/install/db_encrypt#terminology). 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 :

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

```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 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](https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-tls) 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: zbx_srv@bfdb.local
    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

[comment]: # ({/e7c676d6-9ebeae19})

[comment]: # ({68afdcc8-68afdcc8})
#### Interface

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

-   Cochez *Chiffrement TLS de la base de données*
-   Laissez *Vérifier le certificat de la base de données* décoché

![](../../../../../assets/en/manual/appendix/install/encrypt_db_transport.png){width="600"}

[comment]: # ({/68afdcc8-68afdcc8})

[comment]: # ({99c0e65b-99c0e65b})
#### Serveur

Pour activer le chiffrement uniquement pour le transport des 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
    ...

[comment]: # ({/99c0e65b-99c0e65b})

[comment]: # ({baccf022-82e1ed59})
### Chiffrement avec vérification de l'autorité de certification

Copiez le CA MySQL requis sur le serveur de l'interface Zabbix et attribuez les
permissions appropriées pour permettre au serveur web de lire ce fichier.

::: noteclassic
 Ce mode ne fonctionne pas sur SLES 12 et RHEL 7 en raison de
bibliothèques MySQL plus anciennes.
:::

[comment]: # ({/baccf022-82e1ed59})

[comment]: # ({f7df2e5a-9776435f})
#### Interface

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

-   Cochez *Chiffrement TLS de la base de données* et *Vérifier le certificat de la base de données*
-   Indiquez le chemin vers le fichier CA TLS de la base de données

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_ca.png){width="600"}

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 dépanner, 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

[comment]: # ({/f7df2e5a-9776435f})

[comment]: # ({a7a54f92-a7a54f92})
#### 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
    ...

[comment]: # ({/a7a54f92-a7a54f92})

[comment]: # ({edf12bed-fa5d4760})
### Chiffrement avec vérification complète

[comment]: # ({/edf12bed-fa5d4760})

[comment]: # ({7d0dc4f4-22fb0ddd})
#### 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 et le client MySQL CE (interface Zabbix) doivent être
créées manuellement conformément à la documentation MySQL CE : [Creating SSL
and RSA certificates and keys using
MySQL](https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-rsa-files-using-mysql.html) ou
[Creating SSL certificates and keys using
openssl](https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html)

::: noteimportant
 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 :

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

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

[comment]: # ({/7d0dc4f4-22fb0ddd})

[comment]: # ({86a97b70-2f3a5c57})
#### Interface

Pour activer le chiffrement avec vérification complète pour les connexions entre
l'interface 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ée et grisée - cette
étape ne peut pas être ignorée pour MySQL. 

::: notewarning
 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](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration).
:::

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_full1.png){width=600}

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

    ...
    // Utilisé pour une connexion TLS avec une liste de chiffrements strictement définie.
    $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';
    ...
    // ou
    ...
    // Utilisé pour une connexion TLS sans liste de chiffrements définie - sélectionnée par le serveur 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'] = '';
    ...

[comment]: # ({/86a97b70-2f3a5c57})

[comment]: # ({c0090000-c0090000})
#### 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
    ...

[comment]: # ({/c0090000-c0090000})
