17 Encryptie

Overzicht

Zabbix ondersteunt versleutelde communicatie tussen Zabbix-componenten met behulp van het Transport Layer Security (TLS) protocol v1.2 en 1.3 (afhankelijk van de gebruikte cryptobibliotheek). Versleuteling op basis van certificaten en pre-shared keys (PSK) wordt ondersteund.

Versleuteling kan geconfigureerd worden voor verbindingen:

Versleuteling is optioneel en kan individueel geconfigureerd worden voor verschillende componenten:

  • Sommige proxies en agents kunnen geconfigureerd worden om certificaat-gebaseerde versleuteling met de server te gebruiken, terwijl andere PSK-gebaseerde versleuteling gebruiken, en weer andere doorgaan met onversleutelde communicatie (zoals voorheen).
  • De server (proxy) kan verschillende versleutelingsconfiguraties gebruiken voor verschillende hosts.

Zabbix-daemonprogramma's gebruiken één luisterpoort voor zowel versleutelde als onversleutelde inkomende verbindingen. Het toevoegen van versleuteling vereist geen nieuwe poorten openen in firewalls.

Beperkingen

  • Privésleutels worden onversleuteld opgeslagen in bestanden die leesbaar zijn voor Zabbix-componenten tijdens het opstarten.
  • Pre-shared keys worden ingevoerd in de Zabbix frontend en worden onversleuteld in de Zabbix-database opgeslagen.
  • Ingebouwde versleuteling beschermt communicatie niet:
    • Tussen de webserver waarop de Zabbix frontend draait en de webbrowser van de gebruiker.
    • Tussen Zabbix frontend en Zabbix server.
  • Momenteel wordt elke versleutelde verbinding geopend met een volledige TLS-handshake, er is geen sessie-caching en tickets geïmplementeerd.
  • Het toevoegen van versleuteling verhoogt de tijd die nodig is voor het controleren van items en acties, afhankelijk van de netwerklatentie:
    • Bijvoorbeeld, als de vertraging in de pakketten 100 ms is, dan duurt het ongeveer 200 ms om een TCP-verbinding te openen en een onversleuteld verzoek te verzenden. Met versleuteling wordt ongeveer 1000 ms toegevoegd voor het opzetten van de TLS-verbinding.
    • Time-outs moeten mogelijk worden verhoogd, anders kunnen sommige items en acties die externe scripts op agents uitvoeren werken met onversleutelde verbindingen, maar mislukken met time-outs bij versleutelde verbindingen.
  • Versleuteling wordt niet ondersteund door netwerkontdekking. Zabbix-agentcontroles uitgevoerd door netwerkontdekking zullen niet versleuteld zijn, en als de Zabbix-agent is geconfigureerd om onversleutelde verbindingen te weigeren, zullen dergelijke controles niet slagen.

Zabbix compileren met ondersteuning voor versleuteling

Om versleuteling te ondersteunen, moet Zabbix worden gecompileerd en gekoppeld met een van de ondersteunde cryptobibliotheken:

  • GnuTLS - vanaf versie 3.1.18
  • OpenSSL - versies 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x
  • LibreSSL - getest met versies 2.7.4, 2.8.2:
    • LibreSSL 2.6.x wordt niet ondersteund
    • LibreSSL wordt ondersteund als een compatibele vervanging van OpenSSL; de nieuwe tls_*() specifieke API-functies van LibreSSL worden niet gebruikt. Zabbix-componenten die zijn gecompileerd met LibreSSL kunnen geen PSK gebruiken, alleen certificaten kunnen worden gebruikt.

U kunt meer te weten komen over het instellen van SSL voor de Zabbix frontend door te verwijzen naar deze best practices.

De bibliotheek wordt geselecteerd door de respectievelijke optie aan te geven aan het "configure" script:

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR] (ook gebruikt voor LibreSSL)

Bijvoorbeeld, om de broncode voor de server en agent te configureren met OpenSSL kunt u iets als volgt gebruiken:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

Verschillende Zabbix-componenten kunnen worden gecompileerd met verschillende cryptobibliotheken (bijv. een server met OpenSSL, een agent met GnuTLS).

