Šifrēšana un drošība

Šifrēšana

Zabbix atbalsta šifrētu saziņu starp Zabbix komponentēm, izmantojot Transport Layer Security (TLS) protokolu v.1.2 un 1.3 (atkarībā no kripto bibliotēkas). Tiek atbalstīta uz sertifikātiem balstīta un uz iepriekš koplietotu atslēgu balstīta šifrēšana.

Šifrēšanu var konfigurēt savienojumiem:

Šifrēšana ir izvēles un konfigurējama atsevišķām komponentēm:

  • Dažus starpniekserverus un aģentus var konfigurēt tā, lai tie ar serveri izmantotu uz sertifikātiem balstītu šifrēšanu, kamēr citi var izmantot uz iepriekš koplietotu atslēgu balstītu šifrēšanu, bet vēl citi turpina izmantot nešifrētu saziņu (kā iepriekš).
  • Serveris (starpniekserveris) var izmantot atšķirīgas šifrēšanas konfigurācijas dažādiem hosts.

Zabbix dēmona programmas izmanto vienu klausīšanās portu šifrētiem un nešifrētiem ienākošajiem savienojumiem. Šifrēšanas pievienošana neprasa atvērt jaunus portus ugunsmūros.

Ierobežojumi
  • Privātās atslēgas tiek glabātas vienkāršā tekstā failos, kurus Zabbix komponentes var nolasīt palaišanas laikā.
  • Iepriekš koplietotās atslēgas tiek ievadītas Zabbix lietotāja saskarne un glabātas Zabbix datubāzē vienkāršā tekstā.
  • Iebūvētā šifrēšana neaizsargā saziņu starp tīmekļa serveri, kurā darbojas Zabbix lietotāja saskarne, un lietotāja tīmekļa pārlūkprogrammu.
  • Pašlaik katrs šifrētais savienojums tiek atvērts ar pilnu TLS rokasspiedienu; sesiju kešošana un biļetes netiek ieviestas.
  • Šifrēšanas pievienošana palielina vienums pārbaužu un darbību izpildes laiku atkarībā no tīkla latentuma:
    • Piemēram, ja pakešu aizture ir 100 ms, tad TCP savienojuma atvēršana un nešifrēta pieprasījuma nosūtīšana aizņem apmēram 200 ms. Ar šifrēšanu TLS savienojuma izveidei tiek pievienotas aptuveni 1000 ms.
    • Var būt nepieciešams palielināt noildzes, pretējā gadījumā daži vienumi un darbības, kas uz aģentiem palaiž attālinātus skriptus, var darboties ar nešifrētiem savienojumiem, bet ar šifrētiem savienojumiem neizdoties noildzes dēļ.
  • Šifrēšana netiek atbalstīta tīkla atklāšanā. Zabbix aģents pārbaudes, kas tiek veiktas tīkla atklāšanas laikā, būs nešifrētas, un, ja Zabbix aģents ir konfigurēts noraidīt nešifrētus savienojumus, šādas pārbaudes neizdosies.

Zabbix kompilēšana ar šifrēšanas atbalstu

Lai nodrošinātu šifrēšanu, Zabbix ir jākopilē un jāsaista ar vienu no atbalstītajām kriptogrāfijas bibliotēkām:

  • GnuTLS - no versijas 3.1.18
  • OpenSSL - versijas 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x - 3.5.x
  • LibreSSL - testēts ar versijām 2.7.4, 2.8.2:
    • LibreSSL 2.6.x netiek atbalstīts
    • LibreSSL tiek atbalstīts kā ar OpenSSL saderīgs aizstājējs; jaunās LibreSSL specifiskās tls_*() API funkcijas netiek izmantotas. Zabbix komponenti, kas kompilēti ar LibreSSL, nevarēs izmantot PSK, var izmantot tikai sertifikātus.

Vairāk par SSL iestatīšanu Zabbix lietotāja saskarnei varat uzzināt, skatot šīs labās prakses.

