1 MySQL-coderingsconfiguratie

Overzicht

Dit gedeelte biedt verschillende voorbeelden van coderingsconfiguraties voor: CentOS 8.2 en MySQL 8.0.21 en kan worden gebruikt als een snelstartgids voor: versleuteling van de verbinding met de database.

Als MySQL-host is ingesteld op localhost, encryptie-opties niet: verkrijgbaar. In dit geval een verbinding tussen Zabbix frontend en de database gebruikt een socketbestand (op Unix) of gedeeld geheugen (op Windows) en kan niet worden versleuteld.

Lijst met codering combinaties is niet beperkt tot degene die op deze pagina worden vermeld. Er zijn een veel meer combinaties beschikbaar.

Vereisten

Installeer MySQL-database vanaf de officiële repository.

Zie MySQL documentatie voor details over het gebruik van MySQL-repo.

MySQL-server is klaar om beveiligde verbindingen te accepteren met behulp van een zelfondertekend certificaat.

Om te zien welke gebruikers een versleutelde verbinding gebruiken, voer je het volgende uit: query (Prestatieschema moet AAN staan):

mysql> SELECT sbt.variable_value AS tls_version, t2.variable_value AS-codering, processlist_user AS-gebruiker, 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;

Vereiste modus

MySQL-configuratie

Moderne versies van de database zijn standaard klaar voor de 'vereiste' versleutelingsmodus. Een server-side certificaat wordt aangemaakt na initiële installatie en start.

Maak gebruikers en rollen aan voor de belangrijkste componenten:

mysql> CREATE USER   
        'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<sterk_wachtwoord>',   
        'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<sterk_wachtwoord>'
        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'@'%';

Merk op dat het X.509-protocol niet wordt gebruikt om de identiteit te controleren, maar de gebruiker is geconfigureerd om alleen versleutelde verbindingen te gebruiken. Raadpleeg MySQL documentatie voor meer details over het configureren van gebruikers.

Voer het volgende uit om de verbinding te controleren (een socketverbinding kan niet worden gebruikt om beveiligde verbindingen te testen):

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

Controleer de huidige status en beschikbare ciphersuites:

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

Frontend

Om alleen transportversleuteling in te schakelen voor verbindingen tussen Zabbix frontend en de database:

  • Controleer Database TLS-versleuteling
  • Laat Controleer databasecertificaat niet aangevinkt

Server

Om alleen-transportversleuteling in te schakelen voor verbindingen tussen server en de database, configureer /etc/zabbix/zabbix_server.conf:

...
       DBHost=10.211.55.9
       DBName=zabbix
       DBUserr=zbx_srv
       DBPassword=<strong_password>
       DBTLSConnect=required
       ...

CA-modus verifiëren

Kopieer de vereiste MySQL CA naar de Zabbix frontend-server, wijs de juiste toe permissies om de webserver dit bestand te laten lezen.

Controleer of CA-modus niet werkt op SLES 12 en RHEL 7 vanwege: oudere MySQL-bibliotheken.

Frontend

Om versleuteling met certificaatverificatie in te schakelen voor verbindingen tussen Zabbix frontend en de database:

  • Vink Database TLS-versleuteling en Controleer databasecertificaat aan
  • Geef het pad naar het Database TLS CA-bestand op

Als alternatief kan dit worden ingesteld in /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'] = '';
       ...

Los problemen op door de gebruiker te controleren met behulp van de opdrachtregeltool om te controleren of er een verbinding mogelijk is voor de vereiste gebruiker:

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

Server

Versleuteling inschakelen met certificaatverificatie voor verbindingen tussen Zabbix-server en de database, configure /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
       ...

Controleer de volledige modus

MySQL-configuratie

Stel de configuratieoptie van de MySQL CE-server (/etc/my.cnf.d/server-tls.cnf) in op:

[mysqld]
       ...
       # in deze voorbeelden bevinden de sleutels zich in de MySQL CE-datadir-directory
       ssl_ca=ca.pem
       ssl_cert=server-cert.pem
       ssl_key=server-key.pem
       
       require_secure_transport=ON
       tls_version=TLSv1.3
       ...

Sleutels voor de MySQL CE-server en client (Zabbix frontend) moeten handmatig worden aangemaakt volgens de MySQL CE-documentatie: SSL- en RSA-certificaten en sleutels maken met MySQL of SSL-certificaten en sleutels maken met openssl

Het MySQL-servercertificaat moet het veld Common Name bevatten dat is ingesteld op de FQDN-naam, aangezien Zabbix frontend de DNS-naam zal gebruiken om met de database te communiceren, of het IP-adres van de databasehost.

Maak een MySQL-gebruiker aan:

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;

Controleer of het mogelijk is om in te loggen met die gebruiker:

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

Frontend

Om versleuteling met volledige verificatie in te schakelen voor verbindingen tussen de Zabbix-frontend en de database:

  • Vink het vakje "Database TLS-encryptie" aan en "Verifieer databasecertificaat"
  • Geef het pad op naar het Database TLS-sleutelbestand
  • Geef het pad op naar het Database TLS CA-bestand
  • Geef het pad op naar het Database TLS-certificaatbestand

Let op, het vakje "Databasehost verifiëren" is aangevinkt en grijs - deze stap kan niet worden overgeslagen voor MySQL.

De lijst met versleutelingsmethodes (Cipher list) moet leeg zijn, zodat de frontend en server de vereiste methode kunnen onderhandelen uit de ondersteunde methodes die door beide uiteinden worden ondersteund.

Dit kan ook worden ingesteld in het bestand /etc/zabbix/web/zabbix.conf.php:

...
       // Gebruikt voor TLS-verbinding met strikt gedefinieerde Cipher-lijst.
       $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';
       ...
       // of
       ...
       // Gebruikt voor TLS-verbinding zonder gedefinieerde Cipher-lijst - geselecteerd door de 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'] = '';
       ...

Server

Versleuteling inschakelen met volledige verificatie voor verbindingen tussen: Zabbix-server en de database, configureren /etc/zabbix/zabbix_server.conf:

...
       DBHost=10.211.55.9
       DBName=zabbix
       DBU-gebruiker=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
       ...