Konfiguracja szyfrowania MySQL
Omówienie
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 do 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 korzysta z pliku gniazda (na Unix) lub pamięci współdzielonej (na 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 znajdziesz w dokumentacji MySQL.
serwer MySQL jest gotowy do akceptowania bezpiecznych połączeń przy użyciu certyfikatu samopodpisanego.
Aby sprawdzić, którzy użytkownicy korzystają z szyfrowanego połączenia, uruchom następujące zapytanie (Performance Schema powinno 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 tylko transportu
Konfiguracja MySQL
Nowoczesne wersje bazy danych są gotowe od razu do użycia z wymaganym trybem szyfrowania. Po początkowej konfiguracji i uruchomieniu zostanie utworzony certyfikat po stronie serwera.
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 korzystać wyłącznie z szyfrowanych połączeń. Więcej informacji o konfiguracji użytkowników można znaleźć w dokumentacji MySQL.
Uruchom, aby sprawdzić połączenie (połączenie 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:
Nie określono zapytania
Frontend
Aby włączyć szyfrowanie wyłącznie transportowe dla połączeń między frontendem Zabbixa a bazą danych:
- Zaznacz Database TLS encryption
- Pozostaw niezaznaczone Verify database certificate

Serwer
Aby włączyć szyfrowanie wyłącznie transportowe dla połączeń między serwerem a bazą danych, edytuj plik konfiguracyjny serwera:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Szyfrowanie z weryfikacją urzędu certyfikacji
Skopiuj wymagany certyfikat CA MySQL na serwer frontend Zabbixa i nadaj 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 a bazą danych:
- Zaznacz Szyfrowanie TLS bazy danych oraz Weryfikuj certyfikat bazy danych
- Określ ścieżkę do pliku CA TLS bazy danych

Alternatywnie można to ustawić w pliku konfiguracyjnym frontend (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'] = '';
...
Rozwiąż problem, używając narzędzia wiersza poleceń do sprawdzenia, 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, edytuj plik konfiguracyjny serwera:
...
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) powinny zostać utworzone 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żna zalogować się tym użytkownikiem:
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ą połączeń między frontendem Zabbix a bazą danych:
- Zaznacz Szyfrowanie TLS bazy danych oraz Weryfikuj certyfikat bazy danych
- Określ ścieżkę do pliku klucza TLS bazy danych
- Określ ścieżkę do pliku CA TLS bazy danych
- Określ ścieżkę do pliku certyfikatu TLS bazy danych
Zwróć uwagę, że opcja Weryfikacja hosta bazy danych jest zaznaczona i wyszarzona - tego kroku nie można pominąć w przypadku MySQL.
Jeśli pole Lista szyfrów TLS bazy danych 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 dotyczącymi konfiguracji szyfrów.

Alternatywnie można to ustawić w pliku konfiguracyjnym frontendu (zabbix.conf.php):
...
// Używane do połączenia TLS ze ściśle określoną listą szyfrów.
$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';
...
// lub
...
// Używane do połączenia TLS bez zdefiniowanej listy szyfrów - wybieranej przez serwer 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'] = '';
...
Serwer
Aby włączyć szyfrowanie z pełną weryfikacją połączeń między serwerem Zabbix a bazą danych, edytuj plik konfiguracyjny serwera:
...
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
...