Bibliotēka tiek izvēlēta, norādot attiecīgo opciju skriptam "configure":

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR] (tiek izmantots arī LibreSSL)

Piemēram, lai konfigurētu servera un aģenta avotus ar OpenSSL, varat izmantot, piemēram, šādu komandu:

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

Dažādus Zabbix komponentus var kompilēt ar dažādām kriptogrāfijas bibliotēkām (piemēram, serveri ar OpenSSL, aģentu ar GnuTLS).

Ja plānojat izmantot iepriekš koplietotas atslēgas (PSK), apsveriet iespēju Zabbix komponentos, kas izmanto PSK, lietot GnuTLS vai OpenSSL 1.1.0 (vai jaunākas) bibliotēkas. GnuTLS un OpenSSL 1.1.0 bibliotēkas atbalsta PSK šifru kopas ar Perfect Forward Secrecy. Vecākas OpenSSL bibliotēkas versijas (1.0.1, 1.0.2c) arī atbalsta PSK, taču pieejamās PSK šifru kopas nenodrošina Perfect Forward Secrecy.

Savienojumu šifrēšanas pārvaldība

Savienojumi Zabbix var izmantot:

Ir divi svarīgi parametri, ko izmanto, lai norādītu šifrēšanu starp Zabbix komponentiem:

  • TLSConnect - norāda, kādu šifrēšanu izmantot izejošajiem savienojumiem (nešifrēts, PSK vai sertifikāts)
  • TLSAccept - norāda, kādi savienojumu tipi ir atļauti ienākošajiem savienojumiem (nešifrēts, PSK vai sertifikāts). Var norādīt vienu vai vairākas vērtības.

TLSConnect tiek izmantots Zabbix starpniekservera konfigurācijas failos (aktīvajā režīmā norāda tikai savienojumus ar serveris) un Zabbix aģents (aktīvajām pārbaudēm). Zabbix lietotāja saskarne TLSConnect ekvivalents ir lauks Connections to host sadaļā Data collection > Hosts > <some host> > cilnē Encryption un lauks Connections to proxy sadaļā Administration > Proxies> <some proxy> > cilnē Encryption. Ja konfigurētais savienojuma šifrēšanas tips neizdodas, citi šifrēšanas tipi netiks mēģināti.

TLSAccept tiek izmantots Zabbix starpniekservera konfigurācijas failos (pasīvajā režīmā norāda tikai savienojumus no serveris) un Zabbix aģents (pasīvajām pārbaudēm). Zabbix lietotāja saskarne TLSAccept ekvivalents ir lauks Connections from host sadaļā Data collection > Hosts > <some host> > cilnē Encryption un lauks Connections from proxy sadaļā Administration > Proxies > <some proxy> > Encryption cilnē.

Parasti ienākošajiem savienojumiem konfigurē tikai vienu šifrēšanas veidu. Taču var būt nepieciešams pārslēgt šifrēšanas tipu, piemēram, no nešifrēta uz sertifikātā balstītu ar minimālu dīkstāvi un iespēju atgriezties iepriekšējā stāvoklī. Lai to panāktu:

  • Iestatiet TLSAccept=unencrypted,cert aģents konfigurācijas failā un restartējiet Zabbix aģents
  • Pārbaudiet savienojumu ar zabbix_get uz aģents, izmantojot sertifikātu. Ja tas darbojas, varat pārkonfigurēt šī aģents šifrēšanu Zabbix lietotāja saskarne sadaļā Data collection > Hosts > <some host> > cilnē Encryption, iestatot Connections to host uz "Certificate".
  • Kad serveris konfigurācijas kešatmiņa tiek atjaunināta (un starpniekserveris konfigurācija tiek atjaunināta, ja hosts tiek uzraudzīts ar starpniekserveris), tad savienojumi ar šo aģents tiks šifrēti
  • Ja viss darbojas, kā paredzēts, varat iestatīt TLSAccept=cert aģents konfigurācijas failā un restartēt Zabbix aģents. Tagad aģents pieņems tikai šifrētus, sertifikātā balstītus savienojumus. Nešifrēti un PSK balstīti savienojumi tiks noraidīti.

