- Crittografia e sicurezza
- Encryption
- Compilazione di Zabbix con supporto alla crittografia
- Gestione della cifratura delle connessioni
- zabbix_get e zabbix_sender con crittografia
- Ciphersuites
- Ciphersuite definite dall'utente
- Risoluzione dei problemi di crittografia
- Risoluzione dei problemi relativi al tipo di connessione o ai problemi di autorizzazione
- Tentativo di utilizzare Zabbix sender compilato con supporto TLS per inviare dati a Zabbix server/proxy compilato senza TLS
- Un lato si connette con PSK ma l'altro lato usa LibreSSL o è stato compilato senza supporto per la crittografia
- Un lato si connette con PSK ma l'altro lato usa OpenSSL con il supporto PSK disabilitato
Crittografia e sicurezza
Encryption
Zabbix supporta comunicazioni cifrate tra i componenti Zabbix usando il protocollo Transport Layer Security (TLS) v.1.2 e 1.3 (a seconda della libreria crittografica). È supportata la cifratura basata su certificati e quella basata su chiavi precondivise.
La cifratura può essere configurata per le connessioni:
- Tra Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, zabbix_sender e le utility zabbix_get
- Verso il database Zabbix da Zabbix frontend e server/proxy
- Tra Zabbix frontend e Zabbix server
La cifratura è opzionale e configurabile per i singoli componenti:
- Alcuni proxy e agent possono essere configurati per usare la cifratura basata su certificati con il server, mentre altri possono usare la cifratura basata su chiavi precondivise, e altri ancora possono continuare a usare comunicazioni non cifrate (come in precedenza).
- Il server (proxy) può usare configurazioni di cifratura diverse per host diversi.
I programmi daemon di Zabbix usano una sola porta di ascolto per connessioni in ingresso cifrate e non cifrate. L'aggiunta della cifratura non richiede l'apertura di nuove porte sui firewall.
Limitazioni
- Le chiavi private sono memorizzate in testo semplice in file leggibili dai componenti di Zabbix durante l'avvio.
- Le chiavi precondivise vengono inserite nel frontend di Zabbix e memorizzate nel database di Zabbix in testo semplice.
- La crittografia integrata non protegge le comunicazioni tra il web server che esegue il frontend di Zabbix e il browser web dell'utente.
- Attualmente ogni connessione crittografata si apre con un handshake TLS completo; non sono implementati né il caching delle sessioni né i ticket.
- L'aggiunta della crittografia aumenta il tempo necessario per i controlli degli item e le azioni, a seconda della latenza di rete:
- Ad esempio, se il ritardo dei pacchetti è di 100 ms, l'apertura di una connessione TCP e l'invio di una richiesta non crittografata richiedono circa 200 ms. Con la crittografia, vengono aggiunti circa 1000 ms per stabilire la connessione TLS.
- Potrebbe essere necessario aumentare i timeout; in caso contrario, alcuni item e azioni che eseguono script remoti sugli agent potrebbero funzionare con connessioni non crittografate, ma andare in timeout con connessioni crittografate.
- La crittografia non è supportata da network discovery. I controlli di Zabbix agent eseguiti da network discovery saranno non crittografati e, se Zabbix agent è configurato per rifiutare le connessioni non crittografate, tali controlli non avranno esito positivo.
Compilazione di Zabbix con supporto alla crittografia
Per supportare la crittografia, Zabbix deve essere compilato e collegato con una delle librerie crittografiche supportate:
- GnuTLS - dalla versione 3.1.18
- OpenSSL - versioni 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x - 3.5.x
- LibreSSL - testato con le versioni 2.7.4, 2.8.2:
- LibreSSL 2.6.x non è supportato
- LibreSSL è supportato come sostituto compatibile di OpenSSL;
le nuove funzioni API specifiche di LibreSSL
tls_*()non vengono utilizzate. I componenti di Zabbix compilati con LibreSSL non potranno usare PSK, ma potranno usare solo certificati.
Puoi trovare ulteriori informazioni sulla configurazione di SSL per il frontend di Zabbix consultando queste best practices.
La libreria viene selezionata specificando la relativa opzione allo script "configure":
--with-gnutls[=DIR]--with-openssl[=DIR](usato anche per LibreSSL)
Ad esempio, per configurare i sorgenti per server e agent con OpenSSL puoi usare qualcosa del genere:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
Diversi componenti di Zabbix possono essere compilati con diverse librerie crittografiche (ad esempio, un server con OpenSSL, un agent con GnuTLS).
Se prevedi di usare chiavi pre-condivise (PSK), considera l'uso delle librerie GnuTLS o OpenSSL 1.1.0 (o versioni successive) nei componenti di Zabbix che utilizzano PSK. Le librerie GnuTLS e OpenSSL 1.1.0 supportano suite di cifratura PSK con Perfect Forward Secrecy. Le versioni precedenti della libreria OpenSSL (1.0.1, 1.0.2c) supportano anch'esse PSK, ma le suite di cifratura PSK disponibili non forniscono Perfect Forward Secrecy.
Gestione della cifratura delle connessioni
Le connessioni in Zabbix possono usare:
- nessuna cifratura (predefinito)
- cifratura basata su certificato RSA
- cifratura basata su PSK
Esistono due parametri importanti usati per specificare la cifratura tra i componenti Zabbix:
- TLSConnect - specifica quale cifratura usare per le connessioni in uscita (non cifrate, PSK o certificato)
- TLSAccept - specifica quali tipi di connessioni sono consentiti per le connessioni in ingresso (non cifrate, PSK o certificato). È possibile specificare uno o più valori.
TLSConnect viene usato nei file di configurazione di Zabbix proxy (in modalità attiva, specifica solo le connessioni al server) e di Zabbix agent (per i controlli attivi). Nel frontend di Zabbix, l'equivalente di TLSConnect è il campo Connessioni all'host nella scheda Raccolta dati > Host > <some host> > Cifratura e il campo Connessioni al proxy nella scheda Amministrazione > Proxy > <some proxy> > Cifratura. Se il tipo di cifratura configurato per la connessione non riesce, non verrà tentato alcun altro tipo di cifratura.
TLSAccept viene usato nei file di configurazione di Zabbix proxy (in modalità passiva, specifica solo le connessioni dal server) e di Zabbix agent (per i controlli passivi). Nel frontend di Zabbix, l'equivalente di TLSAccept è il campo Connessioni dall'host nella scheda Raccolta dati > Host > <some host> > Cifratura e il campo Connessioni dal proxy nella scheda Amministrazione > Proxy > <some proxy> > Cifratura.
Normalmente si configura un solo tipo di cifratura per le connessioni in ingresso. Tuttavia, potresti voler cambiare il tipo di cifratura, ad esempio da non cifrata a basata su certificato, con il minimo tempo di inattività e con possibilità di rollback. Per ottenere questo risultato:
- Imposta
TLSAccept=unencrypted,certnel file di configurazione dell'agent e riavvia Zabbix agent - Verifica la connessione con zabbix_get verso l'agent usando il certificato. Se funziona, puoi riconfigurare la cifratura per quell'agent nel frontend di Zabbix nella scheda Raccolta dati > Host > <some host> > Cifratura impostando Connessioni all'host su "Certificate".
- Quando la cache della configurazione del server viene aggiornata (e la configurazione del proxy viene aggiornata se l'host è monitorato tramite proxy), le connessioni a quell'agent saranno cifrate
- Se tutto funziona come previsto, puoi impostare
TLSAccept=certnel file di configurazione dell'agent e riavviare Zabbix agent. Ora l'agent accetterà solo connessioni cifrate basate su certificato. Le connessioni non cifrate e quelle basate su PSK verranno rifiutate.
In modo simile funziona su server e proxy. Se nel frontend di Zabbix, nella configurazione dell'host, Connessioni dall'host è impostato su "Certificate", allora saranno accettate solo connessioni cifrate basate su certificato dall'agent (controlli attivi) e da zabbix_sender (item trapper).
Molto probabilmente configurerai le connessioni in ingresso e in uscita per usare lo stesso tipo di cifratura oppure nessuna cifratura. Ma tecnicamente è possibile configurarle in modo asimmetrico, ad esempio cifratura basata su certificato per le connessioni in ingresso e basata su PSK per quelle in uscita.
La configurazione della cifratura per ciascun host è visualizzata nel frontend di Zabbix, in Raccolta dati > Host nella colonna Cifratura agent. Ad esempio:
| Example | Connections to host | Allowed connections from host | Rejected connections from host |
|---|---|---|---|
![]() |
Non cifrata | Non cifrata | Cifrate, cifrate basate su certificato e PSK |
![]() |
Cifrata, basata su certificato | Cifrata, basata su certificato | Non cifrata e cifrata basata su PSK |
![]() |
Cifrata, basata su PSK | Cifrata, basata su PSK | Non cifrata e cifrata basata su certificato |
![]() |
Cifrata, basata su PSK | Non cifrata e cifrata basata su PSK | Cifrata basata su certificato |
![]() |
Cifrata, basata su certificato | Non cifrata, cifrata basata su PSK o certificato | - |
Le connessioni sono non cifrate per impostazione predefinita. La cifratura deve essere configurata singolarmente per ciascun host e proxy.
zabbix_get e zabbix_sender con crittografia
Vedere le pagine man di zabbix_get e zabbix_sender per usarli con crittografia.
Ciphersuites
Le ciphersuite sono configurate internamente per impostazione predefinita durante l'avvio di Zabbix.
Sono inoltre supportate ciphersuite configurate dall'utente per GnuTLS e OpenSSL. Gli utenti possono configurare le ciphersuite in base alle proprie policy di sicurezza. L'uso di questa funzionalità è facoltativo (le ciphersuite predefinite integrate continuano a funzionare).
Per le librerie crittografiche compilate con le impostazioni predefinite, le regole integrate di Zabbix in genere producono le seguenti ciphersuite (in ordine di priorità dalla più alta alla più bassa):
| Library | Certificate ciphersuites | PSK ciphersuites |
|---|---|---|
| GnuTLS 3.1.18 | TLS_ECDHE_RSA_AES_128_GCM_SHA256 TLS_ECDHE_RSA_AES_128_CBC_SHA256 TLS_ECDHE_RSA_AES_128_CBC_SHA1 TLS_RSA_AES_128_GCM_SHA256 TLS_RSA_AES_128_CBC_SHA256 TLS_RSA_AES_128_CBC_SHA1 |
TLS_ECDHE_PSK_AES_128_CBC_SHA256 TLS_ECDHE_PSK_AES_128_CBC_SHA1 TLS_PSK_AES_128_GCM_SHA256 TLS_PSK_AES_128_CBC_SHA256 TLS_PSK_AES_128_CBC_SHA1 |
| OpenSSL 1.0.2c | ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-SHA256 AES128-SHA |
PSK-AES128-CBC-SHA |
| OpenSSL 1.1.0 | ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA |
ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA |
| OpenSSL 1.1.1d | TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA |
TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA |
Ciphersuite definite dall'utente
I criteri di selezione delle ciphersuite integrati possono essere sostituiti con ciphersuite definite dall'utente.
Le ciphersuite definite dall'utente sono una funzionalità pensata per utenti esperti che comprendono le ciphersuite TLS, la loro sicurezza e le conseguenze di eventuali errori, e che hanno dimestichezza con la risoluzione dei problemi TLS.
I criteri di selezione delle ciphersuite integrati possono essere sostituiti usando i seguenti parametri:
| Override scope | Parameter | Value | Description |
|---|---|---|---|
| Selezione delle ciphersuite per i certificati | TLSCipherCert13 | Stringhe di cifratura OpenSSL 1.1.1 valide cipher strings per il protocollo TLS 1.3 (i loro valori vengono passati alla funzione OpenSSL SSL_CTX_set_ciphersuites()). |
Criteri di selezione delle ciphersuite basati su certificato per TLS 1.3 Solo OpenSSL 1.1.1 o versioni successive. |
| TLSCipherCert | Stringhe di cifratura OpenSSL valide cipher strings per TLS 1.2 o stringhe di priorità GnuTLS valide priority strings. I loro valori vengono passati rispettivamente alle funzioni SSL_CTX_set_cipher_list() o gnutls_priority_init(). |
Criteri di selezione delle ciphersuite basati su certificato per TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Selezione delle ciphersuite per PSK | TLSCipherPSK13 | Stringhe di cifratura OpenSSL 1.1.1 valide cipher strings per il protocollo TLS 1.3 (i loro valori vengono passati alla funzione OpenSSL SSL_CTX_set_ciphersuites()). |
Criteri di selezione delle ciphersuite basati su PSK per TLS 1.3 Solo OpenSSL 1.1.1 o versioni successive. |
| TLSCipherPSK | Stringhe di cifratura OpenSSL valide cipher strings per TLS 1.2 o stringhe di priorità GnuTLS valide priority strings. I loro valori vengono passati rispettivamente alle funzioni SSL_CTX_set_cipher_list() o gnutls_priority_init(). |
Criteri di selezione delle ciphersuite basati su PSK per TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Elenco combinato delle ciphersuite per certificato e PSK | TLSCipherAll13 | Stringhe di cifratura OpenSSL 1.1.1 valide cipher strings per il protocollo TLS 1.3 (i loro valori vengono passati alla funzione OpenSSL SSL_CTX_set_ciphersuites()). |
Criteri di selezione delle ciphersuite per TLS 1.3 Solo OpenSSL 1.1.1 o versioni successive. |
| TLSCipherAll | Stringhe di cifratura OpenSSL valide cipher strings per TLS 1.2 o stringhe di priorità GnuTLS valide priority strings. I loro valori vengono passati rispettivamente alle funzioni SSL_CTX_set_cipher_list() o gnutls_priority_init(). |
Criteri di selezione delle ciphersuite per TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) |
Per sostituire la selezione delle ciphersuite nelle utility zabbix_get e zabbix_sender, usare i parametri da riga di comando:
--tls-cipher13--tls-cipher
I nuovi parametri sono facoltativi. Se un parametro non è specificato, viene usato il valore predefinito interno. Se un parametro è definito, non può essere vuoto.
Se l'impostazione di un valore TLSCipher* nella libreria crittografica non riesce, il server, proxy o agent non si avvierà e verrà registrato un errore.
È importante capire quando ciascun parametro è applicabile.
Connessioni in uscita
Il caso più semplice è quello delle connessioni in uscita:
- Per le connessioni in uscita con certificato - usare TLSCipherCert13 o TLSCipherCert
- Per le connessioni in uscita con PSK - usare TLSCipherPSK13 o TLSCipherPSK
- Nel caso delle utility zabbix_get e zabbix_sender, è possibile usare i
parametri da riga di comando
--tls-cipher13o--tls-cipher(la crittografia è specificata in modo univoco con il parametro--tls-connect)
Connessioni in ingresso
La situazione è un po' più complessa per le connessioni in ingresso, perché le regole sono specifiche per i componenti e per la configurazione.
Per Zabbix agent:
| Configurazione connessione agent | Configurazione cifrari |
|---|---|
| TLSConnect=cert | TLSCipherCert, TLSCipherCert13 |
| TLSConnect=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert | TLSCipherCert, TLSCipherCert13 |
| TLSAccept=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert,psk | TLSCipherAll, TLSCipherAll13 |
Per Zabbix server e proxy:
| Configurazione connessione | Configurazione cifrari |
|---|---|
| Connessioni in uscita tramite PSK | TLSCipherPSK, TLSCipherPSK13 |
| Connessioni in ingresso tramite certificati | TLSCipherAll, TLSCipherAll13 |
| Connessioni in ingresso tramite PSK se il server non ha un certificato | TLSCipherPSK, TLSCipherPSK13 |
| Connessioni in ingresso tramite PSK se il server ha un certificato | TLSCipherAll, TLSCipherAll13 |
Dalle due tabelle precedenti si può osservare uno schema:
- TLSCipherAll e TLSCipherAll13 possono essere specificati solo se viene usata una lista combinata di suite di cifratura basate su certificati e su PSK. Ci sono due casi in cui ciò avviene: server (proxy) con un certificato configurato (le suite di cifratura PSK sono sempre configurate su server, proxy se la libreria crittografica supporta PSK), agent configurato per accettare connessioni in ingresso basate sia su certificati sia su PSK
- negli altri casi, TLSCipherCert* e/o TLSCipherPSK* sono sufficienti
Le tabelle seguenti mostrano i valori predefiniti incorporati di TLSCipher*. Possono essere un buon punto di partenza per i tuoi valori personalizzati.
| Parametro | GnuTLS 3.6.12 |
|---|---|
| TLSCipherCert | NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509 |
| TLSCipherPSK | NONE:+VERS-TLS1.2:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL |
| TLSCipherAll | NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509 |
| Parametro | OpenSSL 1.1.1d 1 |
|---|---|
| TLSCipherCert13 | |
| TLSCipherCert | EECDH+aRSA+AES128:RSA+aRSA+AES128 |
| TLSCipherPSK13 | TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 |
| TLSCipherPSK | kECDHEPSK+AES128:kPSK+AES128 |
| TLSCipherAll13 | |
| TLSCipherAll | EECDH+aRSA+AES128:RSA+aRSA+AES128:kECDHEPSK+AES128:kPSK+AES128 |
1 I valori predefiniti sono diversi per le versioni precedenti di OpenSSL (1.0.1, 1.0.2, 1.1.0), per LibreSSL e se OpenSSL è compilato senza supporto PSK.
Esempi di suite di cifratura configurate dall'utente
Di seguito sono riportati i seguenti esempi di suite di cifratura configurate dall'utente:
- Test delle stringhe di cifratura e autorizzazione delle sole suite di cifratura PFS
- Passaggio da AES128 ad AES256
Test delle stringhe cipher e consentire solo suite di cifratura PFS
Per vedere quali suite di cifratura sono state selezionate, è necessario impostare
'DebugLevel=4' nel file di configurazione, oppure usare l'opzione -vv per
zabbix_sender.
Potrebbe essere necessario fare alcuni esperimenti con i parametri TLSCipher*
prima di ottenere le suite di cifratura desiderate. È scomodo riavviare
Zabbix server, proxy o agent più volte solo per modificare i parametri
TLSCipher*. Opzioni più pratiche sono l'uso di zabbix_sender oppure del
comando openssl. Vediamo entrambe.
1. Uso di zabbix_sender.
Creiamo un file di configurazione di test, ad esempio /home/zabbix/test.conf, con la sintassi di un file zabbix_agentd.conf:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=cert
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/agent.crt
TLSKeyFile=/home/zabbix/agent.key
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agent.psk
Per questo esempio sono necessari certificati CA e agent validi e una PSK. Adattare i percorsi e i nomi dei file del certificato e della PSK al proprio ambiente.
Se non si usano certificati, ma solo PSK, è possibile creare un file di test più semplice:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=psk
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agentd.psk
Le suite di cifratura selezionate possono essere visualizzate eseguendo zabbix_sender (esempio compilato con OpenSSL 1.1.d):
$ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
Qui si vedono le suite di cifratura selezionate per impostazione predefinita. Questi valori predefiniti sono scelti per garantire l'interoperabilità con gli agent Zabbix in esecuzione su sistemi con versioni più vecchie di OpenSSL (dalla 1.0.1).
Nei sistemi più recenti è possibile rafforzare la sicurezza consentendo solo alcune
suite di cifratura, ad esempio solo quelle con PFS (Perfect Forward Secrecy). Proviamo a consentire
solo le suite di cifratura con PFS usando i parametri TLSCipher*.
Il risultato non sarà interoperabile con i sistemi che usano OpenSSL 1.0.1 e 1.0.2, se viene usata PSK. La cifratura basata su certificati dovrebbe funzionare.
Aggiungere due righe al file di configurazione test.conf:
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
e testare di nuovo:
$ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
Gli elenchi "certificate ciphersuites" e "PSK ciphersuites" sono cambiati: sono più brevi di prima e contengono solo suite di cifratura TLS 1.3 e suite TLS 1.2 ECDHE-* come previsto.
2. TLSCipherAll e TLSCipherAll13 non possono essere testati con zabbix_sender; non influenzano il valore "certificate and PSK ciphersuites" mostrato nell'esempio precedente. Per modificare TLSCipherAll e TLSCipherAll13 è necessario fare esperimenti con agent, proxy o server.
Quindi, per consentire solo suite di cifratura PFS, potrebbe essere necessario aggiungere fino a tre parametri
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128
a zabbix_agentd.conf, zabbix_proxy.conf e zabbix_server.conf se
ognuno di essi ha un certificato configurato e l'agent ha anche PSK.
Se l'ambiente Zabbix usa solo cifratura basata su PSK e nessun certificato, allora basta solo:
TLSCipherPSK=kECDHEPSK+AES128
Ora che si è capito come funziona, è possibile testare la selezione delle suite di cifratura
anche al di fuori di Zabbix, con il comando openssl. Proviamo tutti e tre i valori dei parametri
TLSCipher*:
$ openssl ciphers EECDH+aRSA+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
$ openssl ciphers kECDHEPSK+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
$ openssl ciphers EECDH+aRSA+AES128:kECDHEPSK+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
Si può preferire openssl ciphers con l'opzione -V per un output più dettagliato:
$ openssl ciphers -V EECDH+aRSA+AES128:kECDHEPSK+AES128
0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
0xC0,0x13 - ECDHE-RSA-AES128-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x37 - ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA256
0xC0,0x35 - ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA1
Analogamente, è possibile testare le stringhe di priorità per GnuTLS:
$ gnutls-cli -l --priority=NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
Cipher suites for NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
TLS_ECDHE_RSA_AES_128_GCM_SHA256 0xc0, 0x2f TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA256 0xc0, 0x27 TLS1.2
Protocols: VERS-TLS1.2
Ciphers: AES-128-GCM, AES-128-CBC
MACs: AEAD, SHA256
Key Exchange Algorithms: ECDHE-RSA
Groups: GROUP-SECP256R1, GROUP-SECP384R1, GROUP-SECP521R1, GROUP-X25519, GROUP-X448, GROUP-FFDHE2048, GROUP-FFDHE3072, GROUP-FFDHE4096, GROUP-FFDHE6144, GROUP-FFDHE8192
PK-signatures: SIGN-RSA-SHA256, SIGN-RSA-PSS-SHA256, SIGN-RSA-PSS-RSAE-SHA256, SIGN-ECDSA-SHA256, SIGN-ECDSA-SECP256R1-SHA256, SIGN-EdDSA-Ed25519, SIGN-RSA-SHA384, SIGN-RSA-PSS-SHA384, SIGN-RSA-PSS-RSAE-SHA384, SIGN-ECDSA-SHA384, SIGN-ECDSA-SECP384R1-SHA384, SIGN-EdDSA-Ed448, SIGN-RSA-SHA512, SIGN-RSA-PSS-SHA512, SIGN-RSA-PSS-RSAE-SHA512, SIGN-ECDSA-SHA512, SIGN-ECDSA-SECP521R1-SHA512, SIGN-RSA-SHA1, SIGN-ECDSA-SHA1
Passaggio da AES128 ad AES256
Zabbix usa AES128 come impostazione predefinita integrata per i dati. Supponiamo che tu stia usando certificati e voglia passare ad AES256, su OpenSSL 1.1.1.
Questo può essere ottenuto aggiungendo i parametri corrispondenti in zabbix_server.conf:
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/server.crt
TLSKeyFile=/home/zabbix/server.key
TLSCipherCert13=TLS_AES_256_GCM_SHA384
TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
TLSCipherPSK13=TLS_CHACHA20_POLY1305_SHA256
TLSCipherPSK=kECDHEPSK+AES256:-SHA1
TLSCipherAll13=TLS_AES_256_GCM_SHA384
TLSCipherAll=EECDH+aRSA+AES256:-SHA1:-SHA384
Anche se verranno utilizzate solo suite di cifratura relative ai certificati, i parametri TLSCipherPSK* sono definiti comunque per evitare i loro valori predefiniti, che includono cifrari meno sicuri per una maggiore interoperabilità. Le suite di cifratura PSK non possono essere completamente disabilitate su server/proxy.
E in zabbix_agentd.conf:
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/agent.crt
TLSKeyFile=/home/zabbix/agent.key
TLSCipherCert13=TLS_AES_256_GCM_SHA384
TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
Risoluzione dei problemi di crittografia
Raccomandazioni generali:
- Iniziare comprendendo quale componente agisce come client TLS e quale come server TLS nel caso problematico.
Zabbix server, proxy e agent, a seconda dell'interazione tra loro, possono tutti funzionare sia come server TLS sia come client TLS.
Ad esempio, Zabbix server che si connette a un agent per un controllo passivo agisce come client TLS. L'agent svolge il ruolo di server TLS.
Zabbix agent, che richiede un elenco di controlli attivi da un proxy, agisce come client TLS. Il proxy svolge il ruolo di server TLS.
Le utilityzabbix_getezabbix_senderagiscono sempre come client TLS. - Zabbix utilizza l'autenticazione reciproca.
Ciascuna parte verifica la controparte e può rifiutare la connessione.
Ad esempio, Zabbix server che si connette a un agent può chiudere immediatamente la connessione se il certificato dell'agent non è valido. E viceversa -
Zabbix agent che accetta una connessione dal server può chiudere la connessione se il server non è considerato attendibile dall'agent. - Esaminare i file di log su entrambe le parti - nel client TLS e nel server TLS.
La parte che rifiuta la connessione può registrare un motivo preciso del rifiuto. L'altra parte spesso riporta un errore piuttosto generico (ad esempio,
"Connection closed by peer", "connection was non-properly
terminated"). - A volte una crittografia configurata in modo errato genera messaggi di errore fuorvianti che non indicano in alcun modo la causa reale.
Nelle sottosezioni seguenti cerchiamo di fornire una raccolta, tutt'altro che esaustiva, di messaggi e possibili cause che possono aiutare nella risoluzione dei problemi.
Si noti che diversi toolkit crittografici (OpenSSL, GnuTLS) spesso producono messaggi di errore diversi nelle stesse situazioni problematiche.
A volte i messaggi di errore dipendono persino dalla particolare combinazione di toolkit crittografici su entrambe le parti.
Risoluzione dei problemi relativi al tipo di connessione o ai problemi di autorizzazione
Server è configurato per connettersi con PSK a agent ma agent accetta solo connessioni non cifrate
Nel log di server o proxy (con GnuTLS 3.3.16)
Get value from agent failed: zbx_tls_connect(): gnutls_handshake() failed: \
-110 The TLS connection was non-properly terminated.
Nel log di server o proxy (con OpenSSL 1.0.2c)
Get value from agent failed: TCP connection successful, cannot establish TLS to [[127.0.0.1]:10050]: \
Connection closed by peer. Check allowed connection types and access rights
Un lato si connette con certificato ma l'altro lato accetta solo PSK o viceversa
In qualsiasi log (con GnuTLS):
failed to accept an incoming connection: from 127.0.0.1: zbx_tls_accept(): gnutls_handshake() failed:\
-21 Could not negotiate a supported cipher suite.
In qualsiasi log (con OpenSSL 1.0.2c):
failed to accept an incoming connection: from 127.0.0.1: TLS handshake returned error code 1:\
file .\ssl\s3_srvr.c line 1411: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:\
TLS write fatal alert "handshake failure"
Tentativo di utilizzare Zabbix sender compilato con supporto TLS per inviare dati a Zabbix server/proxy compilato senza TLS
Nel log del lato di connessione:
Linux:
...In zbx_tls_init_child()
...Libreria OpenSSL (versione OpenSSL 1.1.1 11 Sep 2018) inizializzata
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...Fine di zbx_tls_connect():FAIL errore:'connection closed by peer'
...errore di invio valore: TCP riuscito, impossibile stabilire TLS con [[localhost]:10051]: connection closed by peer
Windows:
...Libreria OpenSSL (versione OpenSSL 1.1.1a 20 Nov 2018) inizializzata
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...zbx_psk_client_cb() ha richiesto l'identità PSK "PSK test sender"
...Fine di zbx_tls_connect():FAIL errore:'SSL_connect() I/O error: [0x00000000] The operation completed successfully.'
...errore di invio valore: TCP riuscito, impossibile stabilire TLS con [[192.168.1.2]:10051]: SSL_connect() I/O error: [0x00000000] The operation completed successfully.
Nel log del lato di accettazione:
...failed to accept an incoming connection: from 127.0.0.1: support for TLS was not compiled in
Un lato si connette con PSK ma l'altro lato usa LibreSSL o è stato compilato senza supporto per la crittografia
LibreSSL non supporta PSK.
Nel log del lato di connessione:
...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success
Nel log del lato di accettazione:
...failed to accept an incoming connection: from 192.168.1.2: support for PSK was not compiled in
Nel frontend di Zabbix:
Get value from agent failed: TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success
Un lato si connette con PSK ma l'altro lato usa OpenSSL con il supporto PSK disabilitato
Nel log del lato che si connette:
...TCP riuscito, impossibile stabilire TLS con [[192.168.1.2]:10050]: SSL_connect() ha impostato il codice risultato su SSL_ERROR_SSL: file ../ssl/record/rec_layer_s3.c line 1536: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure: SSL alert number 40: TLS read fatal alert "handshake failure"
Nel log del lato che accetta:
...impossibile accettare una connessione in ingresso: da 192.168.1.2: TLS handshake ha impostato il codice risultato su 1: file ssl/statem/statem_srvr.c line 1422: error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher: TLS write fatal alert "handshake failure"




