2 使用预共享密钥

概述

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

  • 非机密的PSK标识string
  • 机密的PSKstring值

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

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

大小限制

Zabbix对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身份标识string和2048位的PSK值,不受所用加密库限制。
若某些Zabbix组件支持更低的限制,用户需自行确保为这些组件配置符合长度要求的PSK身份标识和值。
超出长度限制将导致Zabbix组件间通信失败。

在Zabbix server使用PSK连接agent前,服务器会从数据库(实际为configuration cache)中查询为该agent配置的PSK身份标识和PSK值。当接收到连接时,agent使用其配置file中的PSK身份标识和PSK值。若双方具有相同的PSK身份标识string和PSK值,则连接可能成功建立。

每个PSK身份标识必须仅对应一个值。用户需确保不存在具有相同身份标识string但不同值的多个PSK。若未遵守此规则,可能导致不可预知的错误或使用该PSK身份标识string的Zabbix组件间通信中断。

生成 PSK

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

  • 使用OpenSSL:

$ openssl rand -hex 32 af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429

  • 使用GnuTLS:

$ psktool -u psk_identity -p database.psk -s 32 为用户'psk_identity'生成随机密钥 密钥已存储至数据库.psk

$ cat database.psk psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb

请注意,上述"psktool"会生成一个包含PSK身份标识的数据库file 及其关联的PSK。Zabbix在PSK file中仅期望一个PSK,因此 标识string和冒号(':')应从file中移除。

为服务器-agent通信配置PSK(示例)

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

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

设置PSK file的访问权限 - 必须仅允许Zabbix用户可读。

在agent配置文件file 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

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

当configuration cache与数据库同步后,新连接将使用PSK。检查server 和 agent日志文件中的错误信息。

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

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

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

设置PSK file的访问权限 - 必须仅允许Zabbix用户可读。

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

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

proxy将使用PSK连接服务器。PSK标识将为"PSK 002"。

(要最小化停机时间,请参阅连接加密管理中关于更改连接类型的方法)。

在Zabbix前端为此proxy配置PSK。前往 管理→Proxies,选择proxy,进入"加密"标签页。在 "来自proxy的连接"中勾选PSK。在"PSK标识"字段输入 "PSK 002"并在 "PSK"字段输入"e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9"。点击"更新"。

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

对于被动式proxy,操作流程非常相似。唯一区别是 - 在proxy配置文件file中设置TLSAccept=psk,并在Zabbix前端将"连接到 proxy"设置为PSK