[comment]: # ({f745f323-f745f323})
# 1 MySQL-Verschlüsselungskonfiguration

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

[comment]: # ({355d8b52-f87c5964})
### Überblick

Dieser Abschnitt enthält mehrere Beispiele für die Verschlüsselungskonfiguration für CentOS 8.2 und MySQL 8.4.0 und kann als Schnellstartanleitung für die Verschlüsselung der Verbindung zur Datenbank verwendet werden. 

::: noteimportant
Wenn der MySQL-Host auf localhost gesetzt ist, sind keine Verschlüsselungsoptionen verfügbar.
In diesem Fall verwendet eine Verbindung zwischen dem Zabbix Frontend und der Datenbank eine Socket-Datei (unter Unix) oder Shared Memory (unter Windows) und kann nicht verschlüsselt werden.
:::

::: noteclassic
Die Liste der Verschlüsselungskombinationen ist nicht auf die auf dieser Seite aufgeführten beschränkt.
Es sind noch viele weitere Kombinationen verfügbar.
:::

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

[comment]: # ({8cb2ef57-30b5ee7b})
### Voraussetzungen

Installieren Sie die MySQL-Datenbank aus dem [offiziellen Repository](https://dev.mysql.com/downloads/repo/yum/).

Weitere Informationen zur Verwendung des MySQL-Repositorys finden Sie in der [MySQL-Dokumentation](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/).

Der MySQL-Server ist bereit, sichere Verbindungen mit einem selbstsignierten Zertifikat zu akzeptieren.

Um zu sehen, welche Benutzer eine verschlüsselte Verbindung verwenden, führen Sie die folgende Abfrage aus (Performance Schema sollte aktiviert sein):

```sqlmysql
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]: # ({/8cb2ef57-30b5ee7b})

[comment]: # ({7b44fd81-fda36821})
### Nur-Transport-Verschlüsselung

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

[comment]: # ({1727050e-9ebeae19})
#### MySQL-Konfiguration

Moderne Versionen der Datenbank sind sofort einsatzbereit für den `required`-[Verschlüsselungsmodus](/manual/appendix/install/db_encrypt#terminology).
Ein serverseitiges Zertifikat wird nach der Ersteinrichtung und dem Start erstellt.

Erstellen Sie Benutzer und Rollen für die Hauptkomponenten:

```sqlmysql
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'@'%';
```

Beachten Sie, dass das X.509-Protokoll nicht zur Identitätsprüfung verwendet wird, sondern der Benutzer so konfiguriert ist, dass nur verschlüsselte Verbindungen verwendet werden.
Weitere Details zur Konfiguration von Benutzern finden Sie in der [MySQL-Dokumentation](https://dev.mysql.com/doc/refman/8.4/en/create-user.html#create-user-tls).

Führen Sie Folgendes aus, um die Verbindung zu prüfen (eine Socket-Verbindung kann nicht zum Testen sicherer Verbindungen verwendet werden):

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

Prüfen Sie den aktuellen Status und die verfügbaren Cipher Suites:

```sqlmysql
mysql> status
--------------
mysql Ver 8.4.0 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]: # ({/1727050e-9ebeae19})

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

Um eine reine Transportverschlüsselung für Verbindungen zwischen dem Zabbix Frontend und der Datenbank zu aktivieren:

-   Aktivieren Sie *Database TLS encryption*
-   Lassen Sie *Verify database certificate* deaktiviert

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

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

[comment]: # ({28b4b1c0-99c0e65b})
#### Server

Um eine reine Transportverschlüsselung für Verbindungen zwischen Server und der Datenbank zu aktivieren, konfigurieren Sie */etc/zabbix/zabbix\_server.conf*:

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

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

[comment]: # ({627a05e9-fa9ec203})
### Verschlüsselung mit Verifizierung der Zertifizierungsstelle

Kopieren Sie die erforderliche MySQL-CA auf den Zabbix-Frontend-Server und weisen Sie die entsprechenden Berechtigungen zu, damit der Webserver diese Datei lesen kann.

::: noteclassic
Dieser Modus funktioniert unter RHEL 7 aufgrund älterer MySQL-Bibliotheken nicht.
:::

[comment]: # ({/627a05e9-fa9ec203})

[comment]: # ({4cb2ce06-9776435f})
#### Frontend

