Crittografia

Panoramica

Zabbix supporta comunicazioni crittografate tra i componenti Zabbix utilizzando il protocollo Transport Layer Security (TLS) v.1.2 e 1.3 (a seconda della libreria crittografica). Sono supportate la crittografia basata su certificati e quella basata su chiavi precondivise.

La crittografia può essere configurata per le connessioni:

  • Tra Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, le utility zabbix_sender e zabbix_get
  • Al database Zabbix da Zabbix frontend e server/proxy
  • Tra Zabbix frontend e Zabbix server

La crittografia è facoltativa e configurabile per i singoli componenti:

  • Alcuni proxy e agent possono essere configurati per utilizzare la crittografia basata su certificati con il server, mentre altri possono usare la crittografia basata su chiavi precondivise, e altri ancora possono continuare con comunicazioni non crittografate (come in precedenza).
  • Il server (proxy) può utilizzare configurazioni di crittografia diverse per host differenti.

I programmi daemon di Zabbix utilizzano un'unica porta di ascolto per le connessioni in ingresso crittografate e non crittografate. L'aggiunta della crittografia non richiede l'apertura di nuove porte nei 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 viene aperta 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, altrimenti alcuni item e azioni che eseguono script remoti sugli agent potrebbero funzionare con connessioni non crittografate, ma fallire per timeout con quelle crittografate.
  • La crittografia non è supportata da network discovery. I controlli di Zabbix agent eseguiti dal network discovery non saranno crittografati e, se Zabbix agent è configurato per rifiutare le connessioni non crittografate, tali controlli non avranno successo.

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
  • 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, sarà possibile 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 precondivise (PSK), considera l'uso delle librerie GnuTLS o OpenSSL 1.1.0 (o 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 crittografia delle connessioni

Le connessioni in Zabbix possono usare:

Esistono due parametri importanti usati per specificare la crittografia tra i componenti Zabbix:

  • TLSConnect - specifica quale crittografia usare per le connessioni in uscita (non crittografate, PSK o certificato)
  • TLSAccept - specifica quali tipi di connessioni sono consentiti per le connessioni in ingresso (non crittografate, PSK o certificato). È possibile specificare uno o più valori.

TLSConnect viene usato nei file di configurazione per Zabbix proxy (in modalità attiva, specifica solo le connessioni al server) e 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> > Crittografia e il campo Connessioni al proxy nella scheda Amministrazione > Proxy > <some proxy> > Crittografia. Se il tipo di crittografia configurato per la connessione non riesce, non verrà tentato alcun altro tipo di crittografia.

TLSAccept viene usato nei file di configurazione per Zabbix proxy (in modalità passiva, specifica solo le connessioni dal server) e 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> > Crittografia e il campo Connessioni dal proxy nella scheda Amministrazione > Proxy > <some proxy> > Crittografia.

Normalmente si configura un solo tipo di crittografia per le connessioni in ingresso. Tuttavia, potresti voler cambiare il tipo di crittografia, ad esempio da non crittografata a basata su certificato, con il minimo tempo di inattività e con possibilità di rollback. Per ottenere questo risultato:

  • Imposta TLSAccept=unencrypted,cert nel file di configurazione dell'agent e riavvia Zabbix agent
  • Verifica la connessione con zabbix_get all'agent usando il certificato. Se funziona, puoi riconfigurare la crittografia per quell'agent nel frontend di Zabbix nella scheda Raccolta dati > Host > <some host> > Crittografia impostando Connessioni all'host su "Certificato".
  • 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 crittografate
  • Se tutto funziona come previsto, puoi impostare TLSAccept=cert nel file di configurazione dell'agent e riavviare Zabbix agent. Ora l'agent accetterà solo connessioni crittografate basate su certificato. Le connessioni non crittografate 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 "Certificato", allora saranno accettate solo connessioni crittografate 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 crittografia oppure nessuna crittografia. Tuttavia, tecnicamente è possibile configurarle in modo asimmetrico, ad esempio crittografia basata su certificato per le connessioni in ingresso e basata su PSK per quelle in uscita.

La configurazione della crittografia per ciascun host è visualizzata nel frontend di Zabbix, in Raccolta dati > Host nella colonna Crittografia agent. Ad esempio:

Example Connections to host Allowed connections from host Rejected connections from host
none\_none.png Non crittografate Non crittografate Crittografate, crittografate basate su certificato e basate su PSK
cert\_cert.png Crittografate, basate su certificato Crittografate, basate su certificato Non crittografate e crittografate basate su PSK
psk\_psk.png Crittografate, basate su PSK Crittografate, basate su PSK Non crittografate e crittografate basate su certificato
psk\_none\_psk.png Crittografate, basate su PSK Non crittografate e crittografate basate su PSK Crittografate, basate su certificato
cert\_all.png Crittografate, basate su certificato Non crittografate, basate su PSK o su certificato -

Le connessioni sono non crittografate per impostazione predefinita. La crittografia 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 informazioni sul loro utilizzo con la crittografia.

Suite di cifratura

Per impostazione predefinita, le suite di cifratura vengono configurate internamente durante l'avvio di Zabbix.

Sono supportate anche le suite di cifratura configurate dall'utente per GnuTLS e OpenSSL. Gli utenti possono configurare le suite di cifratura in base alle proprie policy di sicurezza. L'uso di questa funzionalità è facoltativo (le suite di cifratura predefinite integrate continuano a funzionare).

Per le librerie crittografiche compilate con le impostazioni predefinite, le regole integrate di Zabbix in genere producono le seguenti suite di cifratura (in ordine di priorità dalla più alta alla più bassa):

Libreria Suite di cifratura per certificati Suite di cifratura PSK
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 configurate dall'utente

