0x01 前言

因为我极少使用windows系统,所以不知道zabbix agent在windows上存在TLS无法使用的问题,直至网友给我留言,但我找到了解决办法。

0x02 BUG

依照我的文章(windows安装zabbix agents & 添加监控点)安装完zabbix agent后,在不启用TLS的情况下是可以正常启动服务的,可是在启用TLS的情况下(为zabbix服务配置数字证书加密通道),则出现以下错误:

比较坑的是,日志中居然没有任何错误记录。但通过CMD窗口启动则可以发现端倪。打开一个CMD窗口并手动运行zabbix agent:

从上面抛出的错误可以得知,官方预编译的zabbix agent并没有包含TLS相关模块:

 Zabbix agent was compiled without TLS support

那么最简单的方法是自行编译适用于windows并启用TLS的zabbix agent。

0x03 准备

我很少接触windows系统,所以对于在windows上编译软件这个工作,我是毫无头绪的。但我从zabbix的support页面中找到编译的过程:

根据这个教程中所描述的过程,我进行了一次实践,确认这个过程可以解决我们的问题,在这里我以64位为代表撰写教程。

在开始编译之前要准备以下内容:

以下是下载好的文件:

VC、openssl和cmake下载后直接安装即可,但在安装cmake的时候要注意选择将path应用到所有用户:

Add CMake to system PATH for all users

而pcre和zabbix源码只用一次,可以解压到任意位置。为了在cmd窗口中输入更少的字符,我放置在以下路径中:

C:\temp

安装完VS后,在开始菜单中找到以下内容:

如果编译32位和64位的应用分别使用以下工具:

  • x32:VS2015 x86 Native Tools Command Prompt
  • x64:VS2015 x64 Native Tools Command Prompt

在这里我使用64位的工具。

0x04 编译

0x04.1 pcre

先整合pcre,在pcre根目录中新建一个build文件夹并进入:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>cd c:\temp\pcre-8.41

c:\temp\pcre-8.41>mkdir build

c:\temp\pcre-8.41>cd build

先cmake:

c:\temp\pcre-8.41\build>cmake -G "Visual Studio 14 2015 Win64" -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -DPCRE_SUPPORT_UTF=ON -DCMAKE_C_FLAGS_RELEASE:string="/MT" ..

然后编译:

c:\temp\pcre-8.41\build>msbuild PCRE.sln /property:Configuration="Release"

最终结果只要没有错误即可,警告信息可以忽略。

0x04.2 修改文件

处理完pcre后进入zabbix源码目录,先修改以下文件:

C:\temp\zabbix-3.4.2\build\win32\project\resource.rc

将内容 #include "afxres.h
修改为 #include "windows.h"

然后修改以下文件:

C:\temp\zabbix-3.4.2\build\win32\project\Makefile_sender_dll

将内容 ..\..\..\src\zabbix_sender\win32\zabbix_sender.o
修改为 ..\..\..\src\zabbix_sender\zabbix_sender.o

0x04.3 编译agent

先进入相关文件夹:

C:\>cd C:\temp\zabbix-3.4.2\build\win32\project

然后运行nmake:

#64位
C:\temp\zabbix-3.4.2\build\win32\project>nmake CPU=AMD64 TLS=openssl TLSINCDIR="C:\OpenSSL-Win64\include" TLSLIBDIR="C:\OpenSSL-Win64\lib" PCREINCDIR="C:\temp\pcre-8.41" PCRELIBDIR="C:\temp\pcre-8.41\build\Release"

#32位
C:\temp\zabbix-3.4.2\build\win32\project>nmake CPU=i386 TLS=openssl TLSINCDIR="C:\OpenSSL-Win32\include" TLSLIBDIR="C:\OpenSSL-Win32\lib" PCREINCDIR="C:\temp\pcre-8.41" PCRELIBDIR="C:\temp\pcre-8.41\build\Release"

完成后即可在以下路径找到相关文件:

C:\temp\zabbix-3.4.2\bin\win64

0x04.4 openssl

最后还需要将openssl的几个动态链接库复制到zabbix agent文件目录中:

  • C:\OpenSSL-Win64\bin\msvcr120.dll
  • C:\OpenSSL-Win64\libcrypto-1_1-x64.dll
  • C:\OpenSSL-Win64\libssl-1_1-x64.dll

完成后的文件如下:

至此,所有编译工作均已完成。现在只需要将win64这个文件夹放置需要使用zabbix监控的windows系统中即可。

0x05 使用

首先将win64这个文件夹重命名并放置到适当位置,我选择的路径如下:

#agent路径
C:\zabbix_agents\bin\win64\zabbix_agentd.exe

#配置文件路径
C:\zabbix_agents\conf\zabbix_agentd.conf

#TLS配置信息
TLSConnect=cert
TLSAccept=cert
TLSCAFile=C:\zabbix_agents\crt\ca.crt
TLSCertFile=C:\zabbix_agents\crt\win10.t.com.crt
TLSKeyFile=C:\zabbix_agents\crt\win10.t.com.key

如果你已经安装过zabbix agent服务,那么需要先删除旧的服务。以管理员权限打开CMD窗口并输入以下内容即可删除旧服务:

sc delete "Zabbix Agent"

然后通过以下命令重新安装:

c:\zabbix_agents\bin\win64\zabbix_agentd.exe --config c:\zabbix_agents\conf\zabbix_agentd.conf -i

然后放置数字证书到指定位置,再打开服务窗口启动服务:

0x06 结语

希望zabbix官方在日后预编译时可以添加TLS模块,毕竟网络安全也挺重要的。