Cifrado mediante claves precompartidas

Descripción general

Cada clave precompartida (PSK) en Zabbix en realidad es un par de:

  • cadena de identidad PSK no secreta,
  • valor de cadena PSK secreto.

La cadena de identidad PSK es una cadena UTF-8 no vacía. Por ejemplo, "PSK ID 001 Zabbix agentd". Es un nombre único por el que los componentes de Zabbix hacen referencia a esta PSK específica. No coloque información sensible en la cadena de identidad PSK: se transmite por la red sin cifrar.

El valor PSK es una cadena difícil de adivinar de dígitos hexadecimales, por ejemplo, "e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9".

Límites de tamaño

Existen límites de tamaño para la identidad y el valor de PSK en Zabbix; en algunos casos, una biblioteca criptográfica puede tener un límite inferior:

Componente Tamaño máximo de la identidad PSK Tamaño mínimo del valor PSK Tamaño máximo del valor PSK
Zabbix 128 caracteres UTF-8 128 bits (PSK de 16 bytes, introducida como 32 dígitos hexadecimales) 2048 bits (PSK de 256 bytes, introducida como 512 dígitos hexadecimales)
GnuTLS 128 bytes (puede incluir caracteres UTF-8) - 2048 bits (PSK de 256 bytes, introducida como 512 dígitos hexadecimales)
OpenSSL 1.0.x, 1.1.0 127 bytes (puede incluir caracteres UTF-8) - 2048 bits (PSK de 256 bytes, introducida como 512 dígitos hexadecimales)
OpenSSL 1.1.1 127 bytes (puede incluir caracteres UTF-8) - 512 bits (PSK de 64 bytes, introducida como 128 dígitos hexadecimales)
OpenSSL 1.1.1a y posteriores 127 bytes (puede incluir caracteres UTF-8) - 2048 bits (PSK de 256 bytes, introducida como 512 dígitos hexadecimales)

El frontend de Zabbix permite configurar una cadena de identidad PSK de hasta 128 caracteres y una PSK de hasta 2048 bits, independientemente de las bibliotecas criptográficas utilizadas.
Si algunos componentes de Zabbix admiten límites inferiores, es responsabilidad del usuario configurar la identidad y el valor de PSK con una longitud permitida para dichos componentes.
Superar los límites de longitud provoca fallos de comunicación entre los componentes de Zabbix.

Antes de que el server de Zabbix se conecte al agent mediante PSK, el server busca en la base de datos la identidad y el valor de PSK configurados para ese agent (en realidad, en la caché de configuración). Al recibir una conexión, el agent utiliza la identidad y el valor de PSK de su archivo de configuración. Si ambas partes tienen la misma cadena de identidad PSK y el mismo valor de PSK, la conexión puede establecerse correctamente.

Cada identidad PSK debe estar asociada a un único valor. Es responsabilidad del usuario asegurarse de que no existan dos PSK con la misma cadena de identidad, pero con valores diferentes. No hacerlo puede provocar errores impredecibles o interrupciones de la comunicación entre los componentes de Zabbix que utilizan PSK con esta cadena de identidad PSK.

Generación de PSK

Por ejemplo, se puede generar un PSK de 256 bits (32 bytes) usando los siguientes comandos:

  • con OpenSSL:
$ openssl rand -hex 32
af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429
  • con GnuTLS:
$ psktool -u psk_identity -p database.psk -s 32
Generating a random key for user 'psk_identity'
Key stored to database.psk

$ cat database.psk 
psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb

Tenga en cuenta que "psktool" arriba genera un archivo de base de datos con una identidad PSK y su PSK asociada. Zabbix espera solo un PSK en el archivo PSK, por lo que la cadena de identidad y el signo de dos puntos (':') deben eliminarse del archivo.

Configuración de PSK para la comunicación entre el server y el agent (ejemplo)

En el host del agent, escriba el valor de PSK en un archivo, por ejemplo, /home/zabbix/zabbix_agentd.psk. El archivo debe contener la PSK en la primera cadena de texto, por ejemplo:

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

Establezca los permisos de acceso al archivo de PSK; solo el usuario de Zabbix debe poder leerlo.

Edite los parámetros TLS en el archivo de configuración del agent de Zabbix (zabbix_agentd.conf). Por ejemplo, establezca:

TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/home/zabbix/zabbix_agentd.psk
TLSPSKIdentity=PSK 001

