2022 Zabbix中国峰会
2022 Zabbix中国峰会

2 使用预共享秘钥

概述

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

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

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

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

PSK大小(长度)限制

Zabbix中的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标识和值
超过长度限制会导致Zabbix组件之间的通信故障。

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

每个PSK标识只能与一个值配对。用户有责任确保不存在两个具有相同标识字符串但值不同的PSK。如果不这样做,可能会导致Zabbix组件之间使用带有此PSK标识字符串的PSK时出现不可预测的错误或通信中断。

生成 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,因此应从文件中删除标识字符串和冒号 (':')。

为server-agent通信配置PSK (example)

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

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

设置PSK文件的访问权限-它必须只能由Zabbix用户读取。

编辑agent配置文件“zabbix_agented.conf”中的TLS参数, 例如,设置:

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

agent将连接到server(主动检查),并使用PSK仅接受来自server和“zabbix_get”的连接。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加密:

  • Go to: Data collection → Hosts
  • Select host and click on Encryption tab

示例:

psk_config.png

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

当配置缓存与数据库同步时,新连接将使用PSK。检查server和proxy日志文件中的错误消息。

为服务器配置 PSK - 活动代理通信(示例)

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

  e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

设置PSK文件的访问权限 - 它必须只能由Zabbix用户读取。

在代理配置文件 zabbix_proxy.conf中编辑TLS参数, 例如,设置:

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

代理将使用 PSK 连接到服务器。PSK 标识将是 "PSK 002"。

(为最大限度地减少停机时间,请参阅 连接加密管理)。

在 Zabbix 前端中为此代理配置 PSK。 转到管理→代理, 选择代理, 转到 "加密" 选项卡。 在"来自代理的连接" 中,标记PSK。将"PSK 002"粘贴到"PSK 标识"字段中,将"e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9" 粘贴到"PSK" 字段。 点击 "更新"。

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

对于被动代理,该过程非常相似。唯一的区别是 - 在代理配置文件中设置 TLSAccept=psk,并将Zabbix前端中的 "连接到 代理" 设置为 PSK