vlambda博客
学习文章列表

Zabbix4.x如何安全传输数据

认证介绍

由于设备都在混合云,所以不少数据传输是通过公网,这样极大的增加了危险性,所以在Zabbix数据传输这块则进行PSK安全认证,由proxy主动收集agent数据后统一发送给server,这样只需要对proxy到server之间的数据进行加密即可。

Zabbix从3.0开始支持传输层安全性(TLS)协议v.1.2加密,在Zabbix服务器,Zabbix代理,Zabbix代理,zabbix_sender和zabbix_get实用程序之间进行加密通信,支持基于证书PSA和基于预共享密钥PSK的加密。

加密对于各个组件是可选配置,Zabbix_Proxy到Zabbix Server之间可以基于证书加密或者基于预共享密钥加密。

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

加密的局限性

在启动期间,私钥以纯文本格式存储在Zabbix组件可读的文件中。预共享密钥在Zabbix前端中输入,并以纯文本格式存储在Zabbix数据库中。内置加密不能保护通信:在运行Zabbix前端的Web服务器和用户Web浏览器之间,在Zabbix前端和Zabbix服务器之间,在Zabbix服务器(代理)和Zabbix数据库之间。当前,每个加密的连接均以完整的TLS握手打开,未实现会话缓存和票证。添加加密会增加检查和操作的时间,具体取决于网络延迟。例如,如果数据包延迟为100毫秒,则打开TCP连接并发送未加密的请求大约需要200毫秒。通过加密,大约增加了1000 ms来建立TLS连接。可能需要增加超时,否则某些在代理上运行远程脚本的项目和操作可能会与未加密的连接一起工作,但会因加密而超时而失败。网络发现不支持加密。由网络发现执行的Zabbix代理检查将不加密,并且如果Zabbix代理配置为拒绝未加密的连接,则此类检查将不会成功

加密方式

Zabbix支持的加密方式有两种:

1.基于证书PSA的加密(常用与Zabbix_Proxy但不局限于Proxy)2.基于预共享密钥PSK的加密(常用与Zabbix_Agent但不局限于Agent)

支持的加密库

Zabbix支持以下四种加密库,不同的加密库有不同的功能

GnuTls:如果要使用GnuTLS方式加密,则GnuTLS版本必须高于或者等于3.1.18版本(支持基于证书PSA以及基于预共享密钥PSK两种加密方式)OpenSSL:支持版本(1.0.1、1.0.2c、1.1.0),OpenSSL1.1.1版本仅支持Zabbix3.0.23、3.4.15和4.0.1,但是OpenSSL1.0.1、1.0.2c版本在PSK加密方式中并不能完美支持保密性(OpenSSL加密库支持基于证书以及基于预共享密钥PSK两种加密方式)LibreSSL:LibreSSL为OpenSSL的替代品,在2014年OpenSSL被爆出心脏漏洞后,OpenSSL成立了LibreSSL重构了OpenSSL加密库的代码,并从2.0版本起跳,官方目前称不支持LibreSSL2.6x版本,通过了(LibreSSL2.7.4、2.8.2版本的测试),(LibreSSl不支持PSK的加密方式,只支持基于证书方式)mbed TLS:mbed TLS以前被称为PolarSSL,支持mbed TLS1.3.9版本和的1.3.9x,目前不支持mbed TLS 2版本,它不是1.3分支的完全替代,Zabbix不会用mbed TLS 2.x编译。(支持基于证书以及基于预共享密钥PSK两种加密方式)

配置方式: 在编译部署zabbix时添加以下参数 GnuTls: --with-gnutls[=DIR] OpenSSL: --with-openssl[=DIR] LibreSSL: --with-openssl[=DIR],因为LibreSSL基于OpenSSL所以Libre SSL也使用 --with-openssl选项 mbed TLS: --with-mbedtls[=DIR]

加密参数

TLSConnect 这个参数在Zabbix Server/Zabbix Proxy/Zabbix Agent配置文件中都存在,值有以下三个:unencrypted:不加密 PSK:PSK方式加密 cert:PSA方式加密 此参数仅用于在Zabbix_Proxy或者Zabbix_Agent在主动模式下到服务器的连接。

TLSAccept 这个参数同样在Zabbix Server/Zabbix Proxy/Zabbix Agent配置文件中都存在,值也有以下三个:unencrypted:不加密 PSK:PSK方式加密 cert:PSA方式加密 此参数仅用于在Zabbix_Proxy或者Zabbix_Agent在被动模式指定来自服务器的连接。

如果将Zabbix_Proxy或者Zabbix_Agent配置为PSA证书加密方式,那么Zabbix Proxy或者Zabbix_Agent只能配置为主动模式,来主动提交数据到Server,agent(active) or zabbix trapper。

密码套件

在Zabbix启动期间内部配置了密码套件,并且依赖于加密库,目前它们不是用户可配置的。