Um die Verschlüsselung mit Zertifikatsprüfung für Verbindungen zwischen dem Zabbix Frontend und der Datenbank zu aktivieren:

-   Aktivieren Sie *Database TLS encryption* und *Verify database certificate*
-   Geben Sie den Pfad zur Database-TLS-CA-Datei an

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

Alternativ kann dies in */etc/zabbix/web/zabbix.conf.php* festgelegt werden:

```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'] = '';
...
```

Zur Fehlerbehebung kann der Benutzer mit einem Befehlszeilenwerkzeug prüfen, ob eine Verbindung für den erforderlichen Benutzer möglich ist:

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

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

[comment]: # ({cfd9329e-a7a54f92})
#### Server

Um die Verschlüsselung mit Zertifikatsprüfung für Verbindungen zwischen dem Zabbix Server und der Datenbank zu aktivieren, konfigurieren Sie */etc/zabbix/zabbix\_server.conf*:

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

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

[comment]: # ({edf12bed-fa5d4760})
### Verschlüsselung mit vollständiger Verifizierung

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

[comment]: # ({86a84990-22fb0ddd})
#### MySQL-Konfiguration

Setzen Sie die Konfigurationsoption des MySQL CE-Servers (*/etc/my.cnf.d/server-tls.cnf*) auf:

```ini
[mysqld]
...
# in diesem Beispiel befinden sich die Schlüssel im MySQL CE-Datadir-Verzeichnis
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

require_secure_transport=ON
tls_version=TLSv1.3
...
```

Schlüssel für den MySQL CE-Server und den Client (Zabbix Frontend) sollten gemäß der MySQL CE-Dokumentation manuell erstellt werden: [Creating SSL and RSA certificates and keys using MySQL](https://dev.mysql.com/doc/refman/8.4/en/creating-ssl-rsa-files-using-mysql.html) oder [Creating SSL certificates and keys using openssl](https://dev.mysql.com/doc/refman/8.4/en/creating-ssl-files-using-openssl.html)

::: noteimportant
Das MySQL-Serverzertifikat sollte das Feld Common Name enthalten, das auf den FQDN-Namen gesetzt ist, da das Zabbix Frontend den DNS-Namen zur Kommunikation mit der Datenbank oder die IP-Adresse des Datenbank-Hosts verwendet.
:::

Erstellen Sie einen MySQL-Benutzer:

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

Prüfen Sie, ob eine Anmeldung mit diesem Benutzer möglich ist:

```bash
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]: # ({/86a84990-22fb0ddd})

[comment]: # ({165e89bf-2f3a5c57})
#### Frontend

So aktivieren Sie Verschlüsselung mit vollständiger Verifizierung für Verbindungen zwischen dem Zabbix Frontend und der Datenbank:

-   Aktivieren Sie *Database TLS encryption* und *Verify database certificate*
-   Geben Sie den Pfad zu *Database TLS key file* an
-   Geben Sie den Pfad zu *Database TLS CA file* an
-   Geben Sie den Pfad zu *Database TLS certificate file* an

Beachten Sie, dass *Database host verification* aktiviert und ausgegraut ist – dieser Schritt kann bei MySQL nicht übersprungen werden.

::: notewarning
Wenn das Feld *Database TLS cipher list* leer bleibt, werden die gemeinsamen Chiffren aktiviert, die sowohl vom Frontend (Client) als auch vom Server unterstützt werden.
Alternativ können die Chiffren explizit festgelegt werden, entsprechend den [Anforderungen an die Chiffrenkonfiguration](https://dev.mysql.com/doc/refman/8.4/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration).
:::

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

Alternativ kann dies in */etc/zabbix/web/zabbix.conf.php* festgelegt werden:

```php
...
// Wird für eine TLS-Verbindung mit streng definierter Chiffrenliste verwendet.
$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';
...
// oder
...
// Wird für eine TLS-Verbindung ohne definierte Chiffrenliste verwendet - Auswahl durch den 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'] = '';
...
```

[comment]: # ({/165e89bf-2f3a5c57})

[comment]: # ({e32ce094-c0090000})
#### Server

Um die Verschlüsselung mit vollständiger Verifizierung für Verbindungen zwischen dem Zabbix Server und der Datenbank zu aktivieren, konfigurieren Sie */etc/zabbix/zabbix\_server.conf*:

```ini
...
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]: # ({/e32ce094-c0090000})
