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 Zabbixa używa interfejsu GUI do definiowania możliwych opcji: required, verify_ca, verify_full. Wymagane opcje należy określić w kroku kreatora instalacji Configure DB connections. Opcje te są mapowane do pliku konfiguracyjnego (zabbix.conf.php) w następujący sposób:

GUI settings Configuration file Description Result
...
// Used for TLS connection.
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
Zaznacz Database TLS encryption
Pozostaw Verify database certificate niezaznaczone
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 Database TLS encryption i Verify database certificate
2. Podaj ścieżkę do Database TLS CA file
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>';
...

Or:

...
// 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 Database TLS encryption i Verify database certificate
2. Podaj ścieżkę do Database TLS key file
3. Podaj ścieżkę do Database TLS CA file
4. Podaj ścieżkę do Database TLS certificate file
5. Określ Database TLS cipher list (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 Database TLS encryption i Verify database certificate
2. Podaj ścieżkę do Database TLS key file
3. Podaj ścieżkę do Database TLS CA file
4. Podaj ścieżkę do Database TLS certificate file
5. Zaznacz Database host verification
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 Zabbix serwera i/lub proxy.

Configuration Result
None Połączenie z bazą danych bez szyfrowania.
1. Ustaw DBTLSConnect=required Serwer/proxy nawiązuje połączenie TLS z bazą danych. Połączenie nieszyfrowane nie jest dozwolone.
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 publicznego klucza klienta
3. Ustaw DBTLSKeyFile - określ plik prywatnego klucza klienta
Serwer/proxy dostarcza certyfikat klienta podczas łączenia z bazą danych.
1. Ustaw DBTLSCipher - listę szyfrów szyfrowania, które klient dopuszcza dla połączeń z użyciem protokołów TLS do TLS 1.2

lub DBTLSCipher13 - listę szyfrów szyfrowania, które klient dopuszcza dla połączeń z użyciem protokołu TLS 1.3
(MySQL) Połączenie TLS jest nawiązywane przy użyciu szyfru z podanej listy.
(PostgreSQL) Ustawienie tej opcji będzie traktowane jako błąd.