Als u van plan bent om pre-shared keys (PSK) te gebruiken, overweeg dan om GnuTLS of OpenSSL 1.1.0 (of nieuwer) bibliotheken te gebruiken in Zabbix-componenten die PSK's gebruiken. GnuTLS en OpenSSL 1.1.0 bibliotheken ondersteunen PSK-ciphersuites met Perfect Forward Secrecy. Oudere versies van de OpenSSL-bibliotheek (1.0.1, 1.0.2c) ondersteunen ook PSK's, maar beschikbare PSK-ciphersuites bieden geen Perfect Forward Secrecy.

Beheer van verbindingssleutels

Verbindingen in Zabbix kunnen gebruikmaken van:

Er zijn twee belangrijke parameters die worden gebruikt om versleuteling tussen Zabbix-componenten te specificeren:

  • TLSConnect - geeft aan welke versleuteling moet worden gebruikt voor uitgaande verbindingen (ongecodeerd, PSK of certificaat)
  • TLSAccept - geeft aan welke typen verbindingen zijn toegestaan voor inkomende verbindingen (ongecodeerd, PSK of certificaat). Er kunnen één of meer waarden worden gespecificeerd.

TLSConnect wordt gebruikt in de configuratiebestanden voor Zabbix-proxy's (in actieve modus, specificeert alleen verbindingen met de server) en Zabbix-agenten (voor actieve controles). In de Zabbix-frontend is het equivalent van TLSConnect het veld Verbindingen met host in het tabblad Gegevensverzameling → Hosts → <een bepaalde host> en het veld Verbindingen met proxy in het tabblad Beheer → Proxies → <een bepaalde proxy>. Als het geconfigureerde versleutelingstype voor de verbinding mislukt, worden er geen andere versleutelingstypen geprobeerd.

TLSAccept wordt gebruikt in de configuratiebestanden voor Zabbix-proxy's (in passieve modus, specificeert alleen verbindingen vanaf de server) en Zabbix-agenten (voor passieve controles). In de Zabbix-frontend is het equivalent van TLSAccept het veld Verbindingen vanaf host in het tabblad Gegevensverzameling → Hosts → <een bepaalde host> en het veld Verbindingen vanaf proxy in het tabblad Beheer → Proxies → <een bepaalde proxy>.

Normaal gesproken configureert u slechts één type versleuteling voor inkomende versleutelingen. Maar u wilt mogelijk het versleutelingstype wijzigen, bijvoorbeeld van ongecodeerd naar op certificaat gebaseerd met minimale downtime en de mogelijkheid om terug te rollen. Om dit te bereiken:

  • Stel TLSAccept=unencrypted,cert in het configuratiebestand van de agent in en herstart de Zabbix-agent.
  • Test de verbinding met zabbix_get naar de agent met behulp van een certificaat. Als het werkt, kunt u de versleuteling opnieuw configureren voor die agent in de Zabbix-frontend in het tabblad Gegevensverzameling → Hosts → <een bepaalde host> door Verbindingen met host in te stellen op "Certificaat".
  • Wanneer de configuratiecache van de server wordt bijgewerkt (en de proxyconfiguratie wordt bijgewerkt als de host wordt gemonitord door een proxy), worden de verbindingen met die agent versleuteld.
  • Als alles zoals verwacht werkt, kunt u TLSAccept=cert in het configuratiebestand van de agent instellen en de Zabbix-agent opnieuw starten. Nu zal de agent alleen versleutelde certificaatgebaseerde verbindingen accepteren. Ongecodeerde en PSK-gebaseerde verbindingen worden afgewezen.

Op een vergelijkbare manier werkt dit op de server en proxy. Als in de Zabbix-frontend in de hostconfiguratie Verbindingen vanaf host is ingesteld op "Certificaat", worden alleen certificaatgebaseerde versleutelde verbindingen geaccepteerd van de agent (actieve controles) en zabbix_sender (trapper-items).

Waarschijnlijk configureert u inkomende en uitgaande verbindingen om hetzelfde versleutelingstype te gebruiken of helemaal geen versleuteling. Maar technisch gezien is het mogelijk om het asymmetrisch te configureren, bijvoorbeeld certificaatgebaseerde versleuteling voor inkomende en PSK-gebaseerde versleuteling voor uitgaande verbindingen.

