Szyfrowanie przy użyciu kluczy współdzielonych z wyprzedzeniem

Omówienie

Każdy klucz wstępnie współdzielony (PSK) w Zabbixie jest w rzeczywistości parą:

  • niezawierającego sekretu ciągu identyfikatora PSK,
  • tajnego ciągu wartości PSK.

Ciąg identyfikatora PSK jest niepustym ciągiem znaków UTF-8. Na przykład: „PSK ID 001 Zabbix agentd”. Jest to unikalna nazwa, za pomocą której komponenty Zabbixa odwołują się do tego konkretnego PSK. Nie umieszczaj poufnych informacji w ciągu identyfikatora PSK — jest on przesyłany przez sieć w postaci niezaszyfrowanej.

Wartość PSK to trudny do odgadnięcia ciąg cyfr szesnastkowych, na przykład e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9.

Nigdy nie używaj przykładowych wartości PSK podanych w dokumentacji w środowiskach produkcyjnych. Zamiast tego wygeneruj unikalny, kryptograficznie bezpieczny PSK.

Limity rozmiaru

W Zabbix obowiązują limity rozmiaru tożsamości PSK i wartości PSK. W niektórych przypadkach biblioteka kryptograficzna może mieć niższy limit:

Komponent Maksymalny rozmiar tożsamości PSK Minimalny rozmiar wartości PSK Maksymalny rozmiar wartości PSK
Zabbix 128 znaków UTF-8 128 bitów (PSK o rozmiarze 16 bajtów, wprowadzany jako 32 cyfry szesnastkowe) 2048 bitów (PSK o rozmiarze 256 bajtów, wprowadzany jako 512 cyfr szesnastkowych)
GnuTLS 128 bajtów (może zawierać znaki UTF-8) - 2048 bitów (PSK o rozmiarze 256 bajtów, wprowadzany jako 512 cyfr szesnastkowych)
OpenSSL 1.0.x, 1.1.0 127 bajtów (może zawierać znaki UTF-8) - 2048 bitów (PSK o rozmiarze 256 bajtów, wprowadzany jako 512 cyfr szesnastkowych)
OpenSSL 1.1.1 127 bajtów (może zawierać znaki UTF-8) - 512 bitów (PSK o rozmiarze 64 bajtów, wprowadzany jako 128 cyfr szesnastkowych)
OpenSSL 1.1.1a i nowsze 127 bajtów (może zawierać znaki UTF-8) - 2048 bitów (PSK o rozmiarze 256 bajtów, wprowadzany jako 512 cyfr szesnastkowych)

frontend Zabbix umożliwia skonfigurowanie tożsamości PSK o długości do 128 znaków oraz PSK o długości 2048 bitów, niezależnie od używanych bibliotek kryptograficznych.
Jeśli niektóre komponenty Zabbix obsługują niższe limity, użytkownik jest odpowiedzialny za skonfigurowanie tożsamości i wartości PSK o długości dozwolonej dla tych komponentów.
Przekroczenie limitów długości powoduje błędy komunikacji między komponentami Zabbix.

Zanim serwer Zabbix połączy się z agentem przy użyciu PSK, serwer wyszukuje w bazie danych (a dokładniej w pamięci podręcznej konfiguracji) tożsamość PSK i wartość PSK skonfigurowane dla tego agenta. Po otrzymaniu połączenia agent używa tożsamości PSK i wartości PSK z jego pliku konfiguracyjnego. Jeśli obie strony mają ten sam ciąg tożsamości PSK i tę samą wartość PSK, połączenie może się powieść.

Każda tożsamość PSK musi być powiązana tylko z jedną wartością. Użytkownik jest odpowiedzialny za zapewnienie, że nie istnieją dwie wartości PSK z tym samym ciągiem tożsamości, ale z różnymi wartościami. Niezastosowanie się do tego zalecenia może prowadzić do nieprzewidywalnych błędów lub zakłóceń komunikacji między komponentami Zabbix używającymi PSK z tym ciągiem tożsamości PSK.

Generowanie PSK

Na przykład klucz PSK o długości 256 bitów (32 bajtów) można wygenerować za pomocą następujących poleceń:

  • za pomocą OpenSSL:
$ openssl rand -hex 32
af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429
  • za pomocą GnuTLS:
$ psktool -u psk_identity -p database.psk -s 32
Generating a random key for user 'psk_identity'
Key stored to database.psk

$ cat database.psk 
psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb

Należy pamiętać, że polecenie „psktool” powyżej generuje plik bazy danych zawierający tożsamość PSK i powiązany z nią klucz PSK. Zabbix oczekuje w pliku PSK wyłącznie klucza PSK, dlatego z pliku należy usunąć ciąg tożsamości oraz dwukropek („:”).

Konfigurowanie PSK na potrzeby komunikacji serwer-agent (przykład)

Na hoście agenta zapisz wygenerowaną wcześniej wartość PSK w pliku, na przykład /home/zabbix/zabbix_agentd.psk. Plik musi zawierać wartość PSK w pierwszym wierszu.

Ustaw prawa dostępu do pliku PSK — musi on być dostępny do odczytu wyłącznie dla użytkownika Zabbix.