按照从高到低顺序的库类型配置密码:

Zabbix4.x如何安全传输数据
-w842

密码套件使用证书:

Zabbix4.x如何安全传输数据
-w1140

密码套件使用PSK:

Zabbix4.x如何安全传输数据
-w1042

使用PSK共享密钥加密

使用PSK共享密钥加密可以使用四种加密库,如上文所述,但文本只介绍常用的两种方式:GnuTLS进行PSK加密与OpenSSL进行PSK加密 Zabbix中的每个预共享密钥(PSK)实际上都是一对:

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

1)PSK身份字符串是非空的UTF-8字符串。例如,“代理的PSK ID 001 Zabbix”。这是Zabbix组件引用此特定PSK的唯一名称。请勿将敏感信息放在PSK身份字符串中-它将未经加密地通过网络传输。PSK值是很难猜测的十六进制数字字符串,例如“ e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9”。

注:Zabbix Web界面允许配置多达128个字符长的PSK身份字符串和2048位长的PSK,而与所使用的加密库无关。如果某些Zabbix组件支持较低限制,则用户有责任为这些组件配置PSK标识和值以及允许的长度,超过长度限制会导致Zabbix组件之间的通信失败

2)在Zabbix服务器使用PSK连接到代理之前,服务器会在数据库中(实际上是在配置缓存中)查找为该代理配置的PSK身份和PSK值。收到连接后,代理将使用其配置文件中的PSK标识和PSK值。如果双方具有相同的PSK标识字符串和PSK值,则连接可能会成功。用户有责任确保不存在两个具有相同标识字符串但值不同的PSK。否则,可能会导致使用带有此PSK标识字符串的PSK的Zabbix组件之间的通信意外中断。

GnuTLS基于PSK加密

1) 安装GnuTLS加密库 GnuTls加密库版本必须大于或者等于3.1.18

yum install gnutls.x86_64 gnutls-c++.x86_64 gnutls-dane.x86_64 gnutls-devel.x86_64 gnutls-utils.x86_64 -y
gnutls-cli --versiongnutls-cli 3.3.29

2) 编译部署Zabbix_Proxy

./configure --prefix=/usr/local/zabbix \--enable-proxy \--enable-agent \--enable-ipv6 \--enable-java \--with-sqlite3 \--with-net-snmp \--with-libcurl \--with-libxml2 \--with-zlib \--with-libevent \--with-libpcre \--with-iconv \--with-openipmi \--with-gnutls \--with-ssh2

3)生成密钥并设置权限

psktool -u psk_identity -p database.psk -s 32Generating a random key for user 'psk_identity'Key stored to database.psk
echo '5a504503a51fb29bfea62e4576808dd4258c5f8cd03928c90a04704464bbbbd8' > /usr/local/zabbix/etc/zabbix_agentd.conf.d/.zabbix_agentd.psk
chown -Rf zabbix.zabbix /usr/local/zabbix/etc/zabbix_proxy.conf.d/.zabbix_proxy.psk
chmod 600 /usr/local/zabbix/etc/zabbix_proxy.conf.d/.zabbix_proxy.psk

4)修改proxy配置

vim /usr/local/zabbix/etc/zabbix_proxy.conf TLSConnect=psk #在proxy主动模式下指定加密方式TLSPSKFile=/usr/local/zabbix/etc/zabbix_proxy.conf.d/.zabbix_proxy.psk #指定PSK文件TLSPSKIdentity=xxxxxxx #指定PSK名称,可自定义

5)在Zabbix Web界面添加 选中proxy后选择加密方式,填入信息

Zabbix4.x如何安全传输数据
-w987

6)配置agent加密 agent加密与上述一致,除了web界面配置如下

Zabbix4.x如何安全传输数据
-w981

OpenSSL基于PSK加密

以下只介绍OpenSSL与GnuTLS配置不一样的地方 1)编译配置

./configure --prefix=/usr/local/zabbix \--enable-proxy \--enable-agent \--enable-ipv6 \--enable-java \--with-sqlite3 \--with-net-snmp \--with-libcurl \--with-libxml2 \--with-zlib \--with-libevent \--with-libpcre \--with-iconv \--with-openipmi \--with-openssl= \ #指定加密库为Openssl,如果默认加密库版本不符合Zabbix要求,则安装符合要求的加密库后进行配置--with-ssh2

2)生成密钥

openssl rand -hex 32af8ced32dfe8714e548694e2d29e1a14ba6fa13f216cb35c19d0feb1084b0429

拿到Openssl生成的密钥后,下面的配置则与GnuTLS一致

使用PSA基于证书加密

证书加密非常复杂,需要去申请CA证书、签名证书以及密钥等,如果想了解证书加密请见官方:https://www.zabbix.com/documentation/current/manual/encryption/using_certificates


☆ END ☆