1 Konfiguracja szyfrowania MySQL
Przegląd
Ta sekcja zawiera kilka przykładów konfiguracji szyfrowania dla CentOS 8.2 i MySQL 8.4.0 i może służyć jako przewodnik szybkiego startu dotyczący szyfrowania połączenia z bazą danych.
Jeśli host MySQL jest ustawiony na localhost, opcje szyfrowania nie będą dostępne. W takim przypadku połączenie między frontendem Zabbix a bazą danych używa pliku socket (w systemach Unix) lub pamięci współdzielonej (w systemie Windows) i nie może być szyfrowane.
Lista kombinacji szyfrowania nie ogranicza się do tych wymienionych na tej stronie. Dostępnych jest znacznie więcej kombinacji.
Wymagania wstępne
Zainstaluj bazę danych MySQL z oficjalnego repozytorium.
Szczegółowe informacje o korzystaniu z repozytorium MySQL znajdują się w dokumentacji MySQL.
Serwer MySQL jest gotowy do akceptowania bezpiecznych połączeń z użyciem certyfikatu z podpisem własnym.
Aby sprawdzić, którzy użytkownicy korzystają z szyfrowanego połączenia, uruchom następujące zapytanie (Performance Schema musi być włączone):
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;
Szyfrowanie wyłącznie transportu
Konfiguracja MySQL
Nowoczesne wersje bazy danych są gotowe do użycia od razu po instalacji dla required trybu szyfrowania.
Certyfikat po stronie serwera zostanie utworzony po wstępnej konfiguracji i uruchomieniu.
Utwórz użytkowników i role dla głównych komponentów:
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'@'%';
Należy pamiętać, że protokół X.509 nie jest używany do sprawdzania tożsamości, ale użytkownik jest skonfigurowany tak, aby używać wyłącznie połączeń szyfrowanych. Więcej informacji o konfigurowaniu użytkowników można znaleźć w dokumentacji MySQL.
Uruchom, aby sprawdzić połączenie (połączenie przez socket nie może być użyte do testowania bezpiecznych połączeń):
mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED
Sprawdź bieżący stan i dostępne zestawy szyfrów:
mysql> status
--------------
mysql Ver 8.4.0 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
Aby włączyć szyfrowanie tylko transportu dla połączeń między frontend a bazą danych:
- Zaznacz Database TLS encryption
- Pozostaw Verify database certificate niezaznaczone

Serwer
Aby włączyć szyfrowanie wyłącznie transportu dla połączeń między serwerem a bazą danych, skonfiguruj /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Szyfrowanie z weryfikacją urzędu certyfikacji
Skopiuj wymagany urząd certyfikacji MySQL na serwer frontend Zabbix i ustaw odpowiednie uprawnienia, aby serwer WWW mógł odczytać ten plik.
Ten tryb nie działa w RHEL 7 z powodu starszych bibliotek MySQL.
Frontend
Aby włączyć szyfrowanie z weryfikacją certyfikatu dla połączeń między frontend Zabbix a bazą danych:
- Zaznacz Database TLS encryption i Verify database certificate
- Określ ścieżkę do pliku Database TLS CA

Alternatywnie można to ustawić w pliku /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'] = '';
...
Aby rozwiązać problemy, użyj narzędzia wiersza poleceń, aby sprawdzić, czy połączenie jest możliwe dla wymaganego użytkownika:
mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem
Serwer
Aby włączyć szyfrowanie z weryfikacją certyfikatu dla połączeń między serwerem Zabbix a bazą danych, skonfiguruj /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
...
Szyfrowanie z pełną weryfikacją
Konfiguracja MySQL
Ustaw opcję konfiguracji serwera MySQL CE (/etc/my.cnf.d/server-tls.cnf) na:
[mysqld]
...
# w tym przykładzie klucze znajdują się w katalogu datadir MySQL CE
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
tls_version=TLSv1.3
...
Klucze dla serwera i klienta MySQL CE (frontend Zabbix) należy utworzyć ręcznie zgodnie z dokumentacją MySQL CE: Creating SSL and RSA certificates and keys using MySQL lub Creating SSL certificates and keys using openssl
Certyfikat serwera MySQL powinien zawierać pole Common Name ustawione na nazwę FQDN, ponieważ frontend Zabbix będzie używać nazwy DNS do komunikacji z bazą danych lub adresu IP hosta bazy danych.
Utwórz użytkownika MySQL:
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;
Sprawdź, czy możliwe jest zalogowanie się przy użyciu tego użytkownika:
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
Aby włączyć szyfrowanie z pełną weryfikacją dla połączeń między frontendem Zabbix a bazą danych:
- Zaznacz Database TLS encryption oraz Verify database certificate
- Określ ścieżkę do Database TLS key file
- Określ ścieżkę do Database TLS CA file
- Określ ścieżkę do Database TLS certificate file
Zwróć uwagę, że opcja Database host verification jest zaznaczona i wyszarzona — tego kroku nie można pominąć w przypadku MySQL.
Jeśli pole Database TLS cipher list pozostanie puste, zostaną włączone wspólne szyfry dozwolone zarówno przez frontend (klienta), jak i serwer. Alternatywnie szyfry można ustawić jawnie, zgodnie z wymaganiami konfiguracji szyfrów.

Alternatywnie można to ustawić w pliku /etc/zabbix/web/zabbix.conf.php:
...
// 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'] = '';
...
Serwer
Aby włączyć szyfrowanie z pełną weryfikacją dla połączeń między serwerem Zabbix a bazą danych, skonfiguruj /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
...