Līdzīgā veidā tas darbojas arī uz serveris un starpniekserveris. Ja Zabbix lietotāja saskarne hosts konfigurācijā Connections from host ir iestatīts uz "Certificate", tad tiks pieņemti tikai sertifikātā balstīti šifrēti savienojumi no aģents (aktīvās pārbaudes) un zabbix_sender (trapper vienums).

Visticamāk, jūs konfigurēsiet ienākošos un izejošos savienojumus, lai tie izmantotu vienu un to pašu šifrēšanas tipu vai vispār bez šifrēšanas. Taču tehniski ir iespējams tos konfigurēt asimetriski, piemēram, sertifikātā balstītu šifrēšanu ienākošajiem un PSK balstītu izejošajiem savienojumiem.

Šifrēšanas konfigurācija katram hosts tiek parādīta Zabbix lietotāja saskarne sadaļā Data collection > Hosts kolonnā Agent encryption. Piemēram:

Example Connections to host Allowed connections from host Rejected connections from host
none\_none.png Nešifrēts Nešifrēts Šifrēts, sertifikātā un PSK balstīti šifrēts
cert\_cert.png Šifrēts, sertifikātā balstīts Šifrēts, sertifikātā balstīts Nešifrēts un PSK balstīti šifrēts
psk\_psk.png Šifrēts, PSK balstīts Šifrēts, PSK balstīts Nešifrēts un sertifikātā balstīti šifrēts
psk\_none\_psk.png Šifrēts, PSK balstīts Nešifrēts un PSK balstīti šifrēts Sertifikātā balstīti šifrēts
cert\_all.png Šifrēts, sertifikātā balstīts Nešifrēts, PSK vai sertifikātā balstīti šifrēts -

Savienojumi pēc noklusējuma ir nešifrēti. Šifrēšana ir jākonfigurē katram hosts un starpniekserveris atsevišķi.

zabbix_get un zabbix_sender ar šifrēšanu

Skatiet zabbix_get un zabbix_sender rokasgrāmatas lapas par to lietošanu ar šifrēšanu.

Šifru komplekti

Šifru komplekti pēc noklusējuma tiek konfigurēti iekšēji Zabbix startēšanas laikā.

Tiek atbalstīti arī lietotāja konfigurēti šifru komplekti GnuTLS un OpenSSL. Lietotāji var konfigurēt šifru komplektus atbilstoši savām drošības politikām. Šīs funkcijas izmantošana nav obligāta (iebūvētie noklusējuma šifru komplekti joprojām darbojas).

Kriptogrāfijas bibliotēkām, kas kompilētas ar noklusējuma iestatījumiem, Zabbix iebūvētie noteikumi parasti rezultējas šādos šifru komplektos (secībā no augstākas uz zemāku prioritāti):

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

Lietotāja konfigurēti ciphersuites

Iebūvētie ciphersuite atlases kritēriji var tikt pārrakstīti, izmantojot lietotāja konfigurētus ciphersuites.

Lietotāja konfigurēti ciphersuites ir funkcija, kas paredzēta pieredzējušiem lietotājiem, kuri izprot TLS ciphersuites, to drošību un kļūdu sekas, kā arī jūtas pārliecināti TLS problēmu novēršanā.

Iebūvētie ciphersuite atlases kritēriji var tikt pārrakstīti, izmantojot šādus parametrus:

Override scope Parameter Value Description
Ciphersuite selection for certificates TLSCipherCert13 Derīgas OpenSSL 1.1.1 cipher strings TLS 1.3 protokolam (to vērtības tiek nodotas OpenSSL funkcijai SSL_CTX_set_ciphersuites()). Uz sertifikātiem balstīti ciphersuite atlases kritēriji TLS 1.3

