17. 加密

概览

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

加密可以配置用于以下连接:

  • Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, zabbix_sender 以及 zabbix_get 工具之间的连接
  • 到 Zabbix 数据库的连接 从 Zabbix 前端和 server/proxy

加密是可选的,可以为各个组件进行配置:

  • 一些 proxies 和 agents 可以配置为使用基于证书的加密与 server 通信,而其他可以使用基于预共享密钥的加密,还有一些继续使用未加密的通信(如同以往)
  • Server (proxy) 可以为不同 hosts 使用不同的加密配置

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

限制因素

  • 私钥以纯文本形式存储在Zabbix组件启动时可读的文件中
  • 预共享密钥在Zabbix前端输入,并以明文形式存储在Zabbix数据库中
  • 内置加密不能保护通信:
    • 运行Zabbix前端的web服务器和用户web浏览器之间
    • Zabbix前端和Zabbix server之间
  • 目前,每个加密连接都使用完整的TLS握手打开,没有实现会话缓存和票据
  • 根据网络延迟,添加加密会增加监控项检查和操作的时间:
    • 例如,如果包延迟100ms,那么打开TCP连接并发送未加密的请求大约需要200ms。 在建立TLS连接时,增加约1000毫秒的加密;
    • 超时可能需要增加,否则在代理上运行远程脚本的某些监控项和操作可能会在未加密的连接中工作,但在加密的连接中超时则会失败。
  • 不支持加密 网络设备自动发现。由网络发现执行的Zabbix agent 检查将不加密,如果Zabbix agent被配置为拒绝未加密的连接,这样的检查将不会成功。

编译 Zabbix 以支持加密

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

  • GnuTLS - 从版本 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 的更多信息,请参阅这些 最佳实践

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

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

例如,使用 OpenSSL 配置服务器和 agent 的源代码,您可以使用类似以下命令:

./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 - 指定允许的入站连接类型(无加密、PSK或证书)。可以指定一个或多个值。

TLSConnect 在配置文件中用于 Zabbix proxy(在主动模式下,仅指定到服务器的连接)和 Zabbix agent(用于主动检查)。在Zabbix前端,TLSConnect的等效项是 数据收集 → 主机 → <某个主机> → 加密 选项卡中的 到主机的连接 字段,以及 管理 → Proxies → <某个 proxy> → 加密 选项卡中的 到 proxy 的连接 字段。如果配置的加密类型连接失败,将不会尝试其他加密类型。

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

通常,您只为入站连接配置一种加密类型。但您可能希望切换加密类型,例如,从无加密到基于证书的加密,以最小的停机时间和回滚可能性。为此:

  • 在 agent 配置文件中设置 TLSAccept=unencrypted,cert 并重启 Zabbix agent
  • 使用证书测试与 agent 的连接。如果它工作,您可以在Zabbix前端的 数据收集 → 主机 → <某个主机> → 加密 选项卡中重新配置该 agent 的加密,将 到主机的连接 设置为“证书”。
  • 当服务器配置缓存更新(如果主机由 proxy 监控,则更新 proxy 配置)时,到该 agent 的连接将被加密
  • 如果一切按预期工作,您可以在 agent 配置文件中设置 TLSAccept=cert 并重启 Zabbix agent。现在,agent 将只接受加密的基于证书的连接。无加密和PSK基于的连接将被拒绝。

以类似的方式,它在服务器和 proxy 上工作。如果在Zabbix前端的主机配置中 来自主机的连接 设置为“证书”,则仅接受来自 agent(主动检查)和zabbix_sender(陷阱 监控项)的加密的基于证书的连接。

很可能您将配置入站和出站连接使用相同的加密类型,或者根本不使用加密。但从技术上讲,可以不对称地配置它,例如,入站为基于证书的加密,出站为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 and 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 有效 OpenSSL 1.1.1 cipher strings 对于TLS 1.3协议(它们的值被传递到OpenSSL函数SSL_CTX_set_ciphersuites())。 TLS 1.3的基于证书的加密套件选择标准

仅支持OpenSSL 1.1.1及以上版本。
TLSCipherCert 针对TLS 1.2的有效OpenSSL密码字符串 或有效的GnuTLS优先级字符串。它们的值分别传递给SSL_CTX_set_cipher_list()或gnutls_priority_init()函数。 针对TLS 1.2/1.3 (GnuTLS)、TLS 1.2 (OpenSSL)的基于证书的密码套件选择标准。
Ciphersuite selection for PSK TLSCipherPSK13 有效的OpenSSL 1.1.1密码字符串 对于TLS 1.3协议(它们的值被传递到OpenSSL函数SSL_CTX_set_ciphersuites())。 基于psk的TLS 1.3加密套件选择标准

