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

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

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

Dieser Abschnitt enthält mehrere Beispiele für Verschlüsselungskonfigurationen für
CentOS 8.2 und MySQL 8.0.30 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 Verschlüsselungsoptionen nicht
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 viele
weitere Kombinationen verfügbar. 
:::

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

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

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

Weitere Informationen zur Verwendung des MySQL-Repositories 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 auf ON gesetzt sein):

    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})
### Nur-Transport-Verschlüsselung

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

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

Moderne Versionen der Datenbank sind standardmäßig für den [erforderlichen Verschlüsselungsmodus](/manual/appendix/install/db_encrypt#terminology) vorbereitet. Nach der Erstkonfiguration und dem Start wird ein Zertifikat auf Serverseite erstellt.

Erstellen Sie Benutzer und Rollen für die Hauptkomponenten:

::: noteimportant
Für MySQL-Versionen 8.4+ sollte `caching_sha2_password` anstelle von `mysql_native_password` verwendet werden.
:::

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

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

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

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

Aktuellen Status und verfügbare Cipher Suites prüfen:

    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})
#### Frontend

Um ausschließlich 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]: # ({/68afdcc8-68afdcc8})

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

Um nur die Transportverschlüsselung für Verbindungen zwischen Server und
der Datenbank zu aktivieren, konfigurieren Sie */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})
### Verschlüsselung mit Zertifizierungsstellenprüfung

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

::: noteclassic
 Dieser Modus funktioniert auf SLES 12 und RHEL 7 aufgrund
älterer MySQL-Bibliotheken nicht.
:::

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

[comment]: # ({f7df2e5a-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 Datei *Database TLS CA* 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:

    ...
    $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 das Befehlszeilentool verwenden, um zu prüfen, ob die Verbindung
für den erforderlichen Benutzer möglich ist:

    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})
#### Server

Um die Verschlüsselung mit Zertifikatsprüfung für Verbindungen
zwischen Zabbix Server und der Datenbank zu aktivieren, konfigurieren Sie
*/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})
### Verschlüsselung mit vollständiger Verifizierung

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

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

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

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

Die 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.0/en/creating-ssl-rsa-files-using-mysql.html) oder
[Creating SSL certificates and keys using
openssl](https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html)

::: noteimportant
 Das Serverzertifikat von MySQL sollte im Feld
Common Name den FQDN-Namen enthalten, da das Zabbix Frontend den
DNS-Namen für die Kommunikation mit der Datenbank oder die IP-Adresse des
Datenbank-Hosts verwendet.
:::

MySQL-Benutzer erstellen:

::: noteimportant
Für MySQL-Versionen 8.4+ sollte `caching_sha2_password` anstelle von `mysql_native_password` verwendet werden.
:::

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

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

    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})
#### Frontend

Um die Verschlüsselung mit vollständiger Verifizierung 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 key file* an
-   Geben Sie den Pfad zur *Database TLS CA file* an
-   Geben Sie den Pfad zur *Database TLS certificate file* an

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

::: notewarning
 Wenn das Feld *Database TLS cipher list* leer gelassen wird, werden die von Frontend (Client) und Server gemeinsam zulässigen Standard-Cipher aktiviert.
 Alternativ können die Cipher explizit gemäß den
 [Anforderungen an die Cipher-Konfiguration](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration) festgelegt werden.
:::

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

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

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

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

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

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