Tikai OpenSSL 1.1.1 vai jaunāka versija.
TLSCipherCert Derīgas OpenSSL cipher strings TLS 1.2 vai derīgas GnuTLS priority strings. To vērtības tiek nodotas attiecīgi funkcijām SSL_CTX_set_cipher_list() vai gnutls_priority_init(). Uz sertifikātiem balstīti ciphersuite atlases kritēriji TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Ciphersuite selection for PSK TLSCipherPSK13 Derīgas OpenSSL 1.1.1 cipher strings TLS 1.3 protokolam (to vērtības tiek nodotas OpenSSL funkcijai SSL_CTX_set_ciphersuites()). Uz PSK balstīti ciphersuite atlases kritēriji TLS 1.3

Tikai OpenSSL 1.1.1 vai jaunāka versija.
TLSCipherPSK Derīgas OpenSSL cipher strings TLS 1.2 vai derīgas GnuTLS priority strings. To vērtības tiek nodotas attiecīgi funkcijām SSL_CTX_set_cipher_list() vai gnutls_priority_init(). Uz PSK balstīti ciphersuite atlases kritēriji TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Combined ciphersuite list for certificate and PSK TLSCipherAll13 Derīgas OpenSSL 1.1.1 cipher strings TLS 1.3 protokolam (to vērtības tiek nodotas OpenSSL funkcijai SSL_CTX_set_ciphersuites()). Ciphersuite atlases kritēriji TLS 1.3

Tikai OpenSSL 1.1.1 vai jaunāka versija.
TLSCipherAll Derīgas OpenSSL cipher strings TLS 1.2 vai derīgas GnuTLS priority strings. To vērtības tiek nodotas attiecīgi funkcijām SSL_CTX_set_cipher_list() vai gnutls_priority_init(). Ciphersuite atlases kritēriji TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)

Lai pārrakstītu ciphersuite atlasi zabbix_get un zabbix_sender utilītās, izmantojiet komandrindas parametrus:

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

Jaunie parametri nav obligāti. Ja parametrs nav norādīts, tiek izmantota iekšējā noklusējuma vērtība. Ja parametrs ir definēts, tas nevar būt tukšs.

Ja TLSCipher* vērtības iestatīšana kriptogrāfijas bibliotēkā neizdodas, serveris, starpniekserveris vai aģents netiks palaists, un tiks reģistrēta kļūda.

Ir svarīgi saprast, kad katrs parametrs ir piemērojams.

Izejošie savienojumi

Vienkāršākais gadījums ir izejošie savienojumi:

  • Izejošajiem savienojumiem ar sertifikātu - izmantojiet TLSCipherCert13 vai TLSCipherCert
  • Izejošajiem savienojumiem ar PSK - izmantojiet TLSCipherPSK13 vai TLSCipherPSK
  • Zabbix_get un zabbix_sender utilītprogrammām var izmantot komandrindas parametrus --tls-cipher13 vai --tls-cipher (šifrēšana ir nepārprotami norādīta ar --tls-connect parametru)
Ienākošie savienojumi

Ar ienākošajiem savienojumiem ir nedaudz sarežģītāk, jo noteikumi ir specifiski komponentiem un konfigurācijai.

Zabbix aģentam:

Agent connection setup Cipher configuration
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

Zabbix serverim un starpniekserverim:

Connection setup Cipher configuration
Outgoing connections using PSK TLSCipherPSK, TLSCipherPSK13
Incoming connections using certificates TLSCipherAll, TLSCipherAll13
Incoming connections using PSK if server has no certificate TLSCipherPSK, TLSCipherPSK13
Incoming connections using PSK if server has certificate TLSCipherAll, TLSCipherAll13

Iepriekš redzamajās divās tabulās var saskatīt noteiktu likumsakarību:

  • TLSCipherAll un TLSCipherAll13 var norādīt tikai tad, ja tiek izmantots apvienots sertifikātu- un PSK balstītu šifru komplektu saraksts. Tas notiek divos gadījumos: serveris (starpniekserveris) ar konfigurētu sertifikātu (PSK šifru komplekti vienmēr ir konfigurēti serverī, starpniekserverī ja kriptogrāfijas bibliotēka atbalsta PSK), aģents ir konfigurēts pieņemt gan sertifikātu-, gan PSK balstītus ienākošos savienojumus
  • citos gadījumos pietiek ar TLSCipherCert* un/vai TLSCipherPSK*