El agent se conectará al server (comprobaciones activas) y aceptará del server y de zabbix_get únicamente conexiones que utilicen PSK. La identidad de PSK será "PSK 001".

Reinicie el agent. Ahora puede probar la conexión mediante zabbix_get, por ejemplo:

zabbix_get -s 127.0.0.1 -k "system.cpu.load[all,avg1]" --tls-connect=psk --tls-psk-identity="PSK 001" --tls-psk-file=/home/zabbix/zabbix_agentd.psk

(Para minimizar el tiempo de inactividad, consulte cómo cambiar el tipo de conexión en Gestión del cifrado de conexiones).

Configure el cifrado PSK para este agent en el frontend de Zabbix:

  1. Vaya a: Recopilación de datos > Hosts.
  2. Seleccione el host y haga clic en la pestaña Cifrado.
  3. Configure los detalles del cifrado PSK.

Ejemplo:

psk\_config.png

Todos los campos de entrada obligatorios están marcados con un asterisco rojo.

Cuando la caché de configuración se sincronice con la base de datos, las nuevas conexiones utilizarán PSK. Compruebe los archivos de registro del server y del agent para ver si hay mensajes de error.

Configuración de PSK para la comunicación entre el server y un proxy activo (ejemplo)

En el proxy, escriba el valor de PSK en un archivo, por ejemplo, /home/zabbix/zabbix_proxy.psk. El archivo debe contener la PSK en la primera cadena de texto, por ejemplo:

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

Establezca los permisos de acceso al archivo de PSK; solo el usuario de Zabbix debe poder leerlo.

Edite los parámetros TLS en el archivo de configuración del proxy de Zabbix (zabbix_proxy.conf). Por ejemplo, establezca:

TLSConnect=psk
TLSPSKFile=/home/zabbix/zabbix_proxy.psk
TLSPSKIdentity=PSK 002

El proxy se conectará al server mediante PSK. La identidad de PSK será "PSK 002".

(Para minimizar el tiempo de inactividad, consulte cómo cambiar el tipo de conexión en Gestión del cifrado de conexiones).

Configure la PSK para este proxy en el frontend de Zabbix. Vaya a Administración > Proxies, seleccione el proxy y vaya a la pestaña Cifrado. En "Conexiones desde el proxy", marque PSK. Pegue "PSK 002" en el campo "Identidad de PSK" y "e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9" en el campo "PSK". Haga clic en "Actualizar".

Reinicie el proxy. Comenzará a utilizar conexiones cifradas basadas en PSK con el server. Compruebe los archivos de registro del server y del proxy para detectar mensajes de error.

Para un proxy pasivo, el procedimiento es muy similar. La única diferencia consiste en establecer TLSAccept=psk en el archivo de configuración del proxy de Zabbix y establecer Conexiones al proxy en el frontend de Zabbix como PSK.

Solución de problemas de PSK

PSK contiene un número impar de dígitos hexadecimales

El proxy o el agent no se inicia, mensaje en el log del proxy o del agent:

PSK no válida en el archivo "/home/zabbix/zabbix_proxy.psk"
Se pasa a GnuTLS una cadena de identidad PSK de más de 128 bytes

En el registro del lado cliente de TLS:

gnutls_handshake() failed: -110 The TLS connection was non-properly terminated.

En el registro del lado servidor de TLS.

gnutls_handshake() failed: -90 The SRP username supplied is illegal.
Valor PSK demasiado largo usado con OpenSSL 1.1.1

En el registro del lado de la conexión:

...OpenSSL library (version OpenSSL 1.1.1  11 Sep 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK 1"
...zbx_psk_client_cb() requested PSK identity "PSK 1"
...End of zbx_tls_connect():FAIL error:'SSL_connect() set result code to SSL_ERROR_SSL: file ssl\statem\extensions_clnt.c line 801: error:14212044:SSL routines:tls_construct_ctos_early_data:internal error: TLS write fatal alert "internal error"'

En el registro del lado de aceptación:

...Message from 123.123.123.123 is missing header. Message ignored.

Este problema suele aparecer al actualizar OpenSSL de 1.0.x o 1.1.0 a 1.1.1 y si el valor PSK es más largo que 512 bits (PSK de 64 bytes, introducido como 128 dígitos hexadecimales).

Véase también: Límites de tamaño de valor