1. 安装准备
Zabbix4.0对基础架构有一定的要求,尤其是对PHP和MySQL:
2. 安装环境
Zabbix Server运行在CentOS上,Zabbix Agent可以运行主流的操作系统上,本文档的安装环境为:
3. 安装配置Zabbix Server
3.1. 安装Zabbix Server
首先,获取Zabbix官方的YUM源:
值得注意的是,官方的Yum源文件版本可能随时更新,本文列出的地址如果无法下载,可以到官方的主站寻求最新的版本:http://repo.zabbix.com/zabbix/
其次,获取epel官方的YUM源:
值得注意的是,官方的Yum源文件版本可能随时更新,本文列出的地址如果无法下载,可以到官方的主站寻求最新的版本:http://ftp.cuhk.edu.hk/pub/linux/fedora-epel/7/x86_64/Packages/e/
shell> rpm -ivh http://ftp.cuhk.edu.hk/pub/linux/fedora-epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
然后,安装依赖包:
shell> yum install httpd php php-mysql php-gd php-bcmath php-common php-xml php-mbstring php-cli
Zabbix 需要的 PHP 扩展库:
- php-mysql:使用MySQL作为Zabbix后端数据库所需要的组件;
- php-gd:PHP GD扩展库必须支持 PNG 图像(--with-png-dir)、JPEG 图像 (--with-jpeg-dir)和FreeType2(--with-freetype-dir);
- php-bcmath:包含所需的bcmath;
- php-common:包含所需的ctype和php-session扩展;
- php-xml:包含所需的libXML、xmlreader和xmlwriter扩展。
- php-mbstring:包含所需的mbstring扩展。
shell> yum install pcre glibc gcc livevent zlib libcurl-devel curl-devel OpenIPMI-devel libssh2 fping net-snmp-devel perl-DBI openssl-devel iksemel libxml2 ntp
Zabbix 需要的依赖包:
- pcre:为强制安装的包。用来支持Perl Compatible Regular Expression(PCRE);
- gcc:为强制安装的包。即编译器,
- glibc:为强制安装的包。即libc运行库,其中包含了所需的Libpthread
- libevent:为强制安装的包,用来支持 IPMI;
- zlib:为强制安装的包。用来支持压缩;
- libcurl-devel、curl-devel:为可选安装包,但建议安装。用来支持 Web 监控;
- OpenIPMI-devel:为可选安装包,按需安装。用来支持IPMI监控;
- libssh2:为可选安装包。用来支持SSH功能;
- fping: 为可选安装包,但建议安装。用来支持ICMP Ping监控;
- net-snmp-devel:为可选安装包,按需安装。用来支持SNMP监控;
- iksemel:为可选安装包,按需安装。用来支持 Zabbix 报警媒介 Jabber;
- libxml2:为可选安装包,按需安装。用来支持 VMware 监控;
- ntp:为可选安装包,但强烈建议安装。用来保持 Zabbix 精准的时间。
最后,安装Zabbix-Server。
shell> yum install zabbix-agent zabbix-server-mysql zabbix-web-mysql zabbix-get zabbix-web
Zabbix 服务端上的安装包:
- zabbix-agent:为可选安装包,但在 Zabbix Server 上建议安装。Zabbix 客户端代理程序;
- zabbix-server-mysql、zabbix-web-mysql:为强制安装的包。前者用来存放采集到的数据,后来为前端所需;
- zabbix-get:为可选安装包,但在 Zabbix Server 上建议安装。Zabbix 用来手动采集数据的命令;
- zabbix-web:为可选安装包,但在 Zabbix Server 上建议安装。Zabbix用来监控 Web 服务的。
- zabbix-java-gateway:为可选安装包,按需安装。Zabbix 的 JAVA 采集服务端,用于 JMX 的监控方式。
Zabbix 客户端上的安装包:
- zabbix-agent:为强制安装包。Zabbix 客户端代理程序;
- zabbix-sender:为可选安装包,但强烈建议安装。Zabbix agent 向 Zabbix server 手动发送数据的命令;
- zabbix-proxy-mysql:为可选安装包,按需安装。Zabbix proxy 是 Zabbix 代理服务的程序,适用于分布式监控环境。
3.2. 安装数据库(PerconaDB 5.7)
首先,获取PerconaDB官方的YUM源:
值得注意的是,官方的Yum源文件版本可能随时更新,本文列出的地址如果无法下载,可以到官方的主站寻求最新的版本:https://www.percona.com/downloads/percona-release/redhat/
shell> yum install https://www.percona.com/redir/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
其次,通过YUM方式安装PerconaDB 57。
再次,修改PerconaDB的配置文件。
值得注意的是:
- 如果修改socket的文件位置,那么 Zabbix 配置文件中DBSocket=参数也需要修改,单方面修改的话 Zabbix 会提示连接不到数据库;
- 原则上 innodb_buffer_pool_size 需要设置为主机内存的 80% ;
然后,初始化数据库:
最后,在Percona里面创建Zabbix数据库,并修改权限。
3.3. 配置NTP时间同步
Zabbix Server对时间的精确要求比较高,时间对数据的计算等都有影响。因此,可以自建NTP服务器,或同步网络时间。如下,使用Crontab同步网络时间。
3.4. 导入数据库
首先,获取Zabbix的数据库。
最后,使用Percona来Zabbix的初始数据库schema和数据。
3.5. 禁用Selinux以及按需禁用或者配置防火墙
防火墙可以按需配置,可以暂时关闭,后面再进行配置,但 Selinux必须关闭,否则后面启动Zabbix server的时候会报错。
3.6. 修改Zabbix Server的配置文件
在zabbix_server.conf中有很多参数需要修改,此时先将Zabbix连接Percona的信息配置好,包括先前创建的数据库、其用户名和密码。需要注意的是,这里的参数必须和之前创建数据库的信息一致,否则后面运行Zabbix server时会有无法连接到数据库的报错。
3.7. 配置PHP
首先,Zabbix需要修改PHP的时区。
最后,适当修改一些PHP配置文件的参数。
3.8. 修改Web显示文字为微软雅黑
首先,将微软雅黑的字体msyh.ttf上传到/usr/share/zabbix/fonts/目录下:
最后,修改配置文件使用微软雅黑字体。
将代码区第 2 行和第 3 行的graphfont改为上传的中文字体,本例使用的字体为msyh(代码区内容所在为63行和108行, vi设置了set=number)。
3.9. 配置Apache
首先,设置HTTPD开机自启。重启并访问Apache的默认页面。
然后,为了安全起见,可以删除Apache测试页面。
最后,同样地,为了安全起见,禁用Apache的目录列表配置。在Apache的配置文件中找到该行,将该行中的Indexes去掉,并重启进程。
3.10. 启动Zabbix
启动zabbix-agent和zabbix-server,并将其添加到开机自启动。
4. 配置Zabbix Web管理页面
首先,浏览器键入http:IP/zabbix,点击Next step进行下一步;
其次,会出现检查PHP配置的页面。此前PHP已修改了相应参数,点击Next step进行下一步:
再次,会出现配置zabbix数据库的页面。其中Database host由localhost修改为127.0.0.1,Database port默认,Database name、User、Password为之前建立数据库的数据库名和用户名密码, 点击Next step进行下一步;
此页默认不需要修改,直接点击Next step进行下一步;
然后,会出现配置信息汇总页面,待确认无误后点击Next step进行下一步;
点击Finish完成安装。
最后,完成配置,进入登录界面,输入默认的用户名Admin和密码zabbix,点击Sign in登录。
值得注意的是:如果此后需要修改,可以通过http://ip/zabbix/setup.php地址进行重新配置。
5. 升级Zabbix
5.1. 主要版本间的升级
首先,主要版本间的升级,需要先阅读官方的升级说明,再进行升级。
其次,备份Zabbix数据库。
再次,备份Zabbix Server的配置文件、PHP文件和Zabbix二进制文件。
然后,更新新版的Zabbix官方YUM,并通过YUM UPGRADE进行升级。
最后,待更新完成后, 重新修改中文字体(每次更新后必须修改)。
将代码区行的graphfont改为上传的中文字体。
5.1.1. Zabbix 3.2升级至Zabbix 3.4
首先,停止Zabbix Server和Zabbix agent
其次,备份数据库、Zabbix Server的配置文件、PHP文件和Zabbix二进制文件。
再次,卸载当前的Zabbix 3.2版本。
然后,安装Zabbix 3.4。
恢复之前的Zabbix配置文件
重新配置下Zabbix前端的配置文件
最后,启动Zabbix3.4,并检查数据库的升级日志。
5.1.2. Zabbix 3.4升级至Zabbix 4.0
5.2. 次要版本升级
如果要升级Zabbix的次要版本(例如,从 4.0.1 升级至 4.0.3),是非常容易的:
shell> yum upgrade zabbix*
待升级完成后,重新修改中文字体(每次更新后必须修改)。
将代码区行的graphfont改为上传的中文字体。
6. 安装配置Zabbix Agent
6.1. 获取Zabbix Agent
从Zabbix Download获取下载地址:
下载地址: https://www.zabbix.com/download
6.2. 安装配置Linxu Agent
在CentOS上安装Zabbix agent,可以通过YUM安装直接安装RPM包,还可以通过源码编译安装,在Zabbix 3.4版本之前,官方还提供Precompiled agents介质,下面使用YUM直接安装:
首先,客户端添加官方YUM,并通过YUM安装Zabbix agent:
然后,按需根据修改配置文件:
最后,配置防火墙,启动Zabbix agent,并配置开机自启:
6.3. 安装配置AIX Agent
在AIX上安装Zabbix agent,有两种安装方式。一种为从官网下载预编译好的介质(Precompiled agents)进行安装,另一种是通过源码包编译安装。
值得注意的是,Zabbix agent已从3.0LTS版本开始便不再支持AIX 6.1之前的版本,建议在AIX低版本使用对应的Zabbix agent版本,其对应版本支持如下:
6.3.1. 预编译文件安装AIX Agent
首先,从官网下载页面下载预编译好的介质(Precompiled agents),并解压到目标位置,解压目标位置可以根据需要决定。
其次,添加Zabbix用户和用户组:
再次,将配置文件和agent二进制进程文件复制到指定目录下:
根据当前环境修改配置文件:
然后,添加随系统开机自启动(AIX6.1),需要将对应的Zabbix Agent的源码包下载下来zabbix-2.4.8.tar.gz,待解压后,将目录zabbix-2.4.8\misc\init.d\aix下zabbix_agentd文件拷贝到/etc/rc.d/rc2.d下:
最新,增设相应权限,并启动Zabbix agent进程。
6.3.2. 通过源码文件安装AIX Agent
通过源码文件编译安装,需要先解决依赖包,待所有依赖包安装完成后,即可编译安装Zabbix agent。
6.4. 安装配置Windows Agent
首先,在Windows上安装Zabbix agent,从官网下载预编译好的介质(Precompiled agents),并解压到目标位置,解压目标位置可以根据需要决定,下代码区为Windows上的Zabbix agent目录文件结构:
其次,修改zabbix_agentd.win.conf配置文件,其中LogFile是日志存放的位置,Server为Zabbix Server的地址,ServerActive为开启主动模式并配置Zabbix Server的地址, Hostname为本地客户端的主机名或IP地址。
然后,执行安装命令进行安装。其中,-i参数为安装指令,-c参数为执行配置文件的目,-s为启动Zabbix agent服务。
最后,zabbix_agentd.exe还有更多的命令语法,建议通过--help参数进行查看:
7. 官方系统模板的扩展
7.1. Windows计数器键值
7.2. 监控Linux&AIX&Windows用户登录
7.2.1. 监控Linux用户登录
关于监控Linux用户登录,是利用Zabbix自带的日志监控功能监控Linux的/var/log/secure日志,当有用户登录失败或者用户在非常规时间登录成功时触发告警。
首先,使用Zabbix提供的键值'log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]'来监控Linux的/var/log/secure文件。先介绍下这个键值:
该监控项类型是Zabbix agent(active),返回数据类型是Log。Zabbix agent需要对监控的日志文件有可读权限,否则会返回unsupported。
参数介绍:
- file:日志文件的全路径;
- regexp:过滤日志的正则表达式;
- encoding:字符编码,默认为英文单字节SBCS(Single-Byte Character Set);
- maxlines:agent 每秒发送给 server(或proxy)的数据的最大行数,这个参数会覆盖掉zabbix_agentd.conf配置文件里的'MaxLinesPerSecond'参数;
- mode:可选填参数,即all(默认)或skip(跳过旧数据);
- output:自定义格式化输出,。默认输出regexp匹配的整行数据。转义字符'\0'表示regexp匹配的数据,转义字符'\N'(N=1..9)表示regexp里第N个分组匹配到的数据。如果填其他字符串就会覆盖掉regexp匹配的数据。
其次,在Linux模版Template_OS_Linux_Chinese下增加登录审核的监控项:
项目名称:用户登录审核
类型:Zabbix端点代理程式(主动式)
键值:log[/var/log/secure,"(Accepted|Failed) password",,,skip,]
数据类型:日志
数据库更新间隔(秒):60
历史数据存储日期:90
应用集:security
注意:正则表达式为"(Accepted|Failed) password",过滤/var/log/secure中的正确或失败的用户登录请求(这里只过滤密码验证方式的登录)。
创建登录失败的触发器:
名称:用户登录失败在主机{HOST.NAME}
表达式:{Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Failed)}=1 and {Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0
严重性:警告
该表达式含义为:如果用户登录失败了,监控项返回的数据中会包含Failed,则触发器被触发。如果在60秒内没有接收新数据的话,则触发器恢复,这样就能保证触发器不会一直在触发状态。
下面把表达式拆解分析:
A:{Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Failed)}=1,表示如果字符串中包含`Failed`则表达式为真;
B:{Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0,表示如果60秒内有接收数据则表达式为真,反之则表达式为假。
逻辑为 A and B,表示同时符合 A 和 B 两个条件(同时为真),触发器才会触发。
再次,创建登录成功的触发器:
名称:用户于非工作时间登录成功在主机{HOST.NAME}
表达式:{Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Accepted)}=1 and {Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0 and ({Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}<080000 or {Template_OS_Linux_Chinese:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}>200000)
严重性:警告
该表达式的含义为:晚上 20 点到早上 8 点之间如果有用户登录成功了,且监控项返回数据中会包含Accepted,则触发器被触发,如果60秒内没有接收到新数据的话,则触发器恢复。
下面把表达式拆解分析:
A:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].str(Accepted)}=1。表示如果字符串中包含`Accepted`则表达式为真;
B: {Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].nodata(60)}=0。表示如果 60 秒内有接收到数据则表达式为真,反之则表达式为假。
C:{Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}<080000。表示当前时间小于 8 点(08:00:00)则表达式为真;
D: {Template OS Linux:log[/var/log/secure,"(Accepted|Failed) password",,,skip,].time(0)}>200000。表示当前时间大于晚上 8 点(20:00:00)则表达式为真。
逻辑为 A and B and(C or D)。表示 A 和 B 要同时为真且 C 和 D 只要一个为真,则整个表达式为真,触发器才会触发。
然后,因为监控日志需要Agent为主动模式,那么在Agent上需要额外配置ServerActive参数。在配置文件zabbix_agentd.conf的ServerActive参数定义了Zabbix Server的地址和端口。
同时,需要修改/var/log/secure被监控文件的权限,/var/log/secure默认权限为600,需要增加用户zabbix的可读权限,命令如下:
shell> setfacl -m u:zabbix:r-- /var/log/secure
最后,修改logrotate配置。
shell> sed -i '/kill/a\/usr\/bin\/setfacl -m u:zabbix:r-- \/var\/log\/secure' /etc/logrotate.d/syslog
7.2.2. 监控AIX用户登录
由于在AIX系统上的局限性,用户登录审核日志位于/etc/securrity/failedlogin(登录失败)和/var/adm/wtmp(登录成功)文件中,并且读取这两个文件得用who命令读取,显然Zabbix自带的日志监控无法满足需求,只能通过UserParameter自定义key来获取。
首先,参照两个文件的输出内容,可以看到登录信息记录均为单行,不会跨行,是以每行记录一次用户登录行为,那么可以统计这个文件的行数来达到需求:
其次,在确定了监控思路的情况下,可以着手在Agent上自定义key:
再次,由于AIX的权限控制比较严格,Agent上的Zabbix用户无法读取这两个系统文件,只能通过安装sudo来完成读取操作,并配置sudo,增加丢两个文件的who命令执行权限:
从次,在Zabbix Server端增加监控项,监控项为在agent上定义好的自定义key:
用户登录成功监控项:
名称:用户登录成功信息
类型:Zabbix代理
键值:aix.acceptedlogin
数据类型:数字的(无正负)
数据类型:十进位数字
数据更新间隔(秒):60
应用集:Security
用户登录失败监控项:
名称:用户登录失败监控项目
类型:Zabbix代理
键值:aix.failedlogin
数据类型:数字的(无正负)
数据类型:十进位数字
数据更新间隔(秒):60
应用集:Security
最后,创建其触发器:
创建用户登录成功触发器:
名称: 用户于非工作时间登录成功在主机{HOST.NAME}, 请登录系统进行检查
表达式: {Template_OS_AIX_Chinese:aix.acceptedlogin.change(0)}<>0 and {Template_OS_AIX_Chinese:aix.acceptedlogin.nodata(60)}=0 and ({Template_OS_AIX_Chinese:aix.acceptedlogin.time(0)}<080000 or {Template_OS_AIX_Chinese:aix.acceptedlogin.time(0)}>200000)
严重性: 警告
该表达式的含义为:在晚上 20 点到早上 8 点之间如果有用户登录成功了,且监控项返回数据acceptedlogin与上次采集的值发生变化,且在 60 秒内有新数据产生的话,则触发触发器,反之触发器恢复。基本思路和 Linux 登录监控触发器思路相同。
创建用户登录失败触发器:
名称:用户登录失败在主机{HOST.NAME}, 请登录系统进行检查
表达式:{Template_OS_AIX_Chinese:aix.failedlogin.change(0)}<>0 and {Template_OS_AIX_Chinese:aix.failedlogin.nodata(60)}=0
严重性:一般严重
该表达式的含义为:如果监控项返回数据failedlogin与上次采集的值发现变化,且在 60 秒内有新数据产生的话,则触发触发器,若在 60 秒内没有新数据的话,触发器恢复。基本思路和Linux登录失败触发器思路相同。
7.2.3. 监控Windows用户登录
关于Windows用户的登录日志,全部记录在事件管理器中。根据事件管理器中的记录,在Windows模版新建登录成功和失败监控项:
首先,参照在事件管理器中的用户登录成功审核记录,创建对应登录成功的监控项:
名称:Windows Users Login Successful
类型:Zabbix端点代理程式(主动式)
键值:eventlog[Security,,"Success Audit",,^4624$,,skip]
数据类型:日志
数据更新间隔(秒):30
应用集:Login
该监控项中,类型选择Zabbix agent(active)、数据类型选择Log、监控间隔60秒。其中,监控项Key的参数用大括号包裹,用逗号分隔,下面解释各项参数的含义:
- Security:事件的日志名称:
- Success Audit:事件的Severity;
- ^4624$:这是一个正则表达式,匹配事件ID等于4624的日志;
- skip:该含义是不监控已产生的历史日志,如果省略skip,会监控所有符合以上条件的历史日志信息。
其次,参照在事件管理器中的用户登录失败审核记录,创建对应登录失败的监控项:
名称:Windows Usesr Login Failure
类型:Zabbix端点代理程式(主动式)
键值:eventlog[Security,,"Failure Audit",,^4625$,,skip]
数据类型:日志
数据更新间隔(秒):60
应用集:Login
从次,创建登录成功的触发器:
名称:Windows Users Login Successful On {HOST.NAME}
表达式:{Template_OS_Windows_Chinese:eventlog[Security,,"Success Audit",,^4624$,,skip].nodata(60)}=0 and {Template_OS_Windows_Chinese:eventlog[Security,,"Success Audit",,^4624$,,skip].str(Advapi)}=0
严重性:资讯
表达式的含义为: 如果在60秒内有监控到数据, 并且监控内容不包含字符串Advapi则触发告警, 如果60秒内没有新的数据了, 则触发器恢复正常; 简单点说就是, 用户登录后触发器触发至少会持续60秒, 如果用户不断的登录成功, 间隔小于60秒, 则触发器一直是problem状态.
然后,创建登录失败的触发器:
名称:Windows Users Login Failure On {HOST.NAME}
表达式:{Template_OS_Windows_Chinese:eventlog[Security,,"Failure Audit",,^4625$,,skip].nodata(60)}=0 and {Template_OS_Windows_Chinese:eventlog[Security,,"Failure Audit",,^4625$,,skip].str(Advapi)}=0
严重性:警告
表达式的含义为: 如果在60秒内有监控到数据, 并且监控内容不包含字符串Advapi则触发告警, 如果60秒后没有新的数据了, 则触发器恢复正常; 如果有人不断的恶意破解登录密码, 你会发现触发器problem状态会一直存在.
8. 异常处理
8.1. 按时间删除Zabbix历史数据
首先,停止Zabbix Server,获取其缩减时间点的时钟:
然后,修改MySQL的参数,使Innodb引擎支持缩减,并重启MySQL:
最后,使用先前获取的时钟去清理Zabbix的历史数据:
8.2. 消息队列堆积
首先,停止Zabbix Server。
shell> systemctl stop zabbix_server
然后,连接数据库,执行以下语句:
SQL> update alerts set status=2,error='' where status=0 and alerttype=0;
SQL> delete from escalations;
最后,重新启动Zabbix Server。
shell> systemctl start zabbix_server
篇幅所限,本文中代码多以截图呈现,如需要复制部分代码或有相关技术问题,请点击本文末的阅读原文,到社区原文浏览交流。