Bezpieczne połączenie z bazą danych

Omówienie

Ta sekcja zawiera kroki konfiguracji Zabbix oraz przykłady konfiguracji dla bezpiecznych połączeń TLS między:

Database Zabbix components
MySQL Zabbix frontend, Zabbix serwer, Zabbix proxy
PostgreSQL Zabbix frontend, Zabbix serwer, Zabbix proxy

Aby skonfigurować szyfrowanie połączeń w obrębie DBMS, zapoznaj się ze szczegółami w oficjalnej dokumentacji producenta:

  • MySQL: serwery baz danych replikacji źródłowej i repliki.
  • MySQL: serwery baz danych replikacji grupowej itp.
  • PostgreSQL opcje szyfrowania.

Wszystkie przykłady opierają się na wydaniach GA MySQL CE (8.0) i PgSQL (13) dostępnych w oficjalnych repozytoriach przy użyciu CentOS 8.

Wymagania

Do skonfigurowania szyfrowania wymagane jest:

  • System operacyjny wspierany przez producenta, z OpenSSL >=1.1.X lub alternatywą.

Zaleca się unikanie systemów operacyjnych w stanie end-of-life, szczególnie w przypadku nowych instalacji

  • Silnik bazy danych (RDBMS) zainstalowany i utrzymywany z oficjalnego repozytorium udostępnianego przez producenta. Systemy operacyjne często są dostarczane z przestarzałymi wersjami oprogramowania bazodanowego, dla których obsługa szyfrowania nie jest zaimplementowana, na przykład systemy oparte na RHEL 7 oraz PostgreSQL 9.2, MariaDB 5.5 bez obsługi szyfrowania.
Terminologia

Ustawienie tej opcji wymusza użycie połączenia TLS z bazą danych z serwera/proxy Zabbix oraz frontend do bazy danych:

  • required - połączenie z użyciem TLS jako trybu transportu bez sprawdzania tożsamości
  • verify_ca - połączenie z użyciem TLS i weryfikacją certyfikatu
  • verify_full - połączenie z użyciem TLS, weryfikacją certyfikatu oraz sprawdzeniem, czy tożsamość bazy danych (CN) określona przez DBHost jest zgodna z jej certyfikatem

Konfiguracja Zabbix

Frontend do bazy danych

Bezpieczne połączenie z bazą danych można skonfigurować podczas instalacji frontend:

  • Zaznacz pole wyboru Database TLS encryption w kroku Configure DB connection, aby włączyć szyfrowanie transmisji.
  • Zaznacz pole wyboru Verify database certificate, które pojawia się po zaznaczeniu pola TLS encryption, aby włączyć szyfrowanie z użyciem certyfikatów.

W przypadku MySQL pole wyboru Database TLS encryption jest wyłączone, jeśli Database host ma wartość localhost, ponieważ połączenie korzystające z pliku gniazda (w Unix) lub pamięci współdzielonej (w Windows) nie może być szyfrowane.
W przypadku PostgreSQL pole wyboru TLS encryption jest wyłączone, jeśli wartość pola Database host zaczyna się od ukośnika lub pole jest puste.

W trybie szyfrowania TLS z użyciem certyfikatów dostępne stają się następujące parametry (jeśli oba pola wyboru są zaznaczone):

Parameter Description
Database TLS CA file Określ pełną ścieżkę do prawidłowego pliku urzędu certyfikacji (CA) TLS.
Database TLS key file Określ pełną ścieżkę do prawidłowego pliku klucza TLS.
Database TLS certificate file Określ pełną ścieżkę do prawidłowego pliku certyfikatu TLS.
Database host verification Zaznacz to pole wyboru, aby włączyć weryfikację host.
Wyłączone dla MYSQL, ponieważ biblioteka PHP MySQL nie pozwala pominąć etapu weryfikacji certyfikatu peer.
Database TLS cipher list Określ niestandardową listę prawidłowych szyfrów. Format listy szyfrów musi być zgodny ze standardem OpenSSL.
Dostępne tylko dla MySQL.

Parametry TLS muszą wskazywać prawidłowe pliki. Jeśli wskazują na nieistniejące lub nieprawidłowe pliki, spowoduje to błąd autoryzacji.
Jeśli pliki certyfikatów są zapisywalne, frontend generuje ostrzeżenie w raporcie System information informujące, że "TLS certificate files must be read-only." (wyświetlane tylko wtedy, gdy użytkownik PHP jest właścicielem certyfikatu).

