使用预共享密钥进行加密

概述

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

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

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

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

大小限制

Zabbix 对 PSK identity 和 value 有大小限制,但在某些情况下,加密库可能具有更低的限制:

组件 PSK identity 最大大小 PSK value 最小大小 PSK value 最大大小
Zabbix 128 个 UTF-8 字符 128 位(16 字节 PSK,输入为 32 个十六进制数字) 2048 位(256 字节 PSK,输入为 512 个十六进制数字)
GnuTLS 128 字节(可能包含 UTF-8 字符) - 2048 位(256 字节 PSK,输入为 512 个十六进制数字)
OpenSSL 1.0.x, 1.1.0 127 字节(可能包含 UTF-8 字符) - 2048 位(256 字节 PSK,输入为 512 个十六进制数字)
OpenSSL 1.1.1 127 字节(可能包含 UTF-8 字符) - 512 位(64 字节 PSK,输入为 128 个十六进制数字)
OpenSSL 1.1.1a and later 127 字节(可能包含 UTF-8 字符) - 2048 位(256 字节 PSK,输入为 512 个十六进制数字)

Zabbix 前端允许配置长度最多为 128 个字符的 PSK identity 字符串和长度为 2048 位的 PSK,而不受所使用加密库的影响。
如果某些 Zabbix 组件支持的限制更低,则用户有责任按照这些组件允许的长度配置 PSK identity 和 value。
超过长度限制会导致 Zabbix 组件之间通信失败。

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

每个 PSK identity 只能与一个 value 配对。用户有责任确保不存在具有相同 identity 字符串但 value 不同的两个 PSK。未能做到这一点,可能会导致使用此 PSK identity 字符串的 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,因此应从文件中删除标识字符串和冒号(':')。

配置用于服务器-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 将连接到服务器(主动检查),并且只接受来自服务器和 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

(如需最大限度地减少停机时间,请参阅连接加密管理中有关如何更改连接类型的说明。)

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

  1. 转到:数据采集 > 主机
  2. 选择主机,然后单击加密选项卡。
  3. 配置 PSK 加密详细信息。

示例:

psk\_config.png

所有必填输入字段均以红色星号标记。

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

配置 PSK 用于服务器与主动 proxy 通信(示例)

在 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 连接到服务器。PSK 标识将为“PSK 002”。

(如需最大限度减少停机时间,请参阅连接加密管理中有关如何更改连接类型的说明。)

在 Zabbix 前端中为此 proxy 配置 PSK。转到 管理 > Proxy,选择该 proxy,然后转到加密选项卡。在 “来自 proxy 的连接”中勾选 PSK。在“PSK 标识”字段中粘贴 “PSK 002”,并在“PSK”字段中粘贴 “e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”。 单击“更新”。

重启 proxy。它将开始使用基于 PSK 的加密连接连接到服务器。检查服务器和 proxy 的日志文件中是否有错误消息。

对于被动 proxy,操作过程非常相似。 唯一的区别是:在 Zabbix proxy 配置文件中设置 TLSAccept=psk,并在 Zabbix 前端中将到 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 个十六进制数字输入)。

另请参见:值大小限制