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 - 指定用于传出连接的加密方式 连接(未加密、PSK或证书)
  • TLSAccept - 指定允许的连接类型 传入连接(未加密、预共享密钥或证书)。一个或多个 可以指定值。

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配置file并重启Zabbix agent。现在agent 将仅接受基于加密证书的连接。 未加密和基于PSK的连接将被拒绝。

同样地,该功能在服务器和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 内置规则通常会产生以下密码套件(按优先级从高到低排序):

证书密码套件 PSK 密码套件
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 连接设置 加密套件配置
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

对于 Zabbix serverproxy

连接设置 加密套件配置
使用 PSK 的传出连接 TLSCipherPSK, TLSCipherPSK13
使用证书的传入连接 TLSCipherAll, TLSCipherAll13
如果服务器没有证书,则使用 PSK 的传入连接 TLSCipherPSK, TLSCipherPSK13
如果服务器有证书,则使用 PSK 的传入连接 TLSCipherAll, TLSCipherAll13

从上面两个表中可以看出一些模式:

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

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

参数 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
参数 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