1 Konfiguracja szyfrowania MySQL

Przegląd

Ta sekcja zawiera kilka przykładów konfiguracji szyfrowania dla CentOS 8.2 i MySQL 8.0.21, które można wykorzystać jako szybki przewodnik konfiguracji szyfrowania połączenia z bazą danych.

Jeśli host MySQL jest ustawiony na localhost, opcje szyfrowania nie będą dostępne. W tym przypadku połączenie między frontendem Zabbix a bazą danych korzysta z pliku gniazda (w systemach Unix) lub pamięci współdzielonej (w systemach Windows) i nie może być szyfrowane.

Lista kombinacji szyfrowania nie jest ograniczona do tych wymienionych na tej stronie. Dostępnych jest znacznie więcej kombinacji.

Wymagania wstępne

Zainstaluj bazę danych MySQL z oficjalnego repozytorium.

Zobacz dokumentację MySQL aby uzyskać szczegółowe informacje na temat korzystania z repozytorium MySQL.

Serwer MySQL jest gotowy do akceptowania bezpiecznych połączeń przy użyciu certyfikatu z podpisem własnym (self-signed).

Aby zobaczyć, którzy użytkownicy korzystają z połączenia zaszyfrowanego, uruchom następujące zapytanie (Performance Schema powinno być WŁĄCZONE):

mysql> 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;

Tryb required

Konfiguracja MySQL

Nowoczesne wersje bazy danych są gotowe od razu dla trybu 'required' szyfrowania. Certyfikat po stronie serwera zostanie utworzony po początkowej konfiguracji i uruchomieniu.

Utwórz użytkowników i role dla głównych składników:

mysql> CREATE USER   
        'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',   
        'zbx_web'@'%' IDENTIFIED WITH mysql_native_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 zauważyć, że protokół X.509 nie jest używany do sprawdzania tożsamości, ale użytkownik jest skonfigurowany do korzystania tylko z szyfrowanych połączeń. Zobacz dokumentację MySQL po więcej szczegółów dotyczących konfigurowania użytkowników.

Uruchom, aby sprawdzić połączenie (połączenie do gniazda nie może być używane do testowania bezpiecznych połączeń):

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

Sprawdź aktualny status i dostępne zestawy szyfrów:

mysql> status
       --------------
       mysql Ver 8.0.21 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ć wyłącznie szyfrowanie warstwy transportowej dla połączeń między frontendem Zabbix a bazą danych:

  • Zaznacz Szyfrowanie bazy danych TLS
  • Pozostaw niezaznaczone Zweryfikuj certyfikat bazy danych

Serwer

Aby włączyć wyłącznie szyfrowanie warstwy transportowej 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
       ...

Tryb Verify CA

Skopiuj wymagane CA MySQL na serwer frontend Zabbix, nadaj odpowiednie uprawnienia, aby umożliwić serwerowi WWW odczytanie tego pliku.

Tryb Verify CA nie działa na systemach SLES 12 i RHEL 7 z powodu starszych bibliotek MySQL.

Frontend

Aby włączyć szyfrowanie z weryfikacją certyfikatu dla połączeń między frontendem Zabbix a bazą danych:

  • Zaznacz Szyfrowanie bazy danych TLS i Zweryfikuj certyfikat bazy danych
  • Określ ścieżkę do pliku CA TLS bazy danych

Alternatywnie, można to ustawić w /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'] = '';
       ...

Rozwiązywanie problemów z użytkownikiem za pomocą 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
       ...

Tryb Verify Full

Konfiguracja MySQL

Ustaw opcję konfiguracyjną serwera MySQL CE (/etc/my.cnf.d/server-tls.cnf) na:

[mysqld]
       ...
       # w tym przykładzie klucze znajdują się w katalogu datadir serwera 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 MySQL CE i klienta (frontend Zabbix) powinny być utworzone ręcznie zgodnie z dokumentacją MySQL CE: Tworzenie certyfikatów SSL i kluczy RSA za pomocą MySQL lub Tworzenie certyfikatów SSL i kluczy za pomocą openssl

Certyfikat serwera MySQL powinien zawierać pole Common Name ustawione na nazwę pełną domeny, 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 mysql_native_password BY '<strong_password>',
         'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
         REQUIRE X509
         PASSWORD HISTORY 5;

Sprawdź, czy możliwe jest zalogowanie 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ą dla połączeń między frontendem Zabbix a bazą danych:

  • Zaznacz Szyfrowanie bazy danych TLS i Zweryfikuj 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

Zauważ, że Zweryfikuj certyfikat bazy danych jest zaznaczona i wyszarzona - ten krok nie może zostać pominięty dla MySQL.

Lista szyfrów powinna być pusta, aby frontend i serwer mogły negocjować wymagany szyfr z listy obsługiwanych przez obie strony.

Alternatywnie, można to ustawić w /etc/zabbix/web/zabbix.conf.php:

...
       // Używane dla połączenia TLS z ś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 dla połączenia TLS bez zdefiniowanej listy szyfrów - wybrane 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ą 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
       ...