仅支持OpenSSL 1.1.1及以上版本。
TLSCipherPSK 对于TLS 1.2有效的OpenSSL密码字符串或有效的GnuTLS优先级字符串。它们的值分别传递给SSL_CTX_set_cipher_list()或gnutls_priority_init()函数。 基于psk的TLS 1.2/1.3 (GnuTLS)、TLS 1.2 (OpenSSL)加密套件选择标准。
Combined ciphersuite list for certificate and PSK TLSCipherAll13 TLS 1.3协议的有效的OpenSSL 1.1.1密码字符串(它们的值被传递到OpenSSL函数SSL_CTX_set_ciphersuites())。 TLS 1.3

仅支持OpenSSL 1.1.1及以上版本。
TLSCipherAll 对于TLS 1.2有效的OpenSSL密码字符串或有效的GnuTLS优先级字符串。它们的值分别传递给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

新参数为可选参数。 如果没有指定参数,则使用内部的默认值。 如果参数已定义,则它不能为空。

如果加密库中的tlsciphher *值设置失败,则server、proxy或agent将无法启动,并记录一个错误。

理解每个参数何时适用是很重要的。

外部连接

简单例子外部连接:

  • 对于使用证书的外发连接-使用TLSCipherCert13或TLSCipherCert
  • 对于PSK外发连接,使用TLSCipherPSK13和TLSCipherPSK
  • 在zabbix_get和zabbix_sender实用程序中,可以使用命令行参数'——tls-cipher13 '和'——tls-cipher '(加密用'——tls-connect '参数明确指定)
传入连接

传入连接有点复杂,因为规则是 特定于组件和配置。

对 Zabbix agent:

Agent 连接步骤 Cipher 配置
TLSConnect=cert TLSCipherCert, TLSCipherCert13
TLSConnect=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert TLSCipherCert, TLSCipherCert13
TLSAccept=psk TLSCipherPSK, TLSCipherPSK13
TLSAccept=cert,psk TLSCipherAll, TLSCipherAll13

对 Zabbix server and proxy:

连接 Cipher 配置
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密码套件的列表。那里 发生时有两种情况:Server(Proxy)配置了 证书(PSK密码套件总是在Server、Proxy服务器上配置 如果加密库支持PSK),则代理配置为接受两者 基于证书和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以及在不支持PSK的情况下编译的OpenSSL的默认值不同。

用户配置的密码套件示例

请参阅以下用户配置密码套件的示例:

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

要查看哪些加密套件已经被选中,你需要在配置文件中设置'DebugLevel=4',或者对zabbix_sender使用' -vv '选项。

在获得所需的密码组之前,可能需要对“TLSCipher”参数进行一些实验。 为了调整“TLSCipher”参数,多次重启Zabbix server、proxy或agent是不方便的。 更方便的选项是使用zabbix_sender或' openssl '命令。 让我们几种都看看如何实现。

1. 使用 zabbix_sender.

让我们做一个测试配置文件,例如/home/zabbix/test.conf,使用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和代理证书以及PSK。 为您的环境调整证书和PSK文件路径和名称。

如果你不使用证书,而只使用PSK,你可以制作一个更简单的测试文件:

  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代理的互操作性。

在较新的系统中,你可以选择通过只允许一些密码套件来加强安全性,例如。 只有PFS(完全向前保密)密码套件。 让我们尝试只允许使用' TLSCipher* '参数的PFS加密套件。

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

添加两行到' test.conf '配置文件:

  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        

“证书密码套件”和“PSK密码套件”列表已更改 - 它们比以前短,只包含预期的TLS 1.3加密套件和TLS 1.2 ECDHE-*加密套件。

2. TLSCipherAll和TLSCipherAll13不能被zabbix_sender测试; 它们不会影响上面示例中显示的“证书和PSK密码套件”的值。 要调整TLSCipherAll和TLSCipherAll13,你需要用agent、proxy或server进行实验。

因此,为了只允许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 作为数据的内置默认值。假设您正在使用证书并希望在 OpenSSL 1.1.1 上切换到 AES256。

这可以通过在配置文件中添加相应的参数来实现。 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* 参数,以避免其默认值包含为更广泛的互操作性而设计的安全性较低的密码。PSK 密码套件不能在server/proxy上完全禁用。

和在 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