第十九章 数据加密通信
近日完成《深入浅出 zabbix 4.0》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.youkuaiyun.com/course/detail/24870
Zabbix 3.0中非常重要的一个特性就是支持对Zabbixserver、Zabbix proxy、Zabbix agent、zabbix_sender和zabbix_get之间的通信进行加密,支持Certificate-based(基于证书)和pre-shared key-based(基于预共享秘钥)的加密,不再像早期版本那样需要额外的解决方案。
Zabbix 3.0中加密是独立组件,作为配置选项进行配置时非常灵活,可以针对不同的hosts设置不同的加密方式。例如有些proxy 和agents配置使用Certificate-based加密和server之间的通信,有些使用pre-sharedkey-based加密,而另外一些没有配置加密。如下图19-1所示。
图 19-1
19.1编译Zabbix支持加密
Zabbix使用Transport LayerSecurity (TLS) protocol v1.2进行加密,为了让Zabbix支持加密功能,在源码编译安装时必须要链接到下面三个加密库中的其中一个。
-
mbed TLS:早期也叫PolarSSL,目前仅支持1.3.x版本。注意不支持2.x版本。
-
GnuTLS:支持v3.1.18及更高的版本。
-
OpenSSL:支持v1.0.1及更高的版本。
根据你的选择,configure脚本可以使用下面的某个选项:
-
--with-mbedtls[=DIR]
-
--with-gnutls[=DIR]
-
--with-openssl[=DIR]
例如:
# ./configure--enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp--with-libcurl --with-libxml2 --with-openssl
在编译安装Zabbix的不同组件时可以使用不同的加密库,例如server使用OpenSSL,agent使用GnuTLS。建议使用OpenSSL,在实际测试中OpenSSL是最快的,接下来是GnuTLS。
如果你使用安装包安装Zabbix组件时,默认已经支持加密功能。你可以通过查看日志文件确定Zabbix安装的功能特性。例如下面是Zabbixserver启动时显示的特性列表。
# vi/var/log/zabbix/zabbix_server.log
1065:20150817:103017.520****** Enabled features ******
1065:20150817:103017.520SNMP monitoring: YES
1065:20150817:103017.520IPMI monitoring: YES
1065:20150817:103017.520 Webmonitoring: YES
1065:20150817:103017.520VMware monitoring: YES
1065:20150817:103017.520SMTP authentication: YES
1065:20150817:103017.520Jabber notifications: YES
1065:20150817:103017.520 EzTexting notifications: YES
1065:20150817:103017.520ODBC: YES
1065:20150817:103017.520SSH2 support: YES
1065:20150817:103017.520IPv6 support: YES
1065:20150817:103017.520 TLSsupport: YES
1065:20150817:103017.520******************************
19.2 pre-shared keys加密
Zabbix中使用PSK(pre-shared key)加密时,需要提供标识符(PSKidentity)和加密字符串(PSK string)。PSK identity是一个非空的UTF-8字符串,例如PSK ID 001 zabbix agent,在这里仅仅作为一个特定PSK的名称,方便Zabbix中各组件的引用。由于PSK identity在网络中是明文传输,因此在名称中不要涉及到敏感信息。PSK string是由十六进制组成的字符串,例如e560cb0d918d26d31b4f642181f5f570ad89a390931102e5391d08327ba434e9。
19.2.1 长度限制
在Zabbix中使用PSK加密时,对PSK identity和PSK string长度是有限制的。在Zabbix前端页面中配置PSK identity的长度可以达到128个字符,PSK string的长度可以达到2048个bit,但也要看使用的加密库的限制。如果配置的字符串长度超过限制会导致Zabbix各组件之间通信失败。
例如Zabbix server使用PSK连接到agent之前,server会在数据库中查找agent配置的PSK identity和PSK string,当收到agent配置的PSK identity和PSK string后进行比较,如果双方具有相同的PSK identity和PSK string时将成功连接。
长度限制的参数如下表19-1所示。
表 19-1
组件 |
PSK identity最大长度 |
PSK string最小长度 |
PSK string最大长度 |
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) |
GnuTLS |
128 bytes (may include UTF-8 characters) |
-- |
2048-bit (256-byte PSK, entered as 512 hexadecimal digits) |
mbed TLS |
128 UTF-8 characters |
-- |
256-bit (default limit) (32-byte PSK, entered as 64 hexadecimal digits) |
OpenSSL |
127 bytes (may include UTF-8 characters) |
-- |
2048-bit (256-byte PSK, entered as 512 hexadecimal digits) |
19.2.2 PSK生成
在CentOS中可以使用不同的工具生成PSK,下面就以生成一个256-bit(32字节)PSK为例来看一下。
-
使用OpenSSL
# openssl rand -hex 32
3e2b2ef85c2ad0af3410c9a495fe77d0a8741c2f1243c2af73a2e17623f70098
-
使用GnuTLS
# yum install gnutls-utils
# psktool -u psk_identity -p mypsk.psk -s 32
Generating arandom key for user 'psk_identity'
Key stored to mypsk.psk
# cat mypsk.psk psk_identity:9b8eafedfaae00cece62e85d5f4792c7d9c9bcc851b23216a1d300311cc4f7cb
使用psktool工具时会生成一个文件,格式为pskidentity:psk string,在Zabbix中使用该文件时需要把psk identity:删除,只保留psk string。
19.2.3 配置实例
19.2.3.1 配置server和agent之间使用PSK
配置步骤:
1、 在agnet主机中,将PSK string保存到一个文件中。例如 /etc/zabbix/zabbix_agentd.psk。
# vi /etc/zabbix/zabbix_agentd.psk
3e2b2ef85c2ad0af3410c9a495fe77d0a8741c2f1243c2af73a2e17623f70098
2、 设置zabbix_agentd.psk文件的访问权限。
# chown zabbix:zabbix /etc/zabbix/zabbix_agentd.psk
# chmod 644 /etc/zabbix/zabbix_agentd.psk
3、 编辑zabbix_agentd.conf配置文件。
# vi /etc/zabbix/zabbix_agentd.conf
TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk
TLSPSKIdentity=PSKAgent
如果agnet类型为active(主动式)agent,那么agent将连接到server并接收来自server和zabbix_get使用PSK加密的连接,PSK identity为PSK Agent。
4、 重启agent,使用zabbix_get进行测试。