De versleutelingsconfiguratie voor elke host wordt weergegeven in de Zabbix-frontend, in Gegevensverzameling → Hosts in de kolom Agentversleuteling. Bijvoorbeeld:

Voorbeeld Verbindingen met host Toegestane verbindingen vanaf host Afgewezen verbindingen vanaf host
none_none.png Ongecodeerd Ongecodeerd Gecodeerd, certificaat- en PSK-gecodeerd
cert_cert.png Gecodeerd, certificaatgebaseerd Gecodeerd, certificaatgebaseerd Ongecodeerd en PSK-gecodeerd
psk_psk.png Gecodeerd, PSK-gebaseerd Gecodeerd, PSK-gebaseerd Ongecodeerd en certificaatgecodeerd
psk_none_psk.png Gecodeerd, PSK-gebaseerd Ongecodeerd en PSK-gecodeerd Certificaatgebaseerd gecodeerd
cert_all.png Gecodeerd, certificaatgebaseerd Ongecodeerd, PSK of certificaatgebaseerd gecodeerd -

Standaard zijn verbindingen niet versleuteld. Versleuteling moet individueel worden geconfigureerd voor elke host en proxy.

zabbix_get en zabbix_sender met versleuteling

Zie de manpagina's voor zabbix_get en zabbix_sender voor het gebruik ervan met versleuteling.

Ciphersuites

Ciphersuites worden standaard intern geconfigureerd tijdens het opstarten van Zabbix en zijn vóór Zabbix 4.0.19, 4.4.7, niet configureerbaar door de gebruiker.

Sinds Zabbix 4.0.19, 4.4.7 worden ook door de gebruiker geconfigureerde ciphersuites ondersteund voor GnuTLS en OpenSSL. Gebruikers kunnen ciphersuites configureren volgens hun beveiligingsbeleid. Het gebruik van deze functie is optioneel (ingebouwde standaard ciphersuites werken nog steeds).

Voor cryptobibliotheken die zijn gecompileerd met standaardinstellingen leiden de ingebouwde regels van Zabbix doorgaans tot de volgende ciphersuites (in volgorde van hogere naar lagere prioriteit):

Bibliotheek Certificaat 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

Gebruiker-geconfigureerde ciphersuites

De ingebouwde criteria voor ciphersuite-selectie kunnen worden overschreven met gebruiker-geconfigureerde ciphersuites.

Gebruiker-geconfigureerde ciphersuites is een functie bedoeld voor gevorderde gebruikers die TLS-ciphersuites begrijpen, hun beveiliging en de gevolgen van fouten kennen, en die vertrouwd zijn met TLS probleemoplossing.

De ingebouwde criteria voor ciphersuite-selectie kunnen worden overschreven met behulp van de volgende parameters:

Scope van overschrijving Parameter Waarde Omschrijving
Ciphersuite-selectie voor certificaten TLSCipherCert13 Geldige OpenSSL 1.1.1 ciphersnaren voor TLS 1.3-protocol (hun waarden worden doorgegeven aan de OpenSSL-functie SSL_CTX_set_ciphersuites()). Ciphersuite-selectiecriteria op basis van certificaten voor TLS 1.3

Alleen OpenSSL 1.1.1 of nieuwer.
TLSCipherCert Geldige OpenSSL ciphersnaren voor TLS 1.2 of geldige GnuTLS prioriteitssnaren. Hun waarden worden respectievelijk doorgegeven aan de functies SSL_CTX_set_cipher_list() of gnutls_priority_init(). Ciphersuite-selectiecriteria op basis van certificaten voor TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Ciphersuite-selectie voor PSK TLSCipherPSK13 Geldige OpenSSL 1.1.1 ciphersnaren voor TLS 1.3-protocol (hun waarden worden doorgegeven aan de OpenSSL-functie SSL_CTX_set_ciphersuites()). Ciphersuite-selectiecriteria op basis van PSK voor TLS 1.3

