[comment]: # ({5b8f0943-822969ff})
# 15 Cifrado

[comment]: # ({/5b8f0943-822969ff})

[comment]: # ({73039a5b-0b118c23})
#### Visión general

Zabbix admite comunicaciones cifradas entre los componentes de Zabbix utilizando el protocolo Transport Layer Security (TLS) v.1.2 y 1.3 (dependiendo de la biblioteca de cifrado). Se admite el cifrado basado en certificados y en claves precompartidas.

El cifrado se puede configurar para conexiones:

-   Entre el servidor Zabbix, el proxy Zabbix, el agente Zabbix, el servicio web Zabbix, y las utilidades zabbix_sender y zabbix_get
-   A la base de datos de Zabbix [desde el frontend de Zabbix y el servidor/proxy](/manual/appendix/install/db_encrypt)
-   Entre el frontend de Zabbix y el servidor Zabbix

El cifrado es opcional y configurable para componentes individuales:

-   Algunos proxies y agentes pueden configurarse para usar cifrado basado en certificados con el servidor, mientras que otros pueden usar cifrado basado en claves precompartidas, y otros pueden continuar con comunicaciones sin cifrar (como antes).
-   El servidor (proxy) puede usar diferentes configuraciones de cifrado para diferentes equipos.

Los programas demonio de Zabbix utilizan un único puerto de escucha para conexiones entrantes cifradas y no cifradas. Agregar un cifrado no requiere abrir nuevos puertos en los cortafuegos.

[comment]: # ({/73039a5b-0b118c23})

[comment]: # ({8fd79214-bdc6b202})
#### 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 el frontend de Zabbix 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 el frontend de Zabbix y el navegador web del usuario.
-   Actualmente, cada conexión cifrada se abre con un apretón de manos TLS completo, no se implementa almacenamiento en caché de sesión ni tickets.
-   Añadir cifrado aumenta el tiempo para las comprobaciones de métricas y acciones, dependiendo de la latencia de la red:
    -   Por ejemplo, si el retardo de paquetes es de 100 ms, entonces abrir una conexión TCP y enviar una solicitud sin cifrar toma alrededor de 200 ms. Con cifrado, se añaden unos 1000 ms para establecer la conexión TLS.
    -   Es posible que sea necesario aumentar los tiempos de espera, de lo contrario, algunas métricas y acciones que ejecutan scripts remotos en los agentes pueden funcionar con conexiones sin cifrar, pero fallar por tiempo de espera con cifrado.
-   El cifrado no es compatible con el [descubrimiento de red](/manual/discovery/network_discovery). Las comprobaciones de agentes de Zabbix realizadas por descubrimiento de red no estarán cifradas y, si el agente de Zabbix está configurado para rechazar conexiones sin cifrar, dichas comprobaciones no tendrán éxito.

[comment]: # ({/8fd79214-bdc6b202})

[comment]: # ({bac66f33-ba7ecc58})
#### Compilando Zabbix con soporte de cifrado

Para soportar cifrado, Zabbix debe ser compilado y enlazado con una de las bibliotecas criptográficas soportadas:

-   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
-   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 la API `tls_*()` específicas de LibreSSL.
        Los componentes de Zabbix compilados con LibreSSL no podrán usar PSK, solo se pueden usar certificados.

