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

2 使用共享密钥

概述

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

  • 非秘密PSK identity(共享密钥一致性)字符串,
  • 秘密PSK字符串值。

PSK identity(共享密钥一致性)字符串是非空的UTF-8字符串。

例如,“PSK ID 001 Zabbix agentd”。这是一个独特的名称,由Zabbix组件引用该特定的PSK。不要将敏感信息放在PSK identity(共享密钥一致性)字符串中 - 它通过网络未加密传输。

PSK值很难猜出十六进制数字的字符串,例如“e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”。

大小限制

在Zabbix中有PSK identity(共享密钥一致性)和PSK值的大小限制,在某些情况下,加密库可以有下限:

组件 P K identity最大大小 PSK值最 大小 PSK值最大大小
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)
Zabbix 128个UTF-8字符 12 位(16字节PSK,输入32位十六进制数字) 2048位(256字节PSK,输入 12个十六进制数字)
GnuTLS 128 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
GnuTLS 128字节(可能包括UTF-8字符) - 2048位(256 节PSK,输入512个十六进制数字)
mbed TLS (PolarSSL) 128 UTF-8 characters - 256-bit (default limit) (32-byte PSK, entered as 64 hexadecimal digits)
mbed TLS (PolarSSL) 128个UTF-8字符 - 25 位(默认限制)(32字节PSK,以64位十六进制数字输入)
OpenSSL 127 bytes (may include UTF-8 characters) - 2048-bit (256-byte PSK, entered as 512 hexadecimal digits)
OpenSSL 127字节(可能包括UTF-8字符) - 2048位(256 节PSK,输入512个十六进制数字)

Zabbix前端允许配置多达128个字符的长的PSK identity(共享密钥一致性)字符串和2048位长的PSK,而不管使用的加密库。
如果某些Zabbix组件支持较低限制,则用户有责任为这些组件配置PSK identity(共享密钥一致性)和PSK值。
超出长度限制会导致Zabbix组件之间的通信故障。

在Zabbix server使用PSK连接到agent之前,服务器将查找数据库中为该agent配置的PSK identity(共享密钥一致性)和PSK值(实际上在配置缓存中)。agent在收到连接后,从其配置文件中读取PSK identity(共享密钥一致性)和PSK值。如果双方具有相同的PSK identity(共享密钥一致性)字符串和PSK值,则连接可能会成功。

用户有责任确保没有两个具有相同PSK identity(共享密钥一致性)字符串但不同值的PSK。否则可能会导致使用PSK和PSK identity(共享密钥一致性)字符串的Zabbix组件之间的通信被中断。

生成PSK

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

  • with OpenSSL:
  • 使用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值的数据库文件。Zabbix只需要PSK文件中的PSK,因此应该从文件中删除'psk_identity:'。

配置PSK进行服务器和agent通信(示例)

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

1f87b595725ac58dd977beef14b97461a7c1045b9a1c963065002c5473194952

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

在agent配置文件zabbix_agentd.conf中编辑TLS参数,例如set:

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前端为此agen配置PSK加密:

  • 转到:配置→主机
  • 选择主机,然后单击加密选项卡

例如:

psk_config.png

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

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

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

e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9

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

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

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

proxy将使用PSK连接到服务器。PSK identity(共享密钥一致性)将是“PSK 002”。

(为了最大限度地减少停机时间看看如何改变连接方式连接加密管理t)。

在Zabbix前端配置此proxy的PSK。转到管理→agent代理程序,选择代理,转到“加密”选项卡。在“从代理连接”勾选PSK。将“PSK identity(共享密钥一致性)”字段填上“PSK 002”,“共享密钥(PSK)“字段填上"e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9"。点击“更新”。

重新启动proxy。它将开始使用基于PSK的加密连接到服务器。检查服务器和proxy日志文件以获取错误消息。

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