Alleen OpenSSL 1.1.1 of nieuwer.
TLSCipherPSK Geldige OpenSSL ciphersnaren voor TLS 1.2 of geldige GnuTLS prioriteitssnaren. Hun waarden worden respectievelijk doorgegeven aan de functies SSL_CTX_set_cipher_list() of gnutls_priority_init(). Ciphersuite-selectiecriteria op basis van PSK voor TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Gecombineerde ciphersuitelijst voor certificaat en PSK TLSCipherAll13 Geldige OpenSSL 1.1.1 ciphersnaren voor TLS 1.3-protocol (hun waarden worden doorgegeven aan de OpenSSL-functie SSL_CTX_set_ciphersuites()). Ciphersuite-selectiecriteria voor TLS 1.3

Alleen OpenSSL 1.1.1 of nieuwer.
TLSCipherAll Geldige OpenSSL ciphersnaren voor TLS 1.2 of geldige GnuTLS prioriteitssnaren. Hun waarden worden respectievelijk doorgegeven aan de functies SSL_CTX_set_cipher_list() of gnutls_priority_init(). Ciphersuite-selectiecriteria voor TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)

Om de ciphersuite-selectie te overschrijven in zabbix_get en zabbix_sender hulpprogramma's - gebruik de commandoregelparameters:

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

De nieuwe parameters zijn optioneel. Als een parameter niet is opgegeven, wordt de interne standaardwaarde gebruikt. Als een parameter is gedefinieerd, kan deze niet leeg zijn.

Als het instellen van een TLSCipher* waarde in de cryptobibliotheek mislukt, zal de server, proxy of agent niet starten en wordt er een fout gelogd.

Het is belangrijk om te begrijpen wanneer elke parameter van toepassing is.

Uitgaande verbindingen

Het eenvoudigste geval betreft uitgaande verbindingen:

  • Voor uitgaande verbindingen met certificaat - gebruik TLSCipherCert13 of TLSCipherCert
  • Voor uitgaande verbindingen met PSK - gebruik TLSCipherPSK13 of TLSCipherPSK
  • In geval van de hulpprogramma's zabbix_get en zabbix_sender kunnen de commandoregelparameters --tls-cipher13 of --tls-cipher worden gebruikt (versleuteling wordt ondubbelzinnig gespecificeerd met een --tls-connect parameter)
Inkomende verbindingen

Het is iets gecompliceerder met inkomende verbindingen omdat de regels specifiek zijn voor componenten en configuratie.

Voor de Zabbix agent:

Instelling agentverbinding Ciphersuite-configuratie
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

Voor Zabbix server en proxy:

Verbindingsinstelling Ciphersuite-configuratie
Uitgaande verbindingen met PSK TLSCipherPSK, TLSCipherPSK13
Inkomende verbindingen met certificaten TLSCipherAll, TLSCipherAll13
Inkomende verbindingen met PSK als server geen certificaat heeft TLSCipherPSK, TLSCipherPSK13
Inkomende verbindingen met PSK als server wel een certificaat heeft TLSCipherAll, TLSCipherAll13

In de twee bovenstaande tabellen kan een patroon worden waargenomen:

  • TLSCipherAll en TLSCipherAll13 kunnen alleen worden opgegeven als een gecombineerde lijst van certificaat- en PSK-gebaseerde ciphersuites wordt gebruikt. Er zijn twee gevallen waarin dit het geval is: server (proxy) met een geconfigureerd certificaat (PSK-ciphersuites zijn altijd geconfigureerd op de server, proxy als de cryptobibliotheek PSK ondersteunt), agent geconfigureerd om zowel inkomende verbindingen op basis van certificaten als PSK te accepteren
  • in andere gevallen zijn TLSCipherCert* en/of TLSCipherPSK* voldoende

De volgende tabellen tonen de ingebouwde standaardwaarden voor TLSCipher*. Deze kunnen een goed startpunt zijn voor uw eigen aangepaste waarden.

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 Standaardwaarden verschillen voor oudere OpenSSL-versies (1.0.1, 1.0.2, 1.1.0), voor LibreSSL en als OpenSSL is gecompileerd zonder PSK-ondersteuning.

Voorbeelden van door de gebruiker geconfigureerde ciphersuites

Hieronder volgen enkele voorbeelden van door de gebruiker geconfigureerde ciphersuites:

Testen van ciphersnaren en alleen toestaan van PFS-ciphersuites

Om te zien welke ciphersuites zijn geselecteerd, moet je 'DebugLevel=4' instellen in het configuratiebestand, of de -vv optie gebruiken voor zabbix_sender.

