- Cifrado y seguridad
- Encryption
- Compilación de Zabbix con soporte de cifrado
- Gestión del cifrado de conexiones
- zabbix_get y zabbix_sender con cifrado
- Ciphersuites
- Cifrados configurados por el usuario
- Solución de problemas de cifrado
- Solución de problemas de tipo de conexión o problemas de permisos
- Intentando usar Zabbix sender compilado con soporte TLS para enviar datos a Zabbix server/proxy compilado sin TLS
- Un lado se conecta con PSK, pero el otro lado usa LibreSSL o se ha compilado sin soporte de cifrado
- Un lado se conecta con PSK, pero el otro lado usa OpenSSL con el soporte de PSK deshabilitado
Cifrado y seguridad
Encryption
Zabbix admite comunicaciones cifradas entre los componentes de Zabbix mediante el protocolo Transport Layer Security (TLS) v.1.2 y 1.3 (según la biblioteca criptográfica). Se admite el cifrado basado en certificados y el cifrado basado en claves precompartidas.
El cifrado se puede configurar para las conexiones:
- Entre Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, zabbix_sender y las utilidades zabbix_get
- Con la base de datos de Zabbix desde Zabbix frontend y server/proxy
- Entre Zabbix frontend y Zabbix server
El cifrado es opcional y se puede configurar para componentes individuales:
- Algunos proxies y agents pueden configurarse para usar cifrado basado en certificados con el server, mientras que otros pueden usar cifrado basado en claves precompartidas, y otros pueden seguir usando comunicaciones sin cifrar (como antes).
- El server (proxy) puede usar distintas configuraciones de cifrado para diferentes hosts.
Los programas daemon de Zabbix usan un único puerto de escucha para conexiones entrantes cifradas y no cifradas. Añadir cifrado no requiere abrir nuevos puertos en los firewalls.
Limitaciones
- Las claves privadas se almacenan en texto plano en archivos legibles por los componentes de Zabbix durante el inicio.
- Las claves precompartidas se introducen en Zabbix frontend y se almacenan en la base de datos de Zabbix en texto plano.
- El cifrado integrado no protege las comunicaciones entre el servidor web que ejecuta Zabbix frontend y el navegador web del usuario.
- Actualmente, cada conexión cifrada se abre con un handshake TLS completo; no se implementan caché de sesión ni tickets.
- Añadir cifrado aumenta el tiempo de las comprobaciones de item y de las acciones, según la latencia de la red:
- Por ejemplo, si el retardo de los paquetes es de 100 ms, abrir una conexión TCP y enviar una solicitud sin cifrar tarda alrededor de 200 ms. Con cifrado, se añaden unos 1000 ms para establecer la conexión TLS.
- Puede ser necesario aumentar los timeouts; de lo contrario, algunos items y acciones que ejecutan scripts remotos en agent pueden funcionar con conexiones sin cifrar, pero fallar por timeout con conexiones cifradas.
- El cifrado no es compatible con network discovery. Las comprobaciones de Zabbix agent realizadas por network discovery no estarán cifradas y, si Zabbix agent está configurado para rechazar conexiones sin cifrar, dichas comprobaciones no tendrán éxito.
Compilación de Zabbix con soporte de cifrado
Para admitir el cifrado, Zabbix debe compilarse y enlazarse con una de las bibliotecas criptográficas compatibles:
- GnuTLS - desde la versión 3.1.18
- OpenSSL - versiones 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x - 3.5.x
- LibreSSL - probado con las versiones 2.7.4, 2.8.2:
- LibreSSL 2.6.x no es compatible
- LibreSSL es compatible como reemplazo de OpenSSL;
no se utilizan las nuevas funciones de API específicas de LibreSSL
tls_*(). Los componentes de Zabbix compilados con LibreSSL no podrán usar PSK; solo se pueden usar certificados.
Puede obtener más información sobre la configuración de SSL para el frontend de Zabbix consultando estas prácticas recomendadas.
La biblioteca se selecciona especificando la opción correspondiente en el script "configure":
--with-gnutls[=DIR]--with-openssl[=DIR](también se usa para LibreSSL)
Por ejemplo, para configurar las fuentes de server y agent con OpenSSL puede usar algo como:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
Distintos componentes de Zabbix pueden compilarse con diferentes bibliotecas criptográficas (por ejemplo, un server con OpenSSL y un agent con GnuTLS).
Si planea usar claves precompartidas (PSK), considere usar bibliotecas GnuTLS o OpenSSL 1.1.0 (o más recientes) en los componentes de Zabbix que utilicen PSK. Las bibliotecas GnuTLS y OpenSSL 1.1.0 admiten conjuntos de cifrado PSK con Perfect Forward Secrecy. Las versiones anteriores de la biblioteca OpenSSL (1.0.1, 1.0.2c) también admiten PSK, pero los conjuntos de cifrado PSK disponibles no proporcionan Perfect Forward Secrecy.
Gestión del cifrado de conexiones
Las conexiones en Zabbix pueden usar:
- sin cifrado (predeterminado)
- cifrado basado en certificados RSA
- cifrado basado en PSK
Hay dos parámetros importantes que se usan para especificar el cifrado entre los componentes de Zabbix:
- TLSConnect - especifica qué cifrado usar para las conexiones salientes (sin cifrar, PSK o certificado)
- TLSAccept - especifica qué tipos de conexiones se permiten para las conexiones entrantes (sin cifrar, PSK o certificado). Se puede especificar uno o más valores.
TLSConnect se usa en los archivos de configuración de Zabbix proxy (en modo activo, especifica solo conexiones al server) y Zabbix agent (para comprobaciones activas). En Zabbix frontend, el equivalente de TLSConnect es el campo Connections to host en Data collection > Hosts > <some host> > pestaña Encryption y el campo Connections to proxy en Administration > Proxies> <some proxy> > pestaña Encryption. Si falla el tipo de cifrado configurado para la conexión, no se intentará ningún otro tipo de cifrado.
TLSAccept se usa en los archivos de configuración de Zabbix proxy (en modo pasivo, especifica solo conexiones desde el server) y Zabbix agent (para comprobaciones pasivas). En Zabbix frontend, el equivalente de TLSAccept es el campo Connections from host en Data collection > Hosts > <some host> > pestaña Encryption y el campo Connections from proxy en Administration > Proxies > <some proxy> > pestaña Encryption.
Normalmente se configura solo un tipo de cifrado para las conexiones entrantes. Pero puede que desee cambiar el tipo de cifrado, por ejemplo, de sin cifrar a basado en certificado con un tiempo de inactividad mínimo y posibilidad de reversión. Para lograrlo:
- Establezca
TLSAccept=unencrypted,certen el archivo de configuración del agent y reinicie Zabbix agent - Pruebe la conexión con zabbix_get al agent usando certificado. Si funciona, puede reconfigurar el cifrado para ese agent en Zabbix frontend en la pestaña Data collection > Hosts > <some host> > Encryption estableciendo Connections to host en "Certificate".
- Cuando se actualice la caché de configuración del server (y la configuración del proxy si el host es monitorizado por proxy), las conexiones a ese agent estarán cifradas
- Si todo funciona como se espera, puede establecer
TLSAccept=certen el archivo de configuración del agent y reiniciar Zabbix agent. Ahora el agent aceptará solo conexiones cifradas basadas en certificado. Las conexiones sin cifrar y las basadas en PSK serán rechazadas.
De forma similar funciona en el server y el proxy. Si en Zabbix frontend, en la configuración del host, Connections from host está establecido en "Certificate", entonces solo se aceptarán conexiones cifradas basadas en certificado desde el agent (comprobaciones activas) y zabbix_sender (items trapper).
Lo más probable es que configure las conexiones entrantes y salientes para usar el mismo tipo de cifrado o ningún cifrado en absoluto. Pero técnicamente es posible configurarlo de forma asimétrica, por ejemplo, cifrado basado en certificado para las conexiones entrantes y basado en PSK para las salientes.
La configuración de cifrado de cada host se muestra en Zabbix frontend, en Data collection > Hosts, en la columna Agent encryption. Por ejemplo:
| Example | Connections to host | Allowed connections from host | Rejected connections from host |
|---|---|---|---|
![]() |
Sin cifrar | Sin cifrar | Cifradas, cifradas basadas en certificado y PSK |
![]() |
Cifradas, basadas en certificado | Cifradas, basadas en certificado | Sin cifrar y cifradas basadas en PSK |
![]() |
Cifradas, basadas en PSK | Cifradas, basadas en PSK | Sin cifrar y cifradas basadas en certificado |
![]() |
Cifradas, basadas en PSK | Sin cifrar y cifradas basadas en PSK | Cifradas, basadas en certificado |
![]() |
Cifradas, basadas en certificado | Sin cifrar, PSK o cifradas basadas en certificado | - |
Las conexiones están sin cifrar de forma predeterminada. El cifrado debe configurarse para cada host y proxy de forma individual.
zabbix_get y zabbix_sender con cifrado
Consulte las páginas del manual de zabbix_get y zabbix_sender para usarlos con cifrado.
Ciphersuites
Las ciphersuites se configuran de forma interna durante el inicio de Zabbix de manera predeterminada.
También se admiten ciphersuites configuradas por el usuario para GnuTLS y OpenSSL. Los usuarios pueden configurar ciphersuites según sus políticas de seguridad. El uso de esta función es opcional (las ciphersuites predeterminadas integradas siguen funcionando).
Para las bibliotecas criptográficas compiladas con la configuración predeterminada, las reglas integradas de Zabbix suelen dar como resultado las siguientes ciphersuites (en orden de mayor a menor prioridad):
| 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 |
Cifrados configurados por el usuario
Los criterios de selección de ciphersuite integrados pueden sobrescribirse con ciphersuites configuradas por el usuario.
Las ciphersuites configuradas por el usuario es una función destinada a usuarios avanzados que entienden las ciphersuites TLS, su seguridad y las consecuencias de los errores, y que se sienten cómodos con la solución de problemas de TLS.
Los criterios de selección de ciphersuite integrados pueden sobrescribirse mediante los siguientes parámetros:
| Override scope | Parameter | Value | Description |
|---|---|---|---|
| Selección de ciphersuite para certificados | TLSCipherCert13 | Cadenas de cifrado de OpenSSL 1.1.1 válidas cipher strings para el protocolo TLS 1.3 (sus valores se pasan a la función de OpenSSL SSL_CTX_set_ciphersuites()). |
Criterios de selección de ciphersuite basados en certificados para TLS 1.3 Solo OpenSSL 1.1.1 o posterior. |
| TLSCipherCert | Cadenas de cifrado de OpenSSL válidas cipher strings para TLS 1.2 o cadenas de prioridad de GnuTLS válidas priority strings. Sus valores se pasan a las funciones SSL_CTX_set_cipher_list() o gnutls_priority_init(), respectivamente. |
Criterios de selección de ciphersuite basados en certificados para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Selección de ciphersuite para PSK | TLSCipherPSK13 | Cadenas de cifrado de OpenSSL 1.1.1 válidas cipher strings para el protocolo TLS 1.3 (sus valores se pasan a la función de OpenSSL SSL_CTX_set_ciphersuites()). |
Criterios de selección de ciphersuite basados en PSK para TLS 1.3 Solo OpenSSL 1.1.1 o posterior. |
| TLSCipherPSK | Cadenas de cifrado de OpenSSL válidas cipher strings para TLS 1.2 o cadenas de prioridad de GnuTLS válidas priority strings. Sus valores se pasan a las funciones SSL_CTX_set_cipher_list() o gnutls_priority_init(), respectivamente. |
Criterios de selección de ciphersuite basados en PSK para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Lista combinada de ciphersuite para certificado y PSK | TLSCipherAll13 | Cadenas de cifrado de OpenSSL 1.1.1 válidas cipher strings para el protocolo TLS 1.3 (sus valores se pasan a la función de OpenSSL SSL_CTX_set_ciphersuites()). |
Criterios de selección de ciphersuite para TLS 1.3 Solo OpenSSL 1.1.1 o posterior. |
| TLSCipherAll | Cadenas de cifrado de OpenSSL válidas cipher strings para TLS 1.2 o cadenas de prioridad de GnuTLS válidas priority strings. Sus valores se pasan a las funciones SSL_CTX_set_cipher_list() o gnutls_priority_init(), respectivamente. |
Criterios de selección de ciphersuite para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) |
Para sobrescribir la selección de ciphersuite en las utilidades zabbix_get y zabbix_sender, use los parámetros de línea de comandos:
--tls-cipher13--tls-cipher
Los nuevos parámetros son opcionales. Si no se especifica un parámetro, se usa el valor predeterminado interno. Si un parámetro está definido, no puede estar vacío.
Si la configuración de un valor TLSCipher* en la biblioteca criptográfica falla, entonces el server, proxy o agent no se iniciará y se registrará un error.
Es importante entender cuándo es aplicable cada parámetro.
Conexiones salientes
El caso más simple es el de las conexiones salientes:
- Para conexiones salientes con certificado: use TLSCipherCert13 o TLSCipherCert
- Para conexiones salientes con PSK: use TLSCipherPSK13 o TLSCipherPSK
- En el caso de las utilidades zabbix_get y zabbix_sender, se pueden usar los
parámetros de línea de comandos
--tls-cipher13o--tls-cipher(el cifrado se especifica de forma inequívoca con un parámetro--tls-connect)
Conexiones entrantes
Es un poco más complicado con las conexiones entrantes porque las reglas son específicas para los componentes y la configuración.
Para Zabbix agent:
| Configuración de conexión del agent | Configuración de cifrado |
|---|---|
| TLSConnect=cert | TLSCipherCert, TLSCipherCert13 |
| TLSConnect=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert | TLSCipherCert, TLSCipherCert13 |
| TLSAccept=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert,psk | TLSCipherAll, TLSCipherAll13 |
Para Zabbix server y proxy:
| Configuración de conexión | Configuración de cifrado |
|---|---|
| Conexiones salientes usando PSK | TLSCipherPSK, TLSCipherPSK13 |
| Conexiones entrantes usando certificados | TLSCipherAll, TLSCipherAll13 |
| Conexiones entrantes usando PSK si el server no tiene certificado | TLSCipherPSK, TLSCipherPSK13 |
| Conexiones entrantes usando PSK si el server tiene certificado | TLSCipherAll, TLSCipherAll13 |
Se puede observar algún patrón en las dos tablas anteriores:
- TLSCipherAll y TLSCipherAll13 solo pueden especificarse si se usa una lista combinada de conjuntos de cifrado basados en certificados y en PSK. Esto ocurre en dos casos: server (proxy) con un certificado configurado (los conjuntos de cifrado PSK siempre están configurados en el server, y en el proxy si la biblioteca criptográfica admite PSK), y agent configurado para aceptar conexiones entrantes basadas tanto en certificados como en PSK
- en otros casos, TLSCipherCert* y/o TLSCipherPSK* son suficientes
Las siguientes tablas muestran los valores predeterminados integrados de TLSCipher*. Pueden ser un buen punto de partida para sus propios valores personalizados.
| 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 Los valores predeterminados son diferentes para versiones anteriores de OpenSSL (1.0.1, 1.0.2, 1.1.0), para LibreSSL y si OpenSSL se compila sin soporte para PSK.
Ejemplos de conjuntos de cifrado configurados por el usuario
Vea a continuación los siguientes ejemplos de conjuntos de cifrado configurados por el usuario:
Probar cadenas de cifrado y permitir solo suites de cifrado PFS
Para ver qué suites de cifrado se han seleccionado, debe establecer
'DebugLevel=4' en el archivo de configuración, o usar la opción -vv para
zabbix_sender.
Puede que sea necesario experimentar con los parámetros TLSCipher*
antes de obtener las suites de cifrado deseadas. Resulta incómodo reiniciar
Zabbix server, proxy o agent varias veces solo para ajustar los parámetros
TLSCipher*. Las opciones más cómodas son usar zabbix_sender o el
comando openssl. Veamos ambas.
1. Uso de zabbix_sender.
Creemos un archivo de configuración de prueba, por ejemplo, /home/zabbix/test.conf, con la sintaxis de un archivo zabbix_agentd.conf:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=cert
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/agent.crt
TLSKeyFile=/home/zabbix/agent.key
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agent.psk
Necesita certificados válidos de CA y de agent, así como PSK para este ejemplo. Ajuste las rutas y los nombres de los archivos de certificado y PSK para su entorno.
Si no está usando certificados, sino solo PSK, puede crear un archivo de prueba más sencillo:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=psk
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agentd.psk
Las suites de cifrado seleccionadas se pueden ver ejecutando zabbix_sender (ejemplo compilado con OpenSSL 1.1.d):
$ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
Aquí puede ver las suites de cifrado seleccionadas de forma predeterminada. Estos valores predeterminados se eligen para garantizar la interoperabilidad con agentes de Zabbix que se ejecutan en sistemas con versiones antiguas de OpenSSL (a partir de 1.0.1).
En sistemas más nuevos, puede reforzar la seguridad permitiendo solo unas
pocas suites de cifrado, por ejemplo, solo las suites con PFS (Perfect Forward
Secrecy). Probemos a permitir solo suites de cifrado con PFS usando los
parámetros TLSCipher*.
El resultado no será interoperable con sistemas que usen OpenSSL 1.0.1 y 1.0.2, si se usa PSK. El cifrado basado en certificados debería funcionar.
Añada dos líneas al archivo de configuración test.conf:
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
y vuelva a probar:
$ 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
Las listas "certificate ciphersuites" y "PSK ciphersuites" han cambiado: son más cortas que antes y ahora contienen solo suites de cifrado TLS 1.3 y suites TLS 1.2 ECDHE-* como se esperaba.
2. TLSCipherAll y TLSCipherAll13 no se pueden probar con zabbix_sender; no afectan al valor "certificate and PSK ciphersuites" mostrado en el ejemplo anterior. Para ajustar TLSCipherAll y TLSCipherAll13, debe experimentar con el agent, proxy o server.
Por tanto, para permitir solo suites de cifrado PFS, puede que necesite añadir hasta tres parámetros
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128
a zabbix_agentd.conf, zabbix_proxy.conf y zabbix_server.conf si
cada uno tiene un certificado configurado y el agent también tiene PSK.
Si su entorno de Zabbix usa solo cifrado basado en PSK y no certificados, entonces solo uno:
TLSCipherPSK=kECDHEPSK+AES128
Ahora que entiende cómo funciona, puede probar la selección de suites de cifrado
incluso fuera de Zabbix, con el comando openssl. Probemos los tres valores de
los parámetros 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
Puede preferir openssl ciphers con la opción -V para una salida más detallada:
$ 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
De forma similar, puede probar las cadenas de prioridad para 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
Cambio de AES128 a AES256
Zabbix usa AES128 como valor predeterminado integrado para los datos. Supongamos que está usando certificados y desea cambiar a AES256, en OpenSSL 1.1.1.
Esto se puede lograr agregando los parámetros correspondientes en
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
Aunque solo se usarán conjuntos de cifrado relacionados con certificados,
los parámetros TLSCipherPSK* también se definen para evitar
sus valores predeterminados, que incluyen cifrados menos seguros para una
interoperabilidad más amplia. Los conjuntos de cifrado PSK no se pueden deshabilitar por completo en
server/proxy.
Y en 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
Solución de problemas de cifrado
Recomendaciones generales:
- Empiece por entender qué componente actúa como cliente TLS y cuál actúa como servidor TLS en el caso problemático.
Zabbix server, proxies y agents, según la interacción entre ellos, pueden funcionar tanto como servidores TLS como clientes TLS.
Por ejemplo, Zabbix server al conectarse a un agent para una comprobación pasiva actúa como cliente TLS. El agent desempeña el papel de servidor TLS.
Zabbix agent, al solicitar una lista de comprobaciones activas a un proxy, actúa como cliente TLS. El proxy desempeña el papel de servidor TLS.
Las utilidadeszabbix_getyzabbix_sendersiempre actúan como clientes TLS. - Zabbix utiliza autenticación mutua.
Cada lado verifica a su par y puede rechazar la conexión.
Por ejemplo, Zabbix server al conectarse a un agent puede cerrar la conexión inmediatamente si el certificado del agent no es válido. Y viceversa: Zabbix agent al aceptar una conexión del server puede cerrar la conexión si el server no es de confianza para el agent. - Examine los archivos de registro en ambos lados: en el cliente TLS y en el servidor TLS.
El lado que rechaza la conexión puede registrar un motivo preciso de por qué fue rechazada. El otro lado a menudo informa un error más general (por ejemplo, "Connection closed by peer", "connection was non-properly terminated"). - A veces, una configuración incorrecta del cifrado da lugar a mensajes de error confusos que no apuntan en absoluto a la causa real.
En las subsecciones siguientes intentamos proporcionar una colección, lejos de ser exhaustiva, de mensajes y posibles causas que pueden ayudar en la resolución de problemas.
Tenga en cuenta que distintos conjuntos de herramientas criptográficas (OpenSSL, GnuTLS) suelen producir mensajes de error diferentes en las mismas situaciones problemáticas.
A veces, los mensajes de error dependen incluso de la combinación concreta de conjuntos de herramientas criptográficas en ambos lados.
Solución de problemas de tipo de conexión o problemas de permisos
Server está configurado para conectarse con PSK a agent, pero agent solo acepta conexiones sin cifrar
En el registro de server o proxy (con GnuTLS 3.3.16)
Error al obtener el valor de agent: zbx_tls_connect(): gnutls_handshake() failed: \
-110 La conexión TLS se terminó de forma incorrecta.
En el registro de server o proxy (con OpenSSL 1.0.2c)
Error al obtener el valor de agent: conexión TCP correcta, no se puede establecer TLS con [[127.0.0.1]:10050]: \
Conexión cerrada por el par. Compruebe los tipos de conexión permitidos y los derechos de acceso
Un lado se conecta con certificado, pero el otro lado solo acepta PSK o viceversa
En cualquier registro (con GnuTLS):
failed to accept an incoming connection: from 127.0.0.1: zbx_tls_accept(): gnutls_handshake() failed:\
-21 Could not negotiate a supported cipher suite.
En cualquier registro (con OpenSSL 1.0.2c):
failed to accept an incoming connection: from 127.0.0.1: TLS handshake returned error code 1:\
file .\ssl\s3_srvr.c line 1411: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:\
TLS write fatal alert "handshake failure"
Intentando usar Zabbix sender compilado con soporte TLS para enviar datos a Zabbix server/proxy compilado sin TLS
En el log del lado de conexión:
Linux:
...In zbx_tls_init_child()
...Biblioteca OpenSSL (versión OpenSSL 1.1.1 11 Sep 2018) inicializada
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...Fin de zbx_tls_connect():FAIL error:'connection closed by peer'
...error al enviar valor: TCP correcto, no se puede establecer TLS con [[localhost]:10051]: connection closed by peer
Windows:
...Biblioteca OpenSSL (versión OpenSSL 1.1.1a 20 Nov 2018) inicializada
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...zbx_psk_client_cb() solicitó la identidad PSK "PSK test sender"
...Fin de zbx_tls_connect():FAIL error:'SSL_connect() I/O error: [0x00000000] The operation completed successfully.'
...error al enviar valor: TCP correcto, no se puede establecer TLS con [[192.168.1.2]:10051]: SSL_connect() I/O error: [0x00000000] The operation completed successfully.
En el registro del lado receptor:
...no se pudo aceptar una conexión entrante: desde 127.0.0.1: el soporte para TLS no se compiló en la versión instalada
Un lado se conecta con PSK, pero el otro lado usa LibreSSL o se ha compilado sin soporte de cifrado
LibreSSL no admite PSK.
En el registro del lado que se conecta:
...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success
En el registro del lado que acepta:
...failed to accept an incoming connection: from 192.168.1.2: support for PSK was not compiled in
En el frontend de Zabbix:
Get value from agent failed: TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success
Un lado se conecta con PSK, pero el otro lado usa OpenSSL con el soporte de PSK deshabilitado
En el registro del lado que se conecta:
...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() set result code to 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"
En el registro del lado que acepta:
...failed to accept an incoming connection: from 192.168.1.2: TLS handshake set result code to 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"