I criteri integrati di selezione delle ciphersuite possono essere sovrascritti con ciphersuite configurate dall'utente.

Le ciphersuite configurate dall'utente sono una funzionalità destinata a utenti avanzati che comprendono le ciphersuite TLS, la loro sicurezza e le conseguenze di eventuali errori, e che hanno familiarità con la risoluzione dei problemi TLS.

I criteri integrati di selezione delle ciphersuite possono essere sovrascritti utilizzando i seguenti parametri:

Ambito di sovrascrittura Parametro Valore Descrizione
Selezione delle ciphersuite per i certificati TLSCipherCert13 Stringhe di cifratura OpenSSL 1.1.1 valide cipher strings per il protocollo TLS 1.3 (i relativi 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 oppure stringhe di priorità GnuTLS valide priority strings. I relativi 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 relativi 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 oppure stringhe di priorità GnuTLS valide priority strings. I relativi 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 di ciphersuite per certificato e PSK TLSCipherAll13 Stringhe di cifratura OpenSSL 1.1.1 valide cipher strings per il protocollo TLS 1.3 (i relativi 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 oppure stringhe di priorità GnuTLS valide priority strings. I relativi 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 sovrascrivere la selezione delle ciphersuite nelle utility zabbix_get e zabbix_sender, utilizzare i parametri della riga di comando:

  • --tls-cipher13
  • --tls-cipher

I nuovi parametri sono facoltativi. Se un parametro non è specificato, viene utilizzato il valore predefinito interno. Se un parametro è definito, non può essere vuoto.

Se l'impostazione di un valore TLSCipher* nella libreria crittografica non riesce, allora server, proxy o agent non si avvieranno e verrà registrato un errore.

È importante comprendere quando ciascun parametro è applicabile.

Connessioni in uscita

Il caso più semplice è quello delle connessioni in uscita:

  • Per le connessioni in uscita con certificato, utilizzare TLSCipherCert13 o TLSCipherCert
  • Per le connessioni in uscita con PSK, utilizzare TLSCipherPSK13 o TLSCipherPSK
  • Nel caso delle utility zabbix_get e zabbix_sender, è possibile usare i parametri della riga di comando --tls-cipher13 o --tls-cipher (la crittografia è specificata in modo univoco con il parametro --tls-connect)
Connessioni in ingresso

La gestione delle connessioni in ingresso è un po' più complessa perché le regole sono specifiche per i componenti e per la configurazione.

Per Zabbix agent:

Configurazione della connessione agent Configurazione dei 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 della connessione Configurazione dei cifrari
Connessioni in uscita che utilizzano PSK TLSCipherPSK, TLSCipherPSK13
Connessioni in ingresso che utilizzano certificati TLSCipherAll, TLSCipherAll13
Connessioni in ingresso che utilizzano PSK se il server non ha un certificato TLSCipherPSK, TLSCipherPSK13
Connessioni in ingresso che utilizzano PSK se il server ha un certificato TLSCipherAll, TLSCipherAll13

Nelle due tabelle sopra è possibile osservare un certo schema:

  • TLSCipherAll e TLSCipherAll13 possono essere specificati solo se viene utilizzato un elenco combinato di suite di cifratura basate su certificato e su PSK. Ciò avviene in due casi: server (proxy) con un certificato configurato (le suite di cifratura PSK sono sempre configurate su server e proxy se la libreria crittografica supporta PSK), agent configurato per accettare sia connessioni in ingresso basate su certificato sia su PSK
  • negli altri casi sono sufficienti TLSCipherCert* e/o TLSCipherPSK*

Le tabelle seguenti mostrano i valori predefiniti integrati di TLSCipher*. Possono essere un buon punto di partenza per definire i propri valori personalizzati.

Parameter 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
Parameter 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 alcuni esempi di suite di cifratura configurate dall'utente:

Test delle stringhe cipher e consentire solo cipher suite PFS

Per vedere quali cipher suite 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 cipher suite 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 o 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. Adattate i percorsi e i nomi dei file dei certificati e della PSK al vostro ambiente.

Se non usate certificati, ma solo PSK, potete creare un file di test più semplice:

  Hostname=nonexisting
  ServerActive=nonexisting

  TLSConnect=psk
  TLSPSKIdentity=nonexisting
  TLSPSKFile=/home/zabbix/agentd.psk

Le cipher suite 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 cipher suite 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 poche cipher suite, ad esempio solo quelle con PFS (Perfect Forward Secrecy). Proviamo a consentire solo le cipher suite con PFS usando i parametri TLSCipher*.

Il risultato non sarà interoperabile con sistemi che usano OpenSSL 1.0.1 e 1.0.2, se viene usata PSK. La crittografia basata su certificati dovrebbe funzionare.

Aggiungete due righe al file di configurazione test.conf:

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128

e testate 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 cipher suite TLS 1.3 e cipher 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 sopra. Per modificare TLSCipherAll e TLSCipherAll13 è necessario fare esperimenti con agent, proxy o server.

Quindi, per consentire solo cipher suite 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 il vostro ambiente Zabbix usa solo crittografia basata su PSK e nessun certificato, allora basta solo:

  TLSCipherPSK=kECDHEPSK+AES128

Ora che avete capito come funziona, potete testare la selezione delle cipher suite 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

Può essere preferibile usare 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, potete 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 utilizza AES128 come valore predefinito integrato per i dati. Supponiamo che si stiano utilizzando certificati e che si voglia passare ad AES256, su OpenSSL 1.1.1.

Questo può essere ottenuto aggiungendo i rispettivi parametri 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

Sebbene verranno utilizzate solo suite di cifratura relative ai certificati, vengono definiti anche i parametri TLSCipherPSK* per evitare i loro valori predefiniti, che includono cifrari meno sicuri per una più ampia 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