Enig experiment met TLSCipher* parameters kan nodig zijn voordat je de gewenste ciphersuites krijgt. Het is onhandig om Zabbix-server, -proxy of -agent meerdere keren opnieuw te starten om TLSCipher* parameters aan te passen. Meer handige opties zijn het gebruik van zabbix_sender of het openssl commando. Laten we beide methoden bekijken.

1. Gebruik van zabbix_sender.

Laten we een testconfiguratiebestand maken, bijvoorbeeld /home/zabbix/test.conf, met de syntaxis van een zabbix_agentd.conf-bestand:

  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

Je hebt geldige CA- en agentcertificaten en PSK nodig voor dit voorbeeld. Pas certificaat- en PSK-bestandspaden en -namen aan voor jouw omgeving.

Als je geen certificaten gebruikt, maar alleen PSK, kun je een eenvoudiger testbestand maken:

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

De geselecteerde ciphersuites kunnen worden bekeken door zabbix_sender uit te voeren (voorbeeld gecompileerd met 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

Hier zie je de standaard geselecteerde ciphersuites. Deze standaardwaarden zijn gekozen om interoperabiliteit te waarborgen met Zabbix-agents die draaien op systemen met oudere OpenSSL-versies (vanaf 1.0.1).

Met nieuwere systemen kun je ervoor kiezen om de beveiliging te verscherpen door alleen een paar ciphersuites toe te staan, bijvoorbeeld alleen ciphersuites met PFS (Perfect Forward Secrecy). Laten we proberen alleen ciphersuites met PFS toe te staan met behulp van de TLSCipher* parameters.

Het resultaat zal niet interoperabel zijn met systemen die OpenSSL 1.0.1 en 1.0.2 gebruiken, als PSK wordt gebruikt. Versleuteling op basis van certificaten zou moeten werken.

Voeg twee regels toe aan het test.conf configuratiebestand:

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

en test opnieuw:

  $ 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        

De lijsten "certificate ciphersuites" en "PSK ciphersuites" zijn gewijzigd - ze zijn korter dan voorheen en bevatten alleen TLS 1.3 ciphersuites en TLS 1.2 ECDHE-* ciphersuites zoals verwacht.

2. TLSCipherAll en TLSCipherAll13 kunnen niet worden getest met zabbix_sender; ze beïnvloeden de waarde van "certificate and PSK ciphersuites" niet zoals in het bovenstaande voorbeeld. Om TLSCipherAll en TLSCipherAll13 aan te passen, moet je experimenteren met de agent, proxy of server.

Dus om alleen PFS-ciphersuites toe te staan, moet je mogelijk tot drie parameters toevoegen:

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

aan zabbix_agentd.conf, zabbix_proxy.conf en zabbix_server_conf als elk van hen een geconfigureerd certificaat heeft en de agent ook PSK heeft.

Als jouw Zabbix-omgeving alleen op PSK-gebaseerde versleuteling gebruikt en geen certificaten, dan slechts één:

  TLSCipherPSK=kECDHEPSK+AES128

Nu je begrijpt hoe het werkt, kun je de ciphersuite-selectie testen, zelfs buiten Zabbix, met het openssl commando. Laten we alle drie de waarden van de TLSCipher* parameters testen:

  $ 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
         

Je kunt ook openssl ciphers met de optie -V gebruiken voor een meer gedetailleerde uitvoer:

  $ 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

Op een vergelijkbare manier kun je de prioriteitssnaren testen voor 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
Overschakelen van AES128 naar AES256

Zabbix gebruikt AES128 als de ingebouwde standaard voor gegevens. Laten we aannemen dat u certificaten gebruikt en wilt overschakelen naar AES256, op OpenSSL 1.1.1.

Dit kan worden bereikt door de respectieve parameters toe te voegen 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

Hoewel alleen cijfers met betrekking tot certificaten worden gebruikt, zijn de TLSCipherPSK* parameters ook gedefinieerd om de standaardwaarden te vermijden, die minder veilige cijfers bevatten voor bredere interoperabiliteit. PSK-cijfers kunnen niet volledig worden uitgeschakeld op server/proxy.

En 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