Certyfikaty chronione hasłami nie są obsługiwane.

Przypadki użycia

frontend Zabbix używa interfejsu GUI do definiowania dostępnych opcji: required, verify_ca, verify_full. Określ wymagane opcje w kroku kreatora instalacji Konfigurowanie połączeń z bazą danych. Opcje te są mapowane na plik konfiguracyjny frontend (zabbix.conf.php) w następujący sposób:

Ustawienia GUI Plik konfiguracyjny Opis Wynik
...
// Used for TLS connection.
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
1. Zaznacz Szyfrowanie TLS bazy danych
2. Pozostaw opcję Weryfikuj certyfikat bazy danych niezaznaczoną
Włącz tryb required.
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
1. Zaznacz opcje Szyfrowanie TLS bazy danych i Weryfikuj certyfikat bazy danych
2. Określ ścieżkę do pliku CA TLS bazy danych
Włącz tryb verify_ca.
...
// Used for TLS connection with strictly defined Cipher list.
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '<cipher_list>';
...

Lub:

...
// Used for TLS connection without Cipher list defined - selected by MySQL server
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...
1. Zaznacz opcje Szyfrowanie TLS bazy danych i Weryfikuj certyfikat bazy danych
2. Określ ścieżkę do pliku klucza TLS bazy danych
3. Określ ścieżkę do pliku CA TLS bazy danych
4. Określ ścieżkę do pliku certyfikatu TLS bazy danych
5. Określ listę szyfrów TLS bazy danych (opcjonalnie)
Włącz tryb verify_full dla MySQL.
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = ' ';
...
1. Zaznacz opcje Szyfrowanie TLS bazy danych i Weryfikuj certyfikat bazy danych
2. Określ ścieżkę do pliku klucza TLS bazy danych
3. Określ ścieżkę do pliku CA TLS bazy danych
4. Określ ścieżkę do pliku certyfikatu TLS bazy danych
5. Zaznacz opcję Weryfikacja hosta bazy danych
Włącz tryb verify_full dla PostgreSQL.

Zobacz także: Przykłady konfiguracji szyfrowania dla MySQL, Przykłady konfiguracji szyfrowania dla PostgreSQL.

Konfiguracja serwera/proxy Zabbix

Bezpieczne połączenia z bazą danych można skonfigurować za pomocą odpowiednich parametrów w pliku konfiguracyjnym serwera Zabbix i/lub proxy.

Konfiguracja Wynik
Brak Połączenie z bazą danych bez szyfrowania.
Ustaw DBTLSConnect=required Serwer/proxy nawiązuje połączenie TLS z bazą danych. Połączenie nieszyfrowane jest niedozwolone.
1. Ustaw DBTLSConnect=verify_ca
2. Ustaw DBTLSCAFile - określ plik urzędu certyfikacji TLS
Serwer/proxy nawiązuje połączenie TLS z bazą danych po zweryfikowaniu certyfikatu bazy danych.
1. Ustaw DBTLSConnect=verify_full
2. Ustaw DBTLSCAFile - określ plik urzędu certyfikacji TLS
Serwer/proxy nawiązuje połączenie TLS z bazą danych po zweryfikowaniu certyfikatu bazy danych i tożsamości hosta bazy danych.
1. Ustaw DBTLSCAFile - określ plik urzędu certyfikacji TLS
2. Ustaw DBTLSCertFile - określ plik certyfikatu klucza publicznego klienta
3. Ustaw DBTLSKeyFile - określ plik klucza prywatnego klienta
Serwer/proxy przedstawia certyfikat klienta podczas łączenia się z bazą danych.
Ustaw DBTLSCipher - listę szyfrów szyfrowania dozwolonych przez klienta dla połączeń korzystających z protokołów TLS do wersji TLS 1.2 włącznie

lub DBTLSCipher13 - listę szyfrów szyfrowania dozwolonych przez klienta dla połączeń korzystających z protokołu TLS 1.3
(MySQL) Połączenie TLS jest nawiązywane przy użyciu szyfru z podanej listy.
(PostgreSQL) Ustawienie tej opcji zostanie uznane za błąd.