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