:::notetip
Puede obtener más información sobre cómo configurar SSL para el frontend de Zabbix consultando estas [mejores prácticas](/manual/best_practices/security/cryptography#setting-up-ssl-for-zabbix-frontend).
:::

La biblioteca se selecciona especificando la opción respectiva al script "configure":

-   `--with-gnutls[=DIR]`
-   `--with-openssl[=DIR]` (también se utiliza para LibreSSL)

Por ejemplo, para configurar las fuentes para el servidor y el agente con *OpenSSL* puede usar algo como:

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

Diferentes componentes de Zabbix pueden ser compilados con diferentes bibliotecas criptográficas (por ejemplo, un servidor con *OpenSSL*, un agente con *GnuTLS*).

::: noteimportant
 Si planea usar claves precompartidas (PSK),
considere usar las 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* soportan suites de cifrado PSK con [Perfect Forward Secrecy](https://en.wikipedia.org/wiki/Forward_secrecy#Perfect_forward_secrecy_.28PFS.29).
Las versiones anteriores de la biblioteca *OpenSSL* (1.0.1, 1.0.2c) también soportan PSK, pero las suites de cifrado PSK disponibles no proporcionan Perfect Forward Secrecy. 
:::

[comment]: # ({/bac66f33-ba7ecc58})

[comment]: # ({0f96d146-2d0e2b80})
#### Gestión del cifrado de conexiones

Las conexiones en Zabbix pueden usar:

-   sin cifrado (por defecto)
-   [Cifrado basado en certificados
    RSA](/manual/encryption/using_certificates)
-   [Cifrado basado en PSK](/manual/encryption/using_pre_shared_keys)

Hay dos parámetros importantes que se utilizan 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 pueden especificar uno o más valores.

`TLSConnect` se utiliza en los archivos de configuración para el proxy de Zabbix (en modo activo, especifica solo las conexiones al servidor) y el agente de Zabbix (para comprobaciones activas). En el frontend de Zabbix, el equivalente de TLSConnect es el campo *Conexiones al equipo* en la pestaña *Recopilación de datos → Equipos → <algún equipo> → Cifrado* y el campo *Conexiones al proxy* en *Administración → Proxies → <algún proxy> → Cifrado*. Si el tipo de cifrado configurado para la conexión falla, no se intentarán otros tipos de cifrado.

`TLSAccept` se utiliza en los archivos de configuración para el proxy de Zabbix (en modo pasivo, especifica solo las conexiones desde el servidor) y el agente de Zabbix (para comprobaciones pasivas). En el frontend de Zabbix, el equivalente de TLSAccept es el campo *Conexiones desde el equipo* en la pestaña *Recopilación de datos → Equipos → <algún equipo> → Cifrado* y el campo *Conexiones desde el proxy* en *Administración → Proxies → <algún proxy> → Cifrado*.

Normalmente, solo se configura 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 certificados con el mínimo tiempo de inactividad y posibilidad de reversión. Para lograr esto:

-   Establezca `TLSAccept=unencrypted,cert` en el archivo de configuración del agente y reinicie el agente de Zabbix
-   Pruebe la conexión con zabbix\_get al agente usando certificado. Si funciona, puede reconfigurar el cifrado para ese agente en el frontend de Zabbix en la pestaña *Recopilación de datos → Equipos → <algún equipo> → Cifrado* estableciendo *Conexiones al equipo* en "Certificado".
-   Cuando la caché de configuración del servidor se actualice (y la configuración del proxy se actualice si el equipo es monitorizado por proxy), entonces las conexiones a ese agente estarán cifradas
-   Si todo funciona como se espera, puede establecer `TLSAccept=cert` en el archivo de configuración del agente y reiniciar el agente de Zabbix. Ahora el agente solo aceptará conexiones cifradas basadas en certificados. Las conexiones sin cifrar y basadas en PSK serán rechazadas.

De manera similar, funciona en el servidor y el proxy. Si en el frontend de Zabbix en la configuración del equipo *Conexiones desde el equipo* se establece en "Certificado", entonces solo se aceptarán conexiones cifradas basadas en certificados desde el agente (comprobaciones activas) y zabbix\_sender (métricas trapper).

Lo más probable es que configure las conexiones entrantes y salientes para usar el mismo tipo de cifrado o sin cifrado. Pero técnicamente es posible configurarlo de forma asimétrica, por ejemplo, cifrado basado en certificados para las conexiones entrantes y basado en PSK para las salientes.

La configuración de cifrado para cada equipo se muestra en el frontend de Zabbix, en *Recopilación de datos → Equipos* en la columna *Cifrado del agente*. Por ejemplo:

|Ejemplo|Conexiones al equipo|Conexiones permitidas desde el equipo|Conexiones rechazadas desde el equipo|
|-------|-------------------|-----------------------------|------------------------------|
|![none\_none.png](../../assets/en/manual/encryption/none_none.png)|Sin cifrar|Sin cifrar|Cifradas, cifrado basado en certificado y basado en PSK|
|![cert\_cert.png](../../assets/en/manual/encryption/cert_cert.png)|Cifrado, basado en certificado|Cifrado, basado en certificado|Sin cifrar y cifrado basado en PSK|
|![psk\_psk.png](../../assets/en/manual/encryption/psk_psk.png)|Cifrado, basado en PSK|Cifrado, basado en PSK|Sin cifrar y cifrado basado en certificado|
|![psk\_none\_psk.png](../../assets/en/manual/encryption/psk_none_psk.png)|Cifrado, basado en PSK|Sin cifrar y cifrado basado en PSK|Cifrado basado en certificado|
|![cert\_all.png](../../assets/en/manual/encryption/cert_all.png)|Cifrado, basado en certificado|Sin cifrar, cifrado basado en PSK o certificado|\-|

::: noteimportant
Las conexiones no están cifradas por defecto. El cifrado
debe configurarse para cada equipo y proxy individualmente.
:::

[comment]: # ({/0f96d146-2d0e2b80})

[comment]: # ({ad15e6ff-ad15e6ff})
#### zabbix\_get y zabbix\_sender con cifrado

Consulte las páginas del manual de [zabbix\_get](/manpages/zabbix_get) y
[zabbix\_sender](/manpages/zabbix_sender) para usarlos con
cifrado.

[comment]: # ({/ad15e6ff-ad15e6ff})

[comment]: # ({6f67a86b-be2996e2})
#### Conjuntos de cifrado

De forma predeterminada, los conjuntos de cifrado se configuran internamente durante el inicio de Zabbix.

También se admiten conjuntos de cifrado configurados por el usuario para GnuTLS y OpenSSL. Los usuarios pueden
[configurar](#userconfigured-ciphersuites) los conjuntos de cifrado de acuerdo con
sus políticas de seguridad. El uso de esta función es opcional (los conjuntos de cifrado
predeterminados integrados siguen funcionando).

Para las bibliotecas criptográficas compiladas con la configuración predeterminada, las reglas integradas
de Zabbix normalmente dan como resultado los siguientes conjuntos de cifrado (en orden de
mayor a menor prioridad):

|Biblioteca|Conjuntos de cifrado de certificado|Conjuntos de cifrado PSK|
|-------|------------------------|----------------|
|*GnuTLS 3.1.18*|TLS\_ECDHE\_RSA\_AES\_128\_GCM\_SHA256<br>TLS\_ECDHE\_RSA\_AES\_128\_CBC\_SHA256<br>TLS\_ECDHE\_RSA\_AES\_128\_CBC\_SHA1<br>TLS\_RSA\_AES\_128\_GCM\_SHA256<br>TLS\_RSA\_AES\_128\_CBC\_SHA256<br>TLS\_RSA\_AES\_128\_CBC\_SHA1|TLS\_ECDHE\_PSK\_AES\_128\_CBC\_SHA256<br>TLS\_ECDHE\_PSK\_AES\_128\_CBC\_SHA1<br>TLS\_PSK\_AES\_128\_GCM\_SHA256<br>TLS\_PSK\_AES\_128\_CBC\_SHA256<br>TLS\_PSK\_AES\_128\_CBC\_SHA1|
|*OpenSSL 1.0.2c*|ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-SHA256<br>AES128-SHA|PSK-AES128-CBC-SHA|
|*OpenSSL 1.1.0*|ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-CCM8<br>AES128-CCM<br>AES128-SHA256<br>AES128-SHA<br>|ECDHE-PSK-AES128-CBC-SHA256<br>ECDHE-PSK-AES128-CBC-SHA<br>PSK-AES128-GCM-SHA256<br>PSK-AES128-CCM8<br>PSK-AES128-CCM<br>PSK-AES128-CBC-SHA256<br>PSK-AES128-CBC-SHA|
|*OpenSSL 1.1.1d*|TLS\_AES\_256\_GCM\_SHA384<br>TLS\_CHACHA20\_POLY1305\_SHA256<br>TLS\_AES\_128\_GCM\_SHA256<br>ECDHE-RSA-AES128-GCM-SHA256<br>ECDHE-RSA-AES128-SHA256<br>ECDHE-RSA-AES128-SHA<br>AES128-GCM-SHA256<br>AES128-CCM8<br>AES128-CCM<br>AES128-SHA256<br>AES128-SHA|TLS\_CHACHA20\_POLY1305\_SHA256<br>TLS\_AES\_128\_GCM\_SHA256<br>ECDHE-PSK-AES128-CBC-SHA256<br>ECDHE-PSK-AES128-CBC-SHA<br>PSK-AES128-GCM-SHA256<br>PSK-AES128-CCM8<br>PSK-AES128-CCM<br>PSK-AES128-CBC-SHA256<br>PSK-AES128-CBC-SHA|

[comment]: # ({/6f67a86b-be2996e2})

[comment]: # ({8731bb52-b5e04652})
#### Cifras TLS configuradas por el usuario

Los criterios de selección de cifras integrados pueden ser sobrescritos con cifras TLS configuradas por el usuario.

::: noteimportant
Las cifras TLS configuradas por el usuario son una característica destinada a usuarios avanzados que entienden las cifras TLS, su seguridad y las consecuencias de los errores, y que se sienten cómodos con la resolución de problemas de TLS.
:::

Los criterios de selección de cifras integrados pueden ser sobrescritos utilizando los siguientes parámetros:

|Ámbito de sobrescritura|Parámetro|Valor|Descripción|
|--|--|------|------|
|Selección de cifras para certificados|TLSCipherCert13|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL 1.1.1 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 cifras basados en certificados para TLS 1.3<br><br>Sólo OpenSSL 1.1.1 o superior.|
|^|TLSCipherCert|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL para TLS 1.2 o [cadenas de prioridad](https://gnutls.org/manual/html_node/Priority-Strings.html) válidas de GnuTLS. Sus valores se pasan a las funciones `SSL_CTX_set_cipher_list()` o `gnutls_priority_init()`, respectivamente.|Criterios de selección de cifras basados en certificados para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)|
|Selección de cifras para PSK|TLSCipherPSK13|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL 1.1.1 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 cifras basados en PSK para TLS 1.3<br><br>Sólo OpenSSL 1.1.1 o superior.|
|^|TLSCipherPSK|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL para TLS 1.2 o [cadenas de prioridad](https://gnutls.org/manual/html_node/Priority-Strings.html) válidas de GnuTLS. Sus valores se pasan a las funciones `SSL_CTX_set_cipher_list()` o `gnutls_priority_init()`, respectivamente.|Criterios de selección de cifras basados en PSK para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)|
|Lista combinada de cifras para certificado y PSK|TLSCipherAll13|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL 1.1.1 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 cifras para TLS 1.3<br><br>Sólo OpenSSL 1.1.1 o superior.|
|^|TLSCipherAll|[Cadenas de cifras](https://www.openssl.org/docs/man1.1.1/man1/ciphers.html) válidas de OpenSSL para TLS 1.2 o [cadenas de prioridad](https://gnutls.org/manual/html_node/Priority-Strings.html) válidas de GnuTLS. Sus valores se pasan a las funciones `SSL_CTX_set_cipher_list()` o `gnutls_priority_init()`, respectivamente.|Criterios de selección de cifras para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)|

Para sobrescribir la selección de cifras en las utilidades
[zabbix\_get](/manpages/zabbix_get) y
[zabbix\_sender](/manpages/zabbix_sender), utilice 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 utiliza el valor interno por defecto. Si se define un parámetro, no puede estar vacío.

Si la configuración de un valor TLSCipher\* en la biblioteca criptográfica falla, el servidor, proxy o agente no se iniciará y se registrará un error.

Es importante entender cuándo es aplicable cada parámetro.

[comment]: # ({/8731bb52-b5e04652})

[comment]: # ({ca5e66e4-a74c28c7})
##### Conexiones salientes

El caso más simple son 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-cipher13` o `--tls-cipher`
    (el cifrado se especifica de manera inequívoca con un parámetro `--tls-connect`)

[comment]: # ({/ca5e66e4-a74c28c7})

[comment]: # ({29364114-3edf3b2b})
##### 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 cierto patrón en las dos tablas anteriores:

-   TLSCipherAll y TLSCipherAll13 solo pueden especificarse si se utiliza una lista combinada
    de conjuntos de cifrado basados en certificados **y** PSK. Hay
    dos casos en los que esto ocurre: server (proxy) con un certificado
    configurado (los conjuntos de cifrado PSK siempre se configuran en server, proxy
    si la biblioteca criptográfica admite PSK), agent configurado para aceptar tanto
    conexiones entrantes basadas 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.

|Parámetro|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|

|Parámetro|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 compatibilidad
con 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 conjuntos de cifrado
    PFS](#testing-cipher-strings-and-allowing-only-pfs-ciphersuites)
-   [Cambiar de AES128 a AES256](#switching-from-aes128-to-aes256)

[comment]: # ({/29364114-3edf3b2b})

[comment]: # ({52b821c4-bfb4ef88})
##### 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 ser necesario experimentar con los parámetros `TLSCipher*`
antes de obtener las suites de cifrado deseadas. Es incómodo reiniciar
el servidor, proxy o agente de Zabbix varias veces solo para ajustar los parámetros `TLSCipher*`.
Opciones más convenientes son usar zabbix\_sender o el comando `openssl`. Mostraremos ambos.

**1.** Usando zabbix\_sender.

Vamos a crear 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 CA y de agente válidos y PSK para este ejemplo.
Ajuste las rutas y nombres de los archivos de certificados y PSK para su entorno.

Si no está usando certificados, sino solo PSK, puede crear un archivo de prueba más simple:

      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 por defecto. Estos valores por defecto
se eligen para garantizar la interoperabilidad con agentes Zabbix que se ejecutan en
sistemas con versiones antiguas de OpenSSL (desde 1.0.1).

Con sistemas más nuevos puede optar por reforzar la seguridad permitiendo solo unas
pocas suites de cifrado, por ejemplo, solo suites de cifrado con PFS (Perfect Forward
Secrecy). Probemos permitir solo suites de cifrado con PFS usando
los parámetros `TLSCipher*`.

::: noteimportant
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.
:::

Agregue dos líneas al archivo de configuración `test.conf`:

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

y pruebe de nuevo:

      $ 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 de "certificate ciphersuites" y "PSK ciphersuites" han cambiado:
son más cortas que antes, conteniendo solo suites de cifrado TLS 1.3 y
TLS 1.2 ECDHE-\* como se esperaba.

**2.** TLSCipherAll y TLSCipherAll13 no se pueden probar con
zabbix\_sender; no afectan al valor de "certificate and PSK ciphersuites"
mostrado en el ejemplo anterior. Para ajustar TLSCipherAll y
TLSCipherAll13 debe experimentar con el agente, proxy o servidor.

Por lo tanto, para permitir solo suites de cifrado PFS puede que necesite agregar 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 de ellos tiene un certificado configurado y el agente también tiene PSK.

Si su entorno Zabbix utiliza 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 la suite de cifrado
incluso fuera de Zabbix, con el comando `openssl`. Probemos
los tres valores de 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 manera 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

[comment]: # ({/52b821c4-bfb4ef88})

[comment]: # ({a549cda7-a549cda7})
##### Cambio de AES128 a AES256

Zabbix utiliza AES128 como valor predeterminado incorporado para los datos. Supongamos que está utilizando certificados y desea cambiar a AES256, en OpenSSL 1.1.1.

Esto se puede lograr agregando los parámetros respectivos 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

::: noteimportant
Aunque solo se utilizarán los conjuntos de cifrado relacionados con certificados,
también se definen los parámetros `TLSCipherPSK*` para evitar
sus valores predeterminados que incluyen cifrados menos seguros para una mayor
interoperabilidad. Los conjuntos de cifrado PSK no se pueden deshabilitar completamente en
servidor/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

[comment]: # ({/a549cda7-a549cda7})
