使用预共享密钥进行加密

概述

Zabbix 中的每个预共享密钥(PSK)实际上由两部分组成:

  • 非机密的 PSK 标识字符串,
  • 机密的 PSK 字符串值。

PSK 标识字符串是一个非空的 UTF-8 字符串。例如,“PSK ID 001 Zabbix agentd”。它是一个唯一名称,Zabbix 组件通过它来引用该特定 PSK。请不要在 PSK 标识字符串中放入敏感信息 - 它会在网络上传输且不加密。

PSK 值是一个难以猜测的十六进制数字字符串,例如,“e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”。

大小限制

在 Zabbix 中,PSK 标识和 PSK 值都有大小限制,在某些情况下,密码库可能会有更低的限制:

Component PSK identity max size PSK value min size PSK value max size
Zabbix 128 UTF-8 characters 128-bit (16-byte PSK, entered as 32 hexadecimal digits) 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
GnuTLS 128 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
OpenSSL 1.0.x, 1.1.0 127 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
OpenSSL 1.1.1 127 bytes (may include UTF-8 characters) - 512-bit (64-byte PSK, entered as 128 hexadecimal digits)
OpenSSL 1.1.1a and later 127 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)

无论使用哪种密码库,Zabbix 前端都允许配置最长 128 个字符的 PSK 标识字符串,以及 2048 位长度的 PSK。
如果某些 Zabbix 组件支持更低的限制,则由用户负责为这些组件配置允许长度内的 PSK 标识和 PSK 值。
超过长度限制会导致 Zabbix 组件之间通信失败。

在 Zabbix 服务器使用 PSK 连接 agent 之前,服务器会在数据库中(实际上是在配置缓存中)查找为该 agent 配置的 PSK 标识和 PSK 值。收到连接后,agent 会使用其配置文件中的 PSK 标识和 PSK 值。如果双方具有相同的 PSK 标识字符串和 PSK 值,连接就可能成功。

每个 PSK 标识只能对应一个值。用户有责任确保不存在两个具有相同标识字符串但值不同的 PSK。否则可能会导致不可预测的错误,或使用该 PSK 标识字符串的 Zabbix 组件之间通信中断。

生成 PSK

例如,可以使用以下命令生成一个 256 位(32 字节)的 PSK:

  • 使用 OpenSSL
$ openssl rand -hex 32
af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429
  • 使用 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

请注意,上面的 "psktool" 会生成一个包含 PSK 标识和其关联 PSK 的数据库文件。Zabbix 只需要 PSK 文件中的 PSK,因此应从文件中删除标识字符串和冒号(':')。

配置 server-agent 通信的 PSK(示例)

在 agent 主机上,将 PSK 值写入一个文件,例如 /home/zabbix/zabbix_agentd.psk。该文件必须在第一行文本字符串中包含 PSK,例如:

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

将 PSK 文件的访问权限设置为仅 Zabbix 用户可读。

编辑 Zabbix agent 配置文件zabbix_agentd.conf)中的 TLS 参数。例如,设置为:

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

agent 将连接到 server(主动检查),并且只接受来自 server 和 zabbix_get 的 PSK 连接。PSK 标识将为 "PSK 001"。

重启 agent。现在你可以使用 zabbix_get 测试连接,例如:

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

(如需尽量减少停机时间,请参阅如何在 Connection encryption management 中更改连接类型。)

在 Zabbix 前端中为该 agent 配置 PSK 加密:

  1. 转到:Data collection > Hosts
  2. 选择主机并点击 Encryption 选项卡。

示例:

psk\_config.png

所有必填输入字段都用红色星号标记。

当配置缓存与数据库同步后,新连接将使用 PSK。请检查服务器和 agent 日志文件中的错误消息。

配置 server - active proxy 通信的 PSK(示例)

在 proxy 上,将 PSK 值写入一个文件,例如 /home/zabbix/zabbix_proxy.psk。该文件必须在第一行文本字符串中包含 PSK,例如:

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

将 PSK 文件的访问权限设置为仅 Zabbix 用户可读。

编辑 Zabbix proxy 配置文件zabbix_proxy.conf)中的 TLS 参数。例如,设置:

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

proxy 将使用 PSK 连接到 server。PSK 标识将为 "PSK 002"。

(如需尽量减少停机时间,请参阅如何在 Connection encryption management 中更改连接类型。)

在 Zabbix 前端中为此 proxy 配置 PSK。进入 Administration > Proxies,选择该 proxy,转到 Encryption 选项卡。在 "Connections from proxy" 中勾选 PSK。将 "PSK identity" 字段填入 "PSK 002",并将 "e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9" 填入 "PSK" 字段。点击 "Update"。

重启 proxy。它将开始使用基于 PSK 的加密连接连接到 server。检查 server 和 proxy 日志文件中的错误信息。

对于被动 proxy,操作过程非常相似。 唯一的区别是 - 在 Zabbix proxy 配置文件 中设置 TLSAccept=psk,并在 Zabbix 前端中将 Connections to proxy 设置为 PSK

PSK 问题排查

PSK 包含奇数个十六进制数字

proxy 或 agent 未启动,proxy 或 agent 日志中的消息:

文件 "/home/zabbix/zabbix_proxy.psk" 中的 PSK 无效
长度超过 128 字节的 PSK 标识字符串被传递给 GnuTLS

在 TLS 客户端日志中:

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

在 TLS 服务器端日志中:

gnutls_handshake() failed: -90 The SRP username supplied is illegal.
在 OpenSSL 1.1.1 中使用了过长的 PSK 值

在连接端日志中:

...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"'

在接受端日志中:

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

此问题通常出现在将 OpenSSL 从 1.0.x 或 1.1.0 升级到 1.1.1 时,并且 PSK 值长度超过 512 位(64 字节的 PSK,以 128 个十六进制数字输入)。

另请参见:值大小限制