17 加密

概述

Zabbix 支持使用传输层安全协议(TLS)v.1.2 和 1.3(取决于加密库)在 Zabbix 组件之间进行加密通信。支持基于证书和基于预共享密钥的加密。

可以对以下连接配置加密:

加密是可选的,并且可以为各个组件单独配置:

  • 某些 proxies 和 agents 可以配置为使用基于证书的加密与服务器通信,而其他设备可以使用基于预共享密钥的加密,还有一些可以继续使用未加密通信(与之前相同)
  • 服务器(proxy)可以对不同的 主机 使用不同的加密配置

Zabbix 守护进程使用一个监听端口来处理加密和未加密的入站连接。添加加密不需要在防火墙上打开新端口。

限制条件

  • 私钥以明文形式存储在Zabbix组件在启动期间可读取的文件中
  • 预共享密钥在Zabbix前端输入,并以明文形式存储在Zabbix数据库中
  • 内置加密不保护以下通信:
    • 运行Zabbix前端的Web服务器与用户浏览器之间
    • Zabbix前端与Zabbix server之间
  • 当前每个加密连接都通过完整的TLS握手打开,未实现会话缓存和票据
  • 添加加密会增加监控项检查和操作的时间,具体取决于网络延迟:
    • 例如,如果数据包延迟为100ms,则打开TCP连接并发送未加密请求大约需要200ms。使用加密时,建立TLS连接大约会增加1000ms;
    • 可能需要增加超时时间,否则某些监控项以及在agents上运行远程脚本的操作在未加密连接下可能正常工作,但在加密连接下会超时失败。
  • network discovery不支持加密。由网络发现执行的Zabbix agent检查将是未加密的,如果Zabbix agent配置为拒绝未加密连接,则此类检查将无法成功。

编译带加密支持的Zabbix

为了支持加密,Zabbix 必须使用以下受支持的加密库之一进行编译和链接:

  • GnuTLS - 从 version 3.1.18
  • OpenSSL - 版本 1.0.1、1.0.2、1.1.0、1.1.1、3.0.x
  • LibreSSL - 测试使用的版本为 2.7.4、2.8.2:
    • LibreSSL 2.6.x 不受支持
    • LibreSSL 作为 OpenSSL 的兼容替代方案受到支持; 但不会使用新的 tls_*() LibreSSL 特定的 API 函数。 使用 LibreSSL 编译的 Zabbix 组件将无法使用 PSK,只能使用证书。

有关为 Zabbix 前端设置 SSL 的更多信息,请参阅这些 zabbix-前端-ssl-配置

通过向 "configure" 脚本指定相应的选项来选择加密库:

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR](也用于 LibreSSL)

例如,要为 server 和 agent 使用 OpenSSL 配置源代码,可以使用如下命令:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

不同的 Zabbix 组件可以使用不同的加密库进行编译(例如,服务器使用 OpenSSL,agent 使用 GnuTLS)。

如果您计划使用预共享密钥(PSK),建议在使用 PSK 的 Zabbix 组件中使用 GnuTLSOpenSSL 1.1.0(或更新版本)库。 GnuTLSOpenSSL 1.1.0 库支持带有 完美前向保密 的 PSK 密码套件。 旧版本的 OpenSSL 库(1.0.1、1.0.2c)也支持 PSK,但可用的 PSK 密码套件不提供完美前向保密。

连接加密管理

Zabbix中的连接可以使用:

有两个重要参数用于指定加密方式 Zabbix组件:

  • TLSConnect - 指定用于传出连接的加密方式 connections (unencrypted, PSK or certificate) 连接(未加密、PSK或证书)
  • TLSAccept - 指定允许的连接类型

    incoming connections (unencrypted, PSK or certificate). One or more values can be specified.