Tālāk redzamajās tabulās ir parādītas iebūvētās noklusējuma TLSCipher* vērtības. Tās var būt labs sākumpunkts jūsu pašu pielāgotajām vērtībām.

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 Noklusējuma vērtības ir atšķirīgas vecākām OpenSSL versijām (1.0.1, 1.0.2, 1.1.0), LibreSSL un gadījumā, ja OpenSSL ir kompilēts bez PSK atbalsta.

Lietotāja konfigurētu šifru komplektu piemēri

Tālāk skatiet šādus lietotāja konfigurētu šifru komplektu piemērus:

Cipher stringu testēšana un tikai PFS cipher suite atļaušana

Lai redzētu, kuras cipher suite ir atlasītas, konfigurācijas failā jāiestata DebugLevel=4 vai jāizmanto -vv opcija komandai zabbix_sender.

Lai iegūtu vēlamās cipher suite, var būt nepieciešami daži eksperimenti ar TLSCipher* parametriem. Nav ērti vairākas reizes restartēt Zabbix serveri, starpniekserveri vai aģentu tikai tāpēc, lai pielāgotu TLSCipher* parametrus. Ērtāk ir izmantot zabbix_sender vai komandu openssl. Apskatīsim abus variantus.

1. Izmantojot zabbix_sender.

Izveidosim testa konfigurācijas failu, piemēram, /home/zabbix/test.conf, ar zabbix_agentd.conf faila sintaksi:

  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

Šim piemēram ir nepieciešami derīgi CA un aģenta sertifikāti, kā arī PSK. Pielāgojiet sertifikātu un PSK failu ceļus un nosaukumus savai videi.

Ja neizmantojat sertifikātus, bet tikai PSK, varat izveidot vienkāršāku testa failu:

  Hostname=nonexisting
  ServerActive=nonexisting

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

