- Šifrēšana un drošība
- Šifrēšana
- Zabbix kompilēšana ar šifrēšanas atbalstu
- Savienojumu šifrēšanas pārvaldība
- zabbix_get un zabbix_sender ar šifrēšanu
- Šifru komplekti
- Lietotāja konfigurēti ciphersuites
- Šifrēšanas problēmu novēršana
- Savienojuma veida vai atļauju problēmu novēršana
- 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
- Viena puse savienojas ar PSK, bet otra puse izmanto LibreSSL vai ir kompilēta bez šifrēšanas atbalsta
- Viena puse savienojas ar PSK, bet otra puse izmanto OpenSSL ar atspējotu PSK atbalstu
Š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:
- Starp Zabbix serveri, Zabbix starpniekserveri, Zabbix aģentu, Zabbix tīmekļa pakalpojumu, zabbix_sender un zabbix_get utilītprogrammām
- Uz Zabbix datubāzi no Zabbix lietotāja saskarnes un servera/starpniekservera
- Starp Zabbix lietotāja saskarni un Zabbix serveri
Š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:
- bez šifrēšanas (noklusējums)
- RSA sertifikātā balstītu šifrēšanu
- PSK balstītu šifrēšanu
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,certaģ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=certaģ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 |
|---|---|---|---|
![]() |
Nešifrēts | Nešifrēts | Šifrēts, sertifikātā un PSK balstīti šifrēts |
![]() |
Šifrēts, sertifikātā balstīts | Šifrēts, sertifikātā balstīts | Nešifrēts un PSK balstīti šifrēts |
![]() |
Šifrēts, PSK balstīts | Šifrēts, PSK balstīts | Nešifrēts un sertifikātā balstīti šifrēts |
![]() |
Šifrēts, PSK balstīts | Nešifrēts un PSK balstīti šifrēts | Sertifikātā balstīti šifrēts |
![]() |
Š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-cipher13vai--tls-cipher(šifrēšana ir nepārprotami norādīta ar--tls-connectparametru)
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_getunzabbix_senderutilī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"