TLSConnect 用于 Zabbix proxy 的配置文件中(在 主动模式(仅指定与服务器的连接)和Zabbix agent(用于 主动检查)。在Zabbix前端中,TLSConnect对应的参数是 连接到 主机 字段位于 数据收集 → 主机 → <某些 主机 > 加密选项卡和连接到proxy字段 管理 → Proxies → <某些 proxy> → 加密 标签页。如果 配置的连接加密类型失败,无其他加密方式 将尝试类型。

TLSAccept 用于 Zabbix proxy 的配置文件中(在 被动模式(仅指定来自服务器的连接)和Zabbix agent (用于被动检查)。在Zabbix前端中,TLSAccept的等效项是 数据收集 → 主机 → <某处 中的 来自 主机 的连接 字段 主机> → 加密 选项卡及 来自 proxy 的连接 字段 管理 → Proxies → <某些 proxy> → 加密* 标签

通常您只需为传入配置一种加密类型 连接。但您可能需要切换加密类型,例如从 从非加密到基于证书的转换,实现最短停机时间和回滚能力 可能性。为实现此目标:

  • 在agent配置file中设置TLSAccept=unencrypted,cert 重启 Zabbix agent
  • 使用证书通过zabbix_get测试与agent的连接。如果 它有效,您可以在Zabbix中为那个agent重新配置加密 前端位于 数据收集 → 主机 → <某个 主机> → 加密 选项卡,通过将 连接到 主机 设置为 "证书"。
  • 当服务器configuration cache更新时(以及proxy 如果 主机 被 proxy 监控则配置会被更新 与该agent的连接将被加密
  • 如果一切按预期运行,您可以在 TLSAccept=cert 中设置

    agent configuration file and restart Zabbix agent. Now the agent will be accepting only encrypted certificate-based connections. Unencrypted and PSK-based connections will be rejected.

同样地,它也适用于服务器和proxy。如果在Zabbix前端中 主机配置 来自主机的连接 设置为"证书"时 仅接受基于证书的加密连接 agent(主动检查)和zabbix_sender(trapper 监控项)。

您很可能需要配置入站和出站连接以使用 相同的加密类型或完全不加密。但从技术上讲 可以非对称配置,例如基于证书 传入连接使用加密,传出连接基于PSK(预共享密钥)。

每个主机的加密配置显示在Zabbix中 前端,位于数据收集 → 主机中的Agent加密列。 例如:

示例 连接到 主机 来自 主机 的允许连接 来自 主机 的拒绝连接
none\_none.png 未加密 未加密 加密,基于证书和PSK的加密
cert\_cert.png 基于证书的加密 基于证书的加密 未加密及基于PSK的加密
psk\_psk.png 基于PSK加密 基于PSK加密 未加密及基于证书加密
psk\_none\_psk.png 基于PSK的加密 未加密和基于PSK的加密 基于证书的加密
cert\_all.png 基于证书的加密 基于PSK或证书的未加密 -

默认情况下连接未加密。加密 必须为每个主机和proxy单独配置。

zabbix_get 与 zabbix_sender 加密传输

请参阅 zabbix_getzabbix_sender 手册页,了解如何将它们与加密功能一起使用。

密码套件

默认情况下,密码套件在 Zabbix 启动期间在内部进行配置。

GnuTLS 和 OpenSSL 也支持用户配置的密码套件。用户可以根据自己的安全策略配置密码套件。使用此功能是可选的(内置默认密码套件仍然可用)。

对于使用默认设置编译的加密库,Zabbix 内置规则通常会生成以下密码套件(按优先级从高到低排序):

Library Certificate ciphersuites PSK ciphersuites
GnuTLS 3.1.18 TLS_ECDHE_RSA_AES_128_GCM_SHA256
TLS_ECDHE_RSA_AES_128_CBC_SHA256
TLS_ECDHE_RSA_AES_128_CBC_SHA1
TLS_RSA_AES_128_GCM_SHA256
TLS_RSA_AES_128_CBC_SHA256
TLS_RSA_AES_128_CBC_SHA1
TLS_ECDHE_PSK_AES_128_CBC_SHA256
TLS_ECDHE_PSK_AES_128_CBC_SHA1
TLS_PSK_AES_128_GCM_SHA256
TLS_PSK_AES_128_CBC_SHA256
TLS_PSK_AES_128_CBC_SHA1
OpenSSL 1.0.2c ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-SHA256
AES128-SHA
PSK-AES128-CBC-SHA
OpenSSL 1.1.0 ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128-GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA
OpenSSL 1.1.1d TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128-GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA

用户配置的密码套件

内置的加密套件选择标准可以使用用户配置的加密套件进行覆盖。

用户配置的加密套件功能是为高级用户设计的,这些用户应理解 TLS 加密套件、其安全性以及配置错误可能带来的后果,并且熟悉 TLS 故障排查。

可以使用以下参数覆盖内置的加密套件选择标准:

覆盖范围 参数 描述
证书的加密套件选择 TLSCipherCert13 适用于 TLS 1.3 协议的有效 OpenSSL 1.1.1 cipher strings(其值将传递给 OpenSSL 函数 SSL_CTX_set_ciphersuites())。 TLS 1.3 的基于证书的加密套件选择标准

仅适用于 OpenSSL 1.1.1 或更高版本。
TLSCipherCert 适用于 TLS 1.2 的有效 OpenSSL cipher strings 或适用于 GnuTLS 的有效 priority strings。它们的值分别传递给 SSL_CTX_set_cipher_list()gnutls_priority_init() 函数。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)的基于证书的加密套件选择标准
PSK 的加密套件选择 TLSCipherPSK13 适用于 TLS 1.3 协议的有效 OpenSSL 1.1.1 cipher strings(其值将传递给 OpenSSL 函数 SSL_CTX_set_ciphersuites())。 TLS 1.3 的基于 PSK 的加密套件选择标准

仅适用于 OpenSSL 1.1.1 或更高版本。
TLSCipherPSK 适用于 TLS 1.2 的有效 OpenSSL cipher strings 或适用于 GnuTLS 的有效 priority strings。它们的值分别传递给 SSL_CTX_set_cipher_list()gnutls_priority_init() 函数。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)的基于 PSK 的加密套件选择标准
证书和 PSK 的组合加密套件列表 TLSCipherAll13 适用于 TLS 1.3 协议的有效 OpenSSL 1.1.1 cipher strings(其值将传递给 OpenSSL 函数 SSL_CTX_set_ciphersuites())。 TLS 1.3 的加密套件选择标准

仅适用于 OpenSSL 1.1.1 或更高版本。
TLSCipherAll 适用于 TLS 1.2 的有效 OpenSSL cipher strings 或适用于 GnuTLS 的有效 priority strings。它们的值分别传递给 SSL_CTX_set_cipher_list()gnutls_priority_init() 函数。 TLS 1.2/1.3(GnuTLS)、TLS 1.2(OpenSSL)的加密套件选择标准

要覆盖 zabbix_getzabbix_sender 工具中的加密套件选择,请使用以下命令行参数:

  • --tls-cipher13
  • --tls-cipher

新参数是可选的。如果未指定参数,则使用内部默认值。如果定义了参数,则不能留空。

如果在加密库中设置 TLSCipher* 值失败,则服务器、proxy 或 agent 将无法启动,并会记录错误信息。

理解每个参数适用的场景非常重要。

出站连接

最简单的情况是传出连接:

  • 对于使用证书的传出连接 - 使用 TLSCipherCert13 或 TLSCipherCert
  • 对于使用 PSK 的传出连接 - 使用 TLSCipherPSK13 或 TLSCipherPSK
  • 在 zabbix_get 和 zabbix_sender 工具的情况下,可以使用命令行参数 --tls-cipher13--tls-cipher(加密方式可通过 --tls-connect 参数明确指定)
入站连接

对于入站连接,情况会稍微复杂一些,因为规则会因组件和配置而异。

对于 Zabbix agent

Agent connection setup Cipher configuration
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

对于 Zabbix 服务器proxy

Connection setup Cipher configuration
Outgoing connections using PSK TLSCipherPSK, TLSCipherPSK13
Incoming connections using certificates TLSCipherAll, TLSCipherAll13
Incoming connections using PSK if server has no certificate TLSCipherPSK, TLSCipherPSK13
Incoming connections using PSK if server has certificate TLSCipherAll, TLSCipherAll13

从上面的两个表中可以看出一些规律:

  • 只有在使用证书和 PSK 基于的密码套件组合列表时,才可以指定 TLSCipherAll 和 TLSCipherAll13。出现这种情况有两种:服务器(proxy)已配置证书(PSK 密码套件始终在服务器上配置;如果加密库支持 PSK,则 proxy 上也会配置),agent 配置为同时接受基于证书和基于 PSK 的入站连接
  • 在其他情况下,TLSCipherCert* 和/或 TLSCipherPSK* 就足够了

下表显示了 TLSCipher* 内置默认值。它们可以作为你自定义值的良好起点。

Parameter GnuTLS 3.6.12
TLSCipherCert NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
TLSCipherPSK NONE:+VERS-TLS1.2:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL
TLSCipherAll NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
Parameter OpenSSL 1.1.1d 1
TLSCipherCert13
TLSCipherCert EECDH+aRSA+AES128:RSA+aRSA+AES128
TLSCipherPSK13 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
TLSCipherPSK kECDHEPSK+AES128:kPSK+AES128
TLSCipherAll13
TLSCipherAll EECDH+aRSA+AES128:RSA+aRSA+AES128:kECDHEPSK+AES128:kPSK+AES128

1 较旧版本的 OpenSSL(1.0.1、1.0.2、1.1.0)、LibreSSL,以及在编译 OpenSSL 时未启用 PSK 支持的情况下,默认值会有所不同。

用户配置的密码套件示例

请参见下面的用户配置密码套件示例:

测试密码字符串并仅允许PFS密码套件

要查看已选择的加密套件,您需要在配置文件file中设置'DebugLevel=4',或对zabbix_sender使用-vv选项。

在get到理想的加密套件之前,可能需要对TLSCipher参数进行一些实验。仅为了调整TLSCipher参数而多次重启Zabbix server、proxy或agent很不方便。更便捷的选择是使用zabbix_sender或openssl命令。我们将展示这两种方法。

1. 使用zabbix_sender

创建一个测试配置文件file,例如/home/zabbix/test.conf,采用file的zabbix_agentd.conf语法:

  Hostname=nonexisting
  ServerActive=nonexisting

  TLSConnect=cert
  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/agent.crt
  TLSKeyFile=/home/zabbix/agent.key
  TLSPSKIdentity=nonexisting
  TLSPSKFile=/home/zabbix/agent.psk

此示例需要有效的CA和agent证书及PSK。请根据您的环境调整证书和PSK的file路径和名称。

如果仅使用PSK而不使用证书,可以创建更简单的测试file:

  Hostname=nonexisting
  ServerActive=nonexisting

  TLSConnect=psk
  TLSPSKIdentity=nonexisting
  TLSPSKFile=/home/zabbix/agentd.psk

通过运行zabbix_sender(示例使用OpenSSL 1.1.d编译)可查看选定的加密套件:

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
  zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA

此处显示的是默认选择的加密套件。这些默认值是为了确保与运行在旧版OpenSSL系统(从1.0.1开始)上的Zabbix agents互操作性。

对于新系统,您可以通过仅允许少数加密套件(例如仅具有PFS(完美前向保密)的加密套件)来增强安全性。让我们尝试使用TLSCipher*参数仅允许具有PFS的加密套件。

如果使用PSK,结果将无法与使用OpenSSL 1.0.1和1.0.2的系统互操作。基于证书的加密应该可以正常工作。

在test.conf配置文件file中添加两行:

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128

然后再次测试:

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites            
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA        
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA        
  zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA        

"certificate ciphersuites"和"PSK ciphersuites"列表已更改——它们比以前更短,仅包含TLS 1.3加密套件和TLS 1.2 ECDHE-*加密套件,符合预期。

2. TLSCipherAll和TLSCipherAll13无法通过zabbix_sender测试;它们不会影响上面示例中显示的"certificate and PSK ciphersuites"值。要调整TLSCipherAll和TLSCipherAll13,您需要对agent、proxy或服务器进行实验。

因此,要仅允许PFS加密套件,您可能需要添加最多三个参数:

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128
  TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128

到zabbix_agentd.conf、zabbix_proxy.conf和zabbix_server_conf中,如果它们都配置了证书且agent还配置了PSK。

如果您的Zabbix环境仅使用基于PSK的加密而不使用证书,则只需一个:

  TLSCipherPSK=kECDHEPSK+AES128

现在您已经理解了其工作原理,甚至可以在Zabbix之外使用openssl命令测试加密套件选择。让我们测试所有三个TLSCipher*参数值:

  $ openssl ciphers EECDH+aRSA+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
  $ openssl ciphers kECDHEPSK+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
  $ openssl ciphers EECDH+aRSA+AES128:kECDHEPSK+AES128 | sed 's/:/ /g'
  TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA

您可能更喜欢使用openssl ciphers和-V选项以获得更详细的输出:

  $ openssl ciphers -V EECDH+aRSA+AES128:kECDHEPSK+AES128
            0x13,0x02 - TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
            0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
            0x13,0x01 - TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD
            0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
            0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
            0xC0,0x13 - ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
            0xC0,0x37 - ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA256
            0xC0,0x35 - ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA1

类似地,您可以测试GnuTLS的优先级字符串:

  $ gnutls-cli -l --priority=NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
  Cipher suites for NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
  TLS_ECDHE_RSA_AES_128_GCM_SHA256                        0xc0, 0x2f      TLS1.2
  TLS_ECDHE_RSA_AES_128_CBC_SHA256                        0xc0, 0x27      TLS1.2

  Protocols: VERS-TLS1.2
  Ciphers: AES-128-GCM, AES-128-CBC
  MACs: AEAD, SHA256
  Key Exchange Algorithms: ECDHE-RSA
  Groups: GROUP-SECP256R1, GROUP-SECP384R1, GROUP-SECP521R1, GROUP-X25519, GROUP-X448, GROUP-FFDHE2048, GROUP-FFDHE3072, GROUP-FFDHE4096, GROUP-FFDHE6144, GROUP-FFDHE8192
  PK-signatures: SIGN-RSA-SHA256, SIGN-RSA-PSS-SHA256, SIGN-RSA-PSS-RSAE-SHA256, SIGN-ECDSA-SHA256, SIGN-ECDSA-SECP256R1-SHA256, SIGN-EdDSA-Ed25519, SIGN-RSA-SHA384, SIGN-RSA-PSS-SHA384, SIGN-RSA-PSS-RSAE-SHA384, SIGN-ECDSA-SHA384, SIGN-ECDSA-SECP384R1-SHA384, SIGN-EdDSA-Ed448, SIGN-RSA-SHA512, SIGN-RSA-PSS-SHA512, SIGN-RSA-PSS-RSAE-SHA512, SIGN-ECDSA-SHA512, SIGN-ECDSA-SECP521R1-SHA512, SIGN-RSA-SHA1, SIGN-ECDSA-SHA1
从 AES128 切换至 AES256

Zabbix使用AES128作为数据的内置默认算法。假设您正在使用证书并希望切换到AES256,在OpenSSL 1.1.1中。

可以通过在zabbix_server.conf中添加相应的参数来实现:

  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/server.crt
  TLSKeyFile=/home/zabbix/server.key
  TLSCipherCert13=TLS_AES_256_GCM_SHA384
  TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
  TLSCipherPSK13=TLS_CHACHA20_POLY1305_SHA256
  TLSCipherPSK=kECDHEPSK+AES256:-SHA1
  TLSCipherAll13=TLS_AES_256_GCM_SHA384
  TLSCipherAll=EECDH+aRSA+AES256:-SHA1:-SHA384

尽管只会使用与证书相关的加密套件,但也会定义TLSCipherPSK*参数,以避免其默认值包含安全性较低的加密算法以实现更广泛的互操作性。在server/proxy上无法完全禁用PSK加密套件。

并且在zabbix_agentd.conf中:

  TLSConnect=cert
  TLSAccept=cert
  TLSCAFile=/home/zabbix/ca.crt
  TLSCertFile=/home/zabbix/agent.crt
  TLSKeyFile=/home/zabbix/agent.key
  TLSCipherCert13=TLS_AES_256_GCM_SHA384
  TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384