Atlasītās cipher suite var apskatīt, palaižot zabbix_sender (piemērs kompilēts ar 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

Šeit redzamas pēc noklusējuma atlasītās cipher suite. Šīs noklusējuma vērtības ir izvēlētas, lai nodrošinātu savietojamību ar Zabbix aģentiem, kas darbojas sistēmās ar vecākām OpenSSL versijām (no 1.0.1).

Jaunākās sistēmās drošību var pastiprināt, atļaujot tikai dažas cipher suite, piemēram, tikai cipher suite ar PFS (Perfect Forward Secrecy). Pamēģināsim atļaut tikai cipher suite ar PFS, izmantojot TLSCipher* parametrus.

Rezultāts nebūs savietojams ar sistēmām, kurās tiek izmantots OpenSSL 1.0.1 un 1.0.2, ja tiek lietots PSK. Sertifikātu balstītai šifrēšanai vajadzētu darboties.

Pievienojiet divas rindas test.conf konfigurācijas failam:

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

un pārbaudiet vēlreiz:

  $ 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        

Saraksti "certificate ciphersuites" un "PSK ciphersuites" ir mainījušies - tie ir īsāki nekā iepriekš un, kā paredzēts, satur tikai TLS 1.3 cipher suite un TLS 1.2 ECDHE-* cipher suite.

2. TLSCipherAll un TLSCipherAll13 nevar pārbaudīt ar zabbix_sender; tie neietekmē iepriekšējā piemērā parādīto vērtību "certificate and PSK ciphersuites". Lai pielāgotu TLSCipherAll un TLSCipherAll13, ir jāeksperimentē ar aģentu, starpniekserveri vai serveri.

Tātad, lai atļautu tikai PFS cipher suite, var būt nepieciešams pievienot līdz trim parametriem

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

uz zabbix_agentd.conf, zabbix_proxy.conf un zabbix_server.conf, ja katram no tiem ir konfigurēts sertifikāts un aģentam ir arī PSK.

Ja jūsu Zabbix vidē tiek izmantota tikai uz PSK balstīta šifrēšana un nav sertifikātu, tad pietiek ar vienu:

  TLSCipherPSK=kECDHEPSK+AES128

Tagad, kad saprotat, kā tas darbojas, cipher suite atlasi var pārbaudīt arī ārpus Zabbix, izmantojot komandu openssl. Pārbaudīsim visas trīs TLSCipher* parametru vērtības:

  $ 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

Varat dot priekšroku openssl ciphers ar opciju -V, lai iegūtu detalizētāku izvadi:

  $ 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

Līdzīgi varat pārbaudīt GnuTLS prioritāšu virknes:

  $ 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
Pārslēgšanās no AES128 uz AES256

Zabbix izmanto AES128 kā iebūvēto noklusējumu datiem. Pieņemsim, ka jūs izmantojat sertifikātus un vēlaties pārslēgties uz AES256, izmantojot OpenSSL 1.1.1.

To var panākt, pievienojot attiecīgos parametrus failā 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

Lai gan tiks izmantoti tikai ar sertifikātiem saistītie šifru komplekti, tiek definēti arī parametri TLSCipherPSK*, lai izvairītos no to noklusējuma vērtībām, kas plašākas savietojamības dēļ ietver mazāk drošus šifrus. PSK šifru komplektus serverī/starpniekserverī nevar pilnībā atspējot.

Un failā 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

Šifrēšanas problēmu novēršana

Vispārīgi ieteikumi:

  • Sāciet ar to, ka noskaidrojat, kurš komponents konkrētajā problēmas gadījumā darbojas kā TLS klients un kurš kā TLS serveris.
    Zabbix serveris, starpniekserveri un aģenti atkarībā no mijiedarbības starp tiem visi var darboties gan kā TLS serveri, gan kā klienti.
    Piemēram, Zabbix serveris, kas savienojas ar aģentu pasīvās pārbaudes veikšanai, darbojas kā TLS klients. Aģents darbojas TLS servera lomā.
    Zabbix aģents, kas no starpniekservera pieprasa aktīvo pārbaužu sarakstu, darbojas kā TLS klients. Starpniekserveris darbojas TLS servera lomā.
    zabbix_get un zabbix_sender utilītas vienmēr darbojas kā TLS klienti.
  • Zabbix izmanto savstarpējo autentifikāciju.
    Katra puse pārbauda savu pretpusi un var atteikt savienojumu.
    Piemēram, Zabbix serveris, kas savienojas ar aģentu, var nekavējoties pārtraukt savienojumu, ja aģenta sertifikāts nav derīgs. Un otrādi - Zabbix aģents, kas pieņem savienojumu no servera, var pārtraukt savienojumu, ja serverim aģents neuzticas.
  • Pārbaudiet žurnālfailus abās pusēs - gan TLS klientā, gan TLS serverī.
    Puse, kas atsakās no savienojuma, var precīzi norādīt iemeslu, kāpēc savienojums tika atteikts. Otra puse bieži ziņo vispārīgāku kļūdu (piem., "Connection closed by peer", "connection was non-properly terminated").
  • Dažkārt nepareizi konfigurēta šifrēšana rada mulsinošus kļūdu ziņojumus, kas nekādi nenorāda uz patieso cēloni.
    Tālākajās apakšnodaļās mēs cenšamies sniegt (tālu no izsmeļoša) ziņojumu un iespējamo cēloņu kopumu, kas var palīdzēt problēmu novēršanā.
    Lūdzu, ņemiet vērā, ka dažādi kriptogrāfijas rīkkopas (OpenSSL, GnuTLS) bieži rada atšķirīgus kļūdu ziņojumus vienās un tajās pašās problēmsituācijās.
    Dažkārt kļūdu ziņojumi ir atkarīgi pat no konkrētas kriptogrāfijas rīkkopu kombinācijas abās pusēs.

Savienojuma veida vai atļauju problēmu novēršana

Serveris ir konfigurēts savienoties ar aģentu, izmantojot PSK, bet aģents pieņem tikai nešifrētus savienojumus

Servera vai starpniekservera žurnālā (ar GnuTLS 3.3.16)

Get value from agent failed: zbx_tls_connect(): gnutls_handshake() failed: \
    -110 TLS savienojums tika nepareizi pārtraukts.

Servera vai starpniekservera žurnālā (ar OpenSSL 1.0.2c)

Get value from agent failed: TCP connection successful, cannot establish TLS to [[127.0.0.1]:10050]: \
    Savienojumu pārtrauca attālais mezgls. Pārbaudiet atļautos savienojuma veidus un piekļuves tiesības
Viena puse savienojas ar sertifikātu, bet otra puse pieņem tikai PSK vai otrādi

Jebkurā žurnālā (ar GnuTLS):

neizdevās pieņemt ienākošu savienojumu: no 127.0.0.1: zbx_tls_accept(): gnutls_handshake() neizdevās:\
    -21 Nevarēja vienoties par atbalstītu šifra komplektu.

Jebkurā žurnālā (ar OpenSSL 1.0.2c):

neizdevās pieņemt ienākošu savienojumu: no 127.0.0.1: TLS rokasspiediens atgrieza kļūdas kodu 1:\
    fails .\ssl\s3_srvr.c rinda 1411: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:\
    TLS write fatal alert "handshake failure"

Mēģinājums izmantot Zabbix sender, kas kompilēts ar TLS atbalstu, lai nosūtītu datus uz Zabbix serveri/starpniekserveri, kas kompilēts bez TLS atbalsta

Savienojuma puses žurnālā:

Linux:

...In zbx_tls_init_child()
...OpenSSL library (version OpenSSL 1.1.1  11 Sep 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...End of zbx_tls_connect():FAIL error:'connection closed by peer'
...send value error: TCP successful, cannot establish TLS to [[localhost]:10051]: connection closed by peer

Windows:

...OpenSSL library (version OpenSSL 1.1.1a  20 Nov 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...zbx_psk_client_cb() requested PSK identity "PSK test sender"
...End of zbx_tls_connect():FAIL error:'SSL_connect() I/O error: [0x00000000] The operation completed successfully.'
...send value error: TCP successful, cannot establish TLS to [[192.168.1.2]:10051]: SSL_connect() I/O error: [0x00000000] The operation completed successfully.
Pie pieņemošās puses žurnāla:
...neizdevās pieņemt ienākošo savienojumu: no 127.0.0.1: TLS atbalsts netika iekļauts kompilēšanas laikā

Viena puse savienojas ar PSK, bet otra puse izmanto LibreSSL vai ir kompilēta bez šifrēšanas atbalsta

LibreSSL neatbalsta PSK.

Savienojošās puses žurnālā:

...TCP veiksmīgs, nevar izveidot TLS savienojumu ar [[192.168.1.2]:10050]: SSL_connect() I/O kļūda: [0] Success

Pieņemošās puses žurnālā:

...neizdevās pieņemt ienākošu savienojumu: no 192.168.1.2: PSK atbalsts netika iekļauts kompilācijā

Zabbix lietotāja saskarnē:

Neizdevās iegūt vērtību no aģents: TCP veiksmīgs, nevar izveidot TLS savienojumu ar [[192.168.1.2]:10050]: SSL_connect() I/O kļūda: [0] Success

Viena puse savienojas ar PSK, bet otra puse izmanto OpenSSL ar atspējotu PSK atbalstu

Savienojošās puses žurnālā:

...TCP veiksmīgs, nevar izveidot TLS savienojumu ar [[192.168.1.2]:10050]: SSL_connect() iestatīja rezultāta kodu uz 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"

Pieņemošās puses žurnālā:

...neizdevās pieņemt ienākošu savienojumu: no 192.168.1.2: TLS handshake iestatīja rezultāta kodu uz 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"