Edytuj parametry TLS w pliku konfiguracyjnym agenta Zabbix (zabbix_agentd.conf). Na przykład ustaw:

TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/home/zabbix/zabbix_agentd.psk
TLSPSKIdentity=PSK 001

agent będzie łączyć się z serwerem (aktywne sprawdzanie) i akceptować z serwera oraz zabbix_get wyłącznie połączenia korzystające z PSK. Tożsamość PSK będzie mieć wartość „PSK 001”.

Uruchom ponownie agenta. Teraz możesz przetestować połączenie za pomocą zabbix_get, na przykład:

zabbix_get -s 127.0.0.1 -k "system.cpu.load[all,avg1]" --tls-connect=psk --tls-psk-identity="PSK 001" --tls-psk-file=/home/zabbix/zabbix_agentd.psk

(Aby zminimalizować przestój, zobacz, jak zmienić typ połączenia w sekcji Zarządzanie szyfrowaniem połączeń).

Skonfiguruj szyfrowanie PSK dla tego agenta w frontend Zabbix:

  1. Przejdź do: Zbieranie danych > Hosty.
  2. Wybierz host i kliknij kartę Szyfrowanie.
  3. Skonfiguruj szczegóły szyfrowania PSK.

Przykład:

psk\_config.png

Wszystkie wymagane pola są oznaczone czerwoną gwiazdką.

Gdy pamięć podręczna konfiguracji zostanie zsynchronizowana z bazą danych, nowe połączenia będą korzystać z PSK. Sprawdź pliki dziennika serwera i agenta pod kątem komunikatów o błędach.

Konfigurowanie PSK na potrzeby komunikacji serwer - proxy aktywne (przykład)

Na proxy zapisz wartość PSK w pliku, na przykład /home/zabbix/zabbix_proxy.psk. Plik musi zawierać PSK w pierwszym wierszu tekstu, na przykład:

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

Ustaw prawa dostępu do pliku PSK - musi on być dostępny do odczytu wyłącznie dla użytkownika Zabbix.

Edytuj parametry TLS w pliku konfiguracyjnym proxy Zabbix (zabbix_proxy.conf). Na przykład ustaw:

TLSConnect=psk
TLSPSKFile=/home/zabbix/zabbix_proxy.psk
TLSPSKIdentity=PSK 002

proxy połączy się z serwerem przy użyciu PSK. Tożsamość PSK będzie mieć wartość „PSK 002”.

(Aby zminimalizować przestój, zobacz, jak zmienić typ połączenia w sekcji Zarządzanie szyfrowaniem połączeń).

Skonfiguruj PSK dla tego proxy w frontend Zabbix. Przejdź do Administracja > Proxy, wybierz proxy i przejdź do karty Szyfrowanie. W sekcji „Połączenia z proxy” zaznacz PSK. W polu „Tożsamość PSK” wklej „PSK 002”, a w polu „PSK” wklej „e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”. Kliknij „Aktualizuj”.

Uruchom ponownie proxy. Zacznie ono używać szyfrowanych połączeń z serwerem opartych na PSK. Sprawdź pliki dziennika serwera i proxy pod kątem komunikatów o błędach.

W przypadku proxy pasywnego procedura jest bardzo podobna. Jedyna różnica polega na ustawieniu TLSAccept=psk w pliku konfiguracyjnym proxy Zabbix oraz ustawieniu opcji Połączenia z proxy w frontend Zabbix na PSK.

Rozwiązywanie problemów z PSK

PSK zawiera nieparzystą liczbę cyfr szesnastkowych

Proxy lub agent nie uruchamia się, komunikat w logu proxy lub agenta:

nieprawidłowy PSK w pliku "/home/zabbix/zabbix_proxy.psk"
Ciąg tożsamości PSK dłuższy niż 128 bajtów jest przekazywany do GnuTLS

W logu po stronie klienta TLS:

gnutls_handshake() failed: -110 The TLS connection was non-properly terminated.

W logu po stronie serwera TLS:

gnutls_handshake() failed: -90 The SRP username supplied is illegal.
Zbyt długa wartość PSK użyta z OpenSSL 1.1.1

W logu strony łączącej:

...Biblioteka OpenSSL (wersja OpenSSL 1.1.1  11 Sep 2018) zainicjalizowana
...
...W zbx_tls_connect(): psk_identity:"PSK 1"
...zbx_psk_client_cb() zażądał tożsamości PSK "PSK 1"
...Koniec zbx_tls_connect():FAIL błąd:'SSL_connect() set result code to SSL_ERROR_SSL: file ssl\statem\extensions_clnt.c line 801: error:14212044:SSL routines:tls_construct_ctos_early_data:internal error: TLS write fatal alert "internal error"'

W logu strony przyjmującej:

...Wiadomość od 123.123.123.123 nie zawiera nagłówka. Wiadomość zignorowana.

Ten problem zwykle występuje podczas aktualizacji OpenSSL z wersji 1.0.x lub 1.1.0 do 1.1.1, jeśli wartość PSK jest dłuższa niż 512 bitów (PSK 64-bajtowy, wprowadzony jako 128 cyfr szesnastkowych).

Zobacz też: Ograniczenia rozmiaru wartości