2 使用预共享秘钥

概述

Zabbix中的每个预共享密钥(PSK)实际上是一对:

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

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

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

大小限制

在 Zabbix 中,PSK 标识和 PSK 值存在大小限制;在某些情况下,加密库的限制可能更低:

组件 PSK 标识最大大小 PSK 值最小大小 PSK 值最大大小
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 及更高版本 127 字节(可包含 UTF-8 字符) - 2048 位(256 字节 PSK,以 512 个十六进制数字输入)

Zabbix 前端允许配置最长 128 个字符的 PSK 标识字符串以及最长 2048 位的 PSK,而不考虑所使用的加密库。
如果某些 Zabbix 组件支持的限制更低,则用户有责任为这些组件配置长度符合要求的 PSK 标识和 PSK 值。
超出长度限制会导致 Zabbix 组件之间通信失败。

在 Zabbix 服务器使用 PSK 连接到 agent 之前,服务器会在数据库中查找为该 agent 配置的 PSK 标识和 PSK 值(实际上是在配置缓存中查找)。收到连接时,agent 使用其配置文件中的 PSK 标识和 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
    为用户 'psk_identity'生成随机密钥
    密钥存储到 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 用户可读。

编辑 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 加密:

  • 转到:数据采集 → 主机
  • 选择主机并单击 加密 选项卡

示例:

psk\_config.png

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

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

为服务器 - 主动 proxy 通信配置 PSK(示例)

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

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

设置 PSK 文件的访问权限——它必须只能由 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。转到 Administration→Proxies,选择该 proxy,进入“Encryption”选项卡。在 “Connections from proxy”中勾选 PSK。将“PSK identity”字段设置为“PSK 002”,并将 “e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”粘贴到 “PSK”字段中。点击“Update”。

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

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