15 Verschlüsselung
Übersicht
Zabbix unterstützt verschlüsselte Kommunikation zwischen Zabbix-Komponenten unter Verwendung des Transport Layer Security (TLS)-Protokolls v.1.2 und 1.3 (abhängig von der Kryptobibliothek). Zertifikatsbasierte und auf vorinstallierten Schlüsseln basierende Verschlüsselung werden unterstützt.
Verschlüsselung kann für Verbindungen konfiguriert werden:
- Zwischen Zabbix Server, Zabbix Proxy, Zabbix Agent, Zabbix-Webservice sowie den Dienstprogrammen zabbix_sender und zabbix_get
- Zur Zabbix-Datenbank vom Zabbix Frontend und Server/Proxy
- Zwischen Zabbix Frontend und Zabbix Server
Die Verschlüsselung ist optional und für einzelne Komponenten konfigurierbar:
- Einige Proxys und Agents können so konfiguriert werden, dass sie zertifikatsbasierte Verschlüsselung mit dem Server verwenden, während andere auf vorinstallierten Schlüsseln basierende Verschlüsselung nutzen und wieder andere weiterhin unverschlüsselte Kommunikation verwenden (wie bisher).
- Server (Proxy) kann unterschiedliche Verschlüsselungskonfigurationen für verschiedene Hosts verwenden.
Zabbix-Daemon-Programme verwenden einen Listening-Port sowohl für verschlüsselte als auch für unverschlüsselte eingehende Verbindungen. Das Hinzufügen von Verschlüsselung erfordert nicht das Öffnen neuer Ports in Firewalls.
Einschränkungen
- Private Schlüssel werden im Klartext in Dateien gespeichert, die beim Start von Zabbix-Komponenten lesbar sind.
- Pre-shared Keys werden im Zabbix Frontend eingegeben und im Klartext in der Zabbix-Datenbank gespeichert.
- Die integrierte Verschlüsselung schützt die Kommunikation zwischen dem Webserver, auf dem das Zabbix Frontend läuft, und dem Webbrowser des Benutzers nicht.
- Derzeit wird jede verschlüsselte Verbindung mit einem vollständigen TLS-Handshake aufgebaut; Session-Caching und Tickets sind nicht implementiert.
- Das Hinzufügen von Verschlüsselung erhöht abhängig von der Netzwerklatenz die Zeit für Datenpunkt-Prüfungen und Aktionen:
- Wenn die Paketverzögerung beispielsweise 100 ms beträgt, dauert das Öffnen einer TCP-Verbindung und das Senden einer unverschlüsselten Anfrage etwa 200 ms. Mit Verschlüsselung kommen für den Aufbau der TLS-Verbindung etwa 1000 ms hinzu.
- Möglicherweise müssen Timeouts erhöht werden, andernfalls können einige Datenpunkte und Aktionen, die entfernte Skripte auf Agents ausführen, mit unverschlüsselten Verbindungen funktionieren, mit verschlüsselten jedoch wegen eines Timeouts fehlschlagen.
- Verschlüsselung wird von der Netzwerkerkennung nicht unterstützt. Von der Netzwerkerkennung durchgeführte Zabbix-Agent-Prüfungen sind unverschlüsselt, und wenn der Zabbix-Agent so konfiguriert ist, dass er unverschlüsselte Verbindungen ablehnt, werden solche Prüfungen nicht erfolgreich sein.
Kompilieren von Zabbix mit Verschlüsselungsunterstützung
Um Verschlüsselung zu unterstützen, muss Zabbix mit einer der unterstützten Kryptobibliotheken kompiliert und gelinkt werden:
- GnuTLS - ab Version 3.1.18
- OpenSSL - Versionen 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x
- LibreSSL - getestet mit den Versionen 2.7.4, 2.8.2:
- LibreSSL 2.6.x wird nicht unterstützt
- LibreSSL wird als kompatibler Ersatz für OpenSSL unterstützt;
die neuen LibreSSL-spezifischen API-Funktionen
tls_*()werden nicht verwendet. Mit LibreSSL kompilierte Zabbix-Komponenten können PSK nicht verwenden, es können nur Zertifikate genutzt werden.
Weitere Informationen zur Einrichtung von SSL für das Zabbix Frontend finden Sie in diesen Best Practices.
Die Bibliothek wird ausgewählt, indem die entsprechende Option für das Skript "configure" angegeben wird:
--with-gnutls[=DIR]--with-openssl[=DIR](wird auch für LibreSSL verwendet)
Um beispielsweise die Quellen für Server und Agent mit OpenSSL zu konfigurieren, können Sie etwa Folgendes verwenden:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
Verschiedene Zabbix-Komponenten können mit unterschiedlichen Kryptobibliotheken kompiliert werden (z. B. ein Server mit OpenSSL, ein Agent mit GnuTLS).
Wenn Sie die Verwendung von Pre-Shared Keys (PSK) planen, sollten Sie in Zabbix-Komponenten, die PSKs verwenden, GnuTLS oder OpenSSL 1.1.0 (oder neuer) einsetzen. Die Bibliotheken GnuTLS und OpenSSL 1.1.0 unterstützen PSK-Chiffriersuiten mit Perfect Forward Secrecy. Ältere Versionen der OpenSSL-Bibliothek (1.0.1, 1.0.2c) unterstützen ebenfalls PSKs, aber die verfügbaren PSK-Chiffriersuiten bieten keine Perfect Forward Secrecy.
Verwaltung der Verbindungsverschlüsselung
Verbindungen in Zabbix können Folgendes verwenden:
- keine Verschlüsselung (Standard)
- RSA-zertifikatbasierte Verschlüsselung
- PSK-basierte Verschlüsselung
Es gibt zwei wichtige Parameter, mit denen die Verschlüsselung zwischen Zabbix-Komponenten festgelegt wird:
- TLSConnect - gibt an, welche Verschlüsselung für ausgehende Verbindungen verwendet werden soll (unverschlüsselt, PSK oder Zertifikat)
- TLSAccept - gibt an, welche Verbindungstypen für eingehende Verbindungen erlaubt sind (unverschlüsselt, PSK oder Zertifikat). Es können ein oder mehrere Werte angegeben werden.
TLSConnect wird in den Konfigurationsdateien für Zabbix Proxy (im
aktiven Modus gibt dies nur Verbindungen zum Server an) und Zabbix Agent
(für aktive Prüfungen) verwendet. Im Zabbix Frontend ist das
Äquivalent zu TLSConnect das Feld Verbindungen zum Host im Reiter
Datenerfassung → Hosts → <ein Host> → Verschlüsselung sowie das Feld
Verbindungen zum Proxy im Reiter Administration → Proxys → <ein
Proxy> → Verschlüsselung. Wenn der konfigurierte Verschlüsselungstyp
für die Verbindung fehlschlägt, werden keine anderen
Verschlüsselungstypen ausprobiert.
TLSAccept wird in den Konfigurationsdateien für Zabbix Proxy (im
passiven Modus gibt dies nur Verbindungen vom Server an) und Zabbix
Agent (für passive Prüfungen) verwendet. Im Zabbix Frontend ist das
Äquivalent zu TLSAccept das Feld Verbindungen vom Host im Reiter
Datenerfassung → Hosts → <ein Host> → Verschlüsselung sowie das Feld
Verbindungen vom Proxy im Reiter Administration → Proxys → <ein
Proxy> → Verschlüsselung.
Normalerweise konfigurieren Sie nur einen Verschlüsselungstyp für eingehende Verbindungen. Möglicherweise möchten Sie den Verschlüsselungstyp jedoch wechseln, z. B. von unverschlüsselt zu zertifikatbasiert, mit minimaler Ausfallzeit und der Möglichkeit zum Rollback. Gehen Sie dazu wie folgt vor:
- Setzen Sie
TLSAccept=unencrypted,certin der Konfigurationsdatei des Agent und starten Sie den Zabbix Agent neu. - Testen Sie die Verbindung zum Agent mit zabbix_get unter Verwendung eines Zertifikats. Wenn dies funktioniert, können Sie die Verschlüsselung für diesen Agent im Zabbix Frontend im Reiter Datenerfassung → Hosts → <ein Host> → Verschlüsselung neu konfigurieren, indem Sie Verbindungen zum Host auf „Zertifikat“ setzen.
- Wenn der Konfigurations-Cache des Server aktualisiert wird (und die Proxy-Konfiguration aktualisiert wird, falls der Host von einem Proxy überwacht wird), werden die Verbindungen zu diesem Agent verschlüsselt.
- Wenn alles wie erwartet funktioniert, können Sie
TLSAccept=certin der Konfigurationsdatei des Agent setzen und den Zabbix Agent neu starten. Der Agent akzeptiert dann nur noch verschlüsselte zertifikatbasierte Verbindungen. Unverschlüsselte und PSK-basierte Verbindungen werden abgelehnt.
Auf ähnliche Weise funktioniert dies bei Server und Proxy. Wenn im Zabbix Frontend in der Host-Konfiguration Verbindungen vom Host auf „Zertifikat“ gesetzt ist, werden vom Agent (aktive Prüfungen) und von zabbix_sender (Trapper-Datenpunkte) nur zertifikatbasiert verschlüsselte Verbindungen akzeptiert.
Sehr wahrscheinlich werden Sie eingehende und ausgehende Verbindungen so konfigurieren, dass derselbe Verschlüsselungstyp verwendet wird oder überhaupt keine Verschlüsselung. Technisch ist jedoch auch eine asymmetrische Konfiguration möglich, z. B. zertifikatbasierte Verschlüsselung für eingehende und PSK-basierte für ausgehende Verbindungen.
Die Verschlüsselungskonfiguration für jeden Host wird im Zabbix Frontend unter Datenerfassung → Hosts in der Spalte Agent-Verschlüsselung angezeigt. Zum Beispiel:
| Beispiel | Verbindungen zum Host | Erlaubte Verbindungen vom Host | Abgelehnte Verbindungen vom Host |
|---|---|---|---|
![]() |
Unverschlüsselt | Unverschlüsselt | Verschlüsselt, zertifikatbasiert und PSK-basiert verschlüsselt |
![]() |
Verschlüsselt, zertifikatbasiert | Verschlüsselt, zertifikatbasiert | Unverschlüsselt und PSK-basiert verschlüsselt |
![]() |
Verschlüsselt, PSK-basiert | Verschlüsselt, PSK-basiert | Unverschlüsselt und zertifikatbasiert verschlüsselt |
![]() |
Verschlüsselt, PSK-basiert | Unverschlüsselt und PSK-basiert verschlüsselt | Zertifikatbasiert verschlüsselt |
![]() |
Verschlüsselt, zertifikatbasiert | Unverschlüsselt, PSK- oder zertifikatbasiert verschlüsselt | - |
Verbindungen sind standardmäßig unverschlüsselt. Die Verschlüsselung muss für jeden Host und Proxy einzeln konfiguriert werden.
zabbix_get und zabbix_sender mit Verschlüsselung
Siehe die Manpages zu zabbix_get und zabbix_sender für Informationen zur Verwendung mit Verschlüsselung.
Cipher-Suites
Cipher-Suites werden standardmäßig intern beim Start von Zabbix konfiguriert.
Auch benutzerkonfigurierte Cipher-Suites werden für GnuTLS und OpenSSL unterstützt. Benutzer können Cipher-Suites entsprechend ihren Sicherheitsrichtlinien konfigurieren. Die Verwendung dieser Funktion ist optional (die integrierten Standard-Cipher-Suites funktionieren weiterhin).
Bei Kryptobibliotheken, die mit Standardeinstellungen kompiliert wurden, führen die integrierten Zabbix-Regeln typischerweise zu den folgenden Cipher-Suites (in der Reihenfolge von höherer zu niedrigerer Priorität):
| Library | Zertifikat-Cipher-Suites | PSK-Cipher-Suites |
|---|---|---|
| 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 |
Benutzerdefinierte Ciphersuites
Die integrierten Auswahlkriterien für Ciphersuites können durch benutzerdefinierte Ciphersuites überschrieben werden.
Benutzerdefinierte Ciphersuites sind eine Funktion für fortgeschrittene Benutzer, die TLS-Ciphersuites, deren Sicherheit und die Folgen von Fehlern verstehen und mit der Fehlerbehebung bei TLS vertraut sind.
Die integrierten Auswahlkriterien für Ciphersuites können mit den folgenden Parametern überschrieben werden:
| Überschreibungsbereich | Parameter | Wert | Beschreibung |
|---|---|---|---|
| Ciphersuite-Auswahl für Zertifikate | TLSCipherCert13 | Gültige OpenSSL 1.1.1-cipher strings für das TLS-1.3-Protokoll (ihre Werte werden an die OpenSSL-Funktion SSL_CTX_set_ciphersuites() übergeben). |
Auswahlkriterien für zertifikatbasierte Ciphersuites für TLS 1.3 Nur OpenSSL 1.1.1 oder neuer. |
| TLSCipherCert | Gültige OpenSSL-cipher strings für TLS 1.2 oder gültige GnuTLS-priority strings. Ihre Werte werden jeweils an die Funktionen SSL_CTX_set_cipher_list() oder gnutls_priority_init() übergeben. |
Auswahlkriterien für zertifikatbasierte Ciphersuites für TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Ciphersuite-Auswahl für PSK | TLSCipherPSK13 | Gültige OpenSSL 1.1.1-cipher strings für das TLS-1.3-Protokoll (ihre Werte werden an die OpenSSL-Funktion SSL_CTX_set_ciphersuites() übergeben). |
Auswahlkriterien für PSK-basierte Ciphersuites für TLS 1.3 Nur OpenSSL 1.1.1 oder neuer. |
| TLSCipherPSK | Gültige OpenSSL-cipher strings für TLS 1.2 oder gültige GnuTLS-priority strings. Ihre Werte werden jeweils an die Funktionen SSL_CTX_set_cipher_list() oder gnutls_priority_init() übergeben. |
Auswahlkriterien für PSK-basierte Ciphersuites für TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Kombinierte Ciphersuite-Liste für Zertifikat und PSK | TLSCipherAll13 | Gültige OpenSSL 1.1.1-cipher strings für das TLS-1.3-Protokoll (ihre Werte werden an die OpenSSL-Funktion SSL_CTX_set_ciphersuites() übergeben). |
Auswahlkriterien für Ciphersuites für TLS 1.3 Nur OpenSSL 1.1.1 oder neuer. |
| TLSCipherAll | Gültige OpenSSL-cipher strings für TLS 1.2 oder gültige GnuTLS-priority strings. Ihre Werte werden jeweils an die Funktionen SSL_CTX_set_cipher_list() oder gnutls_priority_init() übergeben. |
Auswahlkriterien für Ciphersuites für TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) |
Um die Ciphersuite-Auswahl in den Dienstprogrammen zabbix_get und zabbix_sender zu überschreiben, verwenden Sie die Befehlszeilenparameter:
--tls-cipher13--tls-cipher
Die neuen Parameter sind optional. Wenn ein Parameter nicht angegeben wird, wird der interne Standardwert verwendet. Wenn ein Parameter definiert ist, darf er nicht leer sein.
Wenn das Setzen eines TLSCipher*-Werts in der Kryptobibliothek fehlschlägt, werden Server, Proxy oder Agent nicht gestartet und ein Fehler wird protokolliert.
Es ist wichtig zu verstehen, wann jeder Parameter anwendbar ist.
Ausgehende Verbindungen
Der einfachste Fall sind ausgehende Verbindungen:
- Für ausgehende Verbindungen mit Zertifikat verwenden Sie TLSCipherCert13 oder TLSCipherCert
- Für ausgehende Verbindungen mit PSK verwenden Sie TLSCipherPSK13 oder TLSCipherPSK
- Bei den Dienstprogrammen zabbix_get und zabbix_sender können die
Befehlszeilenparameter
--tls-cipher13oder--tls-cipherverwendet werden (die Verschlüsselung wird eindeutig mit dem Parameter--tls-connectangegeben)
Eingehende Verbindungen
Bei eingehenden Verbindungen ist es etwas komplizierter, da die Regeln für Komponenten und Konfiguration spezifisch sind.
Für Zabbix Agent:
| Agent-Verbindungseinrichtung | Cipher-Konfiguration |
|---|---|
| TLSConnect=cert | TLSCipherCert, TLSCipherCert13 |
| TLSConnect=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert | TLSCipherCert, TLSCipherCert13 |
| TLSAccept=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert,psk | TLSCipherAll, TLSCipherAll13 |
Für Zabbix Server und Proxy:
| Verbindungseinrichtung | Cipher-Konfiguration |
|---|---|
| Ausgehende Verbindungen mit PSK | TLSCipherPSK, TLSCipherPSK13 |
| Eingehende Verbindungen mit Zertifikaten | TLSCipherAll, TLSCipherAll13 |
| Eingehende Verbindungen mit PSK, wenn der Server kein Zertifikat hat | TLSCipherPSK, TLSCipherPSK13 |
| Eingehende Verbindungen mit PSK, wenn der Server ein Zertifikat hat | TLSCipherAll, TLSCipherAll13 |
In den beiden obigen Tabellen ist ein bestimmtes Muster zu erkennen:
- TLSCipherAll und TLSCipherAll13 können nur angegeben werden, wenn eine kombinierte Liste von zertifikat- und PSK-basierten Cipher-Suites verwendet wird. Dafür gibt es zwei Fälle: Server (Proxy) mit einem konfigurierten Zertifikat (PSK-Cipher-Suites werden auf Server und Proxy immer konfiguriert, wenn die Kryptobibliothek PSK unterstützt), Agent so konfiguriert, dass sowohl zertifikat- als auch PSK-basierte eingehende Verbindungen akzeptiert werden
- in anderen Fällen sind TLSCipherCert* und/oder TLSCipherPSK* ausreichend
Die folgenden Tabellen zeigen die integrierten Standardwerte von TLSCipher*. Sie
können ein guter Ausgangspunkt für Ihre eigenen benutzerdefinierten Werte sein.
| 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 Die Standardwerte unterscheiden sich bei älteren OpenSSL-Versionen (1.0.1, 1.0.2, 1.1.0), bei LibreSSL und wenn OpenSSL ohne PSK-Unterstützung kompiliert wurde.
Beispiele für benutzerkonfigurierte Cipher-Suites
Nachfolgend finden Sie Beispiele für benutzerkonfigurierte Cipher-Suites:
Testen von Cipher-Strings und Zulassen nur von PFS-Cipher-Suites
Um zu sehen, welche Cipher-Suites ausgewählt wurden, müssen Sie
DebugLevel=4 in der Konfigurationsdatei setzen oder die Option -vv
für zabbix_sender verwenden.
Möglicherweise ist etwas Experimentieren mit den Parametern
TLSCipher* erforderlich, bevor Sie die gewünschten Cipher-Suites
erhalten. Es ist unpraktisch, den Zabbix Server, Proxy oder Agent
mehrfach neu zu starten, nur um die Parameter TLSCipher* anzupassen.
Bequemer ist die Verwendung von zabbix_sender oder des Befehls
openssl. Sehen wir uns beides an.
1. Verwendung von zabbix_sender.
Erstellen wir eine Test-Konfigurationsdatei, zum Beispiel
/home/zabbix/test.conf, mit der Syntax einer
zabbix_agentd.conf-Datei:
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
Für dieses Beispiel benötigen Sie gültige CA- und Agent-Zertifikate sowie einen PSK. Passen Sie Zertifikats- und PSK-Dateipfade und -namen an Ihre Umgebung an.
Wenn Sie keine Zertifikate, sondern nur PSK verwenden, können Sie eine einfachere Testdatei erstellen:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=psk
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agentd.psk
Die ausgewählten Cipher-Suites können durch Ausführen von zabbix_sender angezeigt werden (Beispiel kompiliert mit 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 sehen Sie die standardmäßig ausgewählten Cipher-Suites. Diese Standardwerte wurden so gewählt, dass die Interoperabilität mit Zabbix Agents auf Systemen mit älteren OpenSSL-Versionen (ab 1.0.1) gewährleistet ist.
Auf neueren Systemen können Sie die Sicherheit erhöhen, indem Sie nur
wenige Cipher-Suites zulassen, z. B. nur Cipher-Suites mit PFS (Perfect
Forward Secrecy). Versuchen wir, mit den Parametern TLSCipher* nur
Cipher-Suites mit PFS zuzulassen.
Das Ergebnis ist nicht interoperabel mit Systemen, die OpenSSL 1.0.1 und 1.0.2 verwenden, wenn PSK verwendet wird. Zertifikatbasierte Verschlüsselung sollte funktionieren.
Fügen Sie der Konfigurationsdatei test.conf zwei Zeilen hinzu:
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
und testen Sie erneut:
$ 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
Die Listen „certificate ciphersuites“ und „PSK ciphersuites“ haben sich geändert – sie sind kürzer als zuvor und enthalten wie erwartet nur TLS 1.3-Cipher-Suites und TLS 1.2 ECDHE-*-Cipher-Suites.
2. TLSCipherAll und TLSCipherAll13 können nicht mit zabbix_sender getestet werden; sie beeinflussen nicht den Wert „certificate and PSK ciphersuites“, der im obigen Beispiel angezeigt wird. Um TLSCipherAll und TLSCipherAll13 anzupassen, müssen Sie mit dem Agent, Proxy oder Server experimentieren.
Um also nur PFS-Cipher-Suites zuzulassen, müssen Sie möglicherweise bis zu drei Parameter
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128
zu zabbix_agentd.conf, zabbix_proxy.conf und zabbix_server_conf hinzufügen, wenn für jeden von ihnen ein Zertifikat konfiguriert ist und der Agent zusätzlich PSK verwendet.
Wenn Ihre Zabbix-Umgebung nur PSK-basierte Verschlüsselung und keine Zertifikate verwendet, dann nur diesen einen:
TLSCipherPSK=kECDHEPSK+AES128
Nachdem Sie nun verstanden haben, wie es funktioniert, können Sie die
Auswahl der Cipher-Suites sogar außerhalb von Zabbix mit dem Befehl
openssl testen. Testen wir alle drei Werte der Parameter
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
Möglicherweise bevorzugen Sie openssl ciphers mit der Option -V für
eine ausführlichere Ausgabe:
$ 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
Ebenso können Sie die Prioritäts-Strings für GnuTLS testen:
$ 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
Wechsel von AES128 zu AES256
Zabbix verwendet AES128 als integrierten Standard für Daten. Nehmen wir an, Sie verwenden Zertifikate und möchten unter OpenSSL 1.1.1 auf AES256 umstellen.
Dies kann durch Hinzufügen der entsprechenden Parameter in
zabbix_server.conf erreicht werden:
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
Obwohl nur zertifikatsbezogene Cipher Suites
verwendet werden, sind auch die Parameter TLSCipherPSK* definiert, um
deren Standardwerte zu vermeiden, die für eine breitere
Interoperabilität weniger sichere Chiffren enthalten. PSK-Cipher-Suites können auf
Server/Proxy nicht vollständig deaktiviert werden.
Und 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




