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