使用Python实现批量启用或禁用zabbix的告警动作

使用Python实现批量启用或禁用zabbix的告警动作

前言

当你的企业的zabbix系统用了很多年之后肯定是积攒下来少说十几个多则几十个zabbix告警动作,由于历史原因经常有一半被永远禁用了,但是你又不敢随意的删掉它们,这样每次维护监控在禁用之前的时候你就需要记下来哪些是启用的,然后再在维护完之后小心翼翼的全部启用,确保一个不落,但是人的眼睛总是会走神,难免会有遗漏,即使是有双人复核恐怕也不能幸免。本文实现了用Python脚本批量一次性禁用和启用,原理就是提前把这些告警动作id多次或N次反反复复复核后写到配置文件里面,然后用Python脚本调用zabbix的rest api来批量操作。

实战

在当前目录新建logs目录,

$ mkdir logs

新建一个配置文件模块conf.py,如下:

action_id_list = ['11', '12', '13', '14', '15', '16', '17', '...']

上面这些id可以在点开每个告警动作的配置页面,然后在页面的url里面有个actionid=的查询字符串,等号后面就是id,自己记下来然后写入上述配置模块中。

下面直接上脚本:

#!/usr/bin/env python
# encoding=utf-8

import logging
import argparse
import requests
import time
from conf import action_id_list
import json
import sys

def logger_getter():
    today = time.strftime("%Y-%m-%d", time.localtime())
    logger = logging.getLogger() …
阅读更多
实战用vuls漏洞扫描器对Linux系统和Python项目进行扫描和审计

实战用vuls漏洞扫描器对Linux系统和Python项目进行扫描和审计

前言

因为我用的腾讯云vps托管过开源的bitwarden服务端和enpass用的webdav服务,所以对安全这一块比较重视,腾讯云的安全扫描这块收费比较贵以及好像不支持业务代码的漏洞扫描,比如Django项目,所以就想到了找一个开源的漏洞扫描器,一番调研,选择了vuls。

安装

# mkdir -p /root/vuls
# cd /root/vuls
# wget https://raw.githubusercontent.com/vulsio/vulsctl/master/install-host/install.sh
# bash install.sh

执行上述命令进行安装,耗时较久,请耐心等待。

下载漏洞数据库,下面以CentOS为例:

# wget https://raw.githubusercontent.com/vulsio/vulsctl/master/install-host/oval.sh
# bash oval.sh --redhat

配置文件参考:

[root@VM-8-9-centos vuls]# cat config.toml 
[servers]

[servers.localhost]
host = "localhost"
port = "local"
# 配置扫描Django项目漏洞
lockfiles = [
  "/root/DjangoBlog/requirements.txt",
]
# 配置排除扫描某些以java开头的rpm包
ignorePkgsRegexp = ["^java"] …
阅读更多
实现在自动发布前后禁用或启用zabbix触发器

实现在自动发布前后禁用或启用zabbix触发器

背景

正常来讲,我们在自动化发布的过程中难免会造成告警风暴,那么我们可以做些什么来规避这个问题呢,一个比较简单的方式就是在发布前禁用掉zabbix的触发器,发布完再启用,本篇博客就是在这个背景下进行创作的,本次用到的脚本如下所示:

 ~/Downloads/tmp  tree                       
.
├── main.py
├── zhtrigfinder.py
└── ztrigswitcher.py

0 directories, 3 files

代码分两块,一个是main.py,一个是github上的开源脚本zhtrigfinder.py和ztrigswitcher.py,仓库名叫q1x/zabbix-gnomes,感谢,该仓库年久失修,为了防止失联本人fork了一下,也在下面把源码直接贴了出来,请把两块代码放到同一级目录。

整个项目依赖python2,主要是这个七八年前的上古开源脚本zhtrigfinder.py和ztrigswitcher.py也依赖python2。

依赖安装

python2 -m pip install pyzabbix==1.0.0 requests==2.26.0

使用

上述脚本的后两个脚本依赖一个下面格式的配置文件:

[Zabbix API]
     username=johndoe
     password=verysecretpassword
     api=https://zabbix.mycompany.com/path/to/zabbix/frontend/
     no_verify=true

主代码main.py命令行参数如下:

 ~/Downloads/tmp  python main.py -h
usage: main.py [-h] [-k KEYWORDS] [-D] [-E]

A wrapper for zabbix …
阅读更多
基于Golang的chromedp库实现获取Hostloc的每日热帖

基于Golang的chromedp库实现获取Hostloc的每日热帖

背景

关于获取Hostloc的每日热帖推送的话题,本站已经写了两篇博客阐述了,分别是你想收到hostloc每日热帖的邮件么?以及如何越过Hostloc的防CC攻击机制获取其每日热帖,虽然这两个都是Python脚本,但是前者仅仅是一个简单的Python脚本,无法应对后来新增的防CC机制,而后者中的脚本很好的解决了这个问题,但是本篇博客用一种全新的思路来解决这个问题,具体就是用了一个把chrome的cdp协议封装成golang对象的库chromedp来调用无头的chrome浏览器来访问loc站点。

依赖

下面的脚本依赖了以下第三方github库,编译前自己安装一下。

"github.com/anaskhan96/soup"
"github.com/chromedp/chromedp"
"github.com/emersion/go-sasl"
"github.com/emersion/go-smtp"

代码

package main

import (
	"context"
	"encoding/base64"
	"fmt"
	"os"
	"runtime/debug"
	"strconv"
	"strings"
	"time"

	"github.com/anaskhan96/soup"
	"github.com/chromedp/chromedp"
	"github.com/emersion/go-sasl"
	"github.com/emersion/go-smtp"
)

func mailSend(mailBodyText string) {
	currentDate := time.Now().Format("2006-01-02")
	subject := fmt.Sprintf("%s Hostloc今日热帖", currentDate)
	subjectBase := base64.StdEncoding.EncodeToString([]byte(subject))
	from := ""
	to := …
阅读更多
如何越过Hostloc的防CC攻击机制获取其每日热帖

如何越过Hostloc的防CC攻击机制获取其每日热帖

背景

很早之前写过一篇叫 你想收到hostloc每日热帖的邮件么?的博客,但是没过多久这个就失效了,因为hostloc站点加了防CC攻击的机制,导致无法直接获取其网页源码了,下面分享一个可以越过防CC攻击的脚本,注意本脚本仅用来自用推送loc的热帖给自己,请不要用于其它用途。

依赖

pyaes==1.6.1
beautifulsoup4==4.10.0
html5lib==1.1

代码

import re
import textwrap
import requests
import time
import smtplib
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
from pyaes import AESModeOfOperationCBC
from requests import Session as req_Session

HOST = 'smtp.qq.com'
PORT = 587
SENDER = ''
RECEIVER = ''
PWD …
阅读更多
zabbix触发器禁用后未启用审计

zabbix触发器禁用后未启用审计

场景

目前的例行发布做了发布前自动屏蔽触发器,发布后恢复的操作,由于有时候发布过程中某一步失败了,人工介入处理之后整个发布流程没有继续走完就会导致触发器未恢复。

代码

代码分两块,一个是main.py,一个是github上的开源脚本zhtrigfinder.py,仓库名叫q1x/zabbix-gnomes,感谢,该仓库年久失修,为了防止失联本人fork了一下,也在下面把源码直接贴了出来,请把两个代码放到同一级目录。

整个项目依赖python2,主要是这个七八年前的上古开源脚本zhtrigfinder.py也依赖python2。

脚本依赖安装如下:

python2 -m pip install pyzabbix==1.0.0 requests==2.26.0

这两个脚本公用一个配置文件,格式如下:

[Zabbix API]
     username=johndoe
     password=verysecretpassword
     api=https://zabbix.mycompany.com/path/to/zabbix/frontend/
     no_verify=true

所以主代码main.py的运行方式如下:

python main.py -c zbx_prod.conf

另外,主代码中你只需要修改企业微信的群组chat_id和机器人公网请求地址,此外修改一下operation_dictoperation_dict这个字典中的zabbix agent的ip和触发器中关键字就行。

main.py代码如下:

# -*- encoding: utf-8 -*-
import subprocess
import argparse
import ConfigParser
import os
import os.path
import sys
import distutils.util
import requests
import json …
阅读更多
审计Zabbix模板自动发现规则是否报错

审计Zabbix模板自动发现规则是否报错

话不多说直接上脚本,自用的话替换一下脚本里面的API地址以及zabbix的用户名和密码即可。

#!/usr/bin/env python
# encoding=utf-8

import datetime
import json
import time

import requests


def getToken(url, post_headers, url_user, url_password):
    post_data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": url_user,
            "password": url_password
        },
        "id": 1
    }
    ret = requests.post(url, data=json.dumps(post_data), headers=post_headers)
    return json.loads(ret.text).get("result")


def timestamp_to_string(timestamp):
    # 转换成localtime
    time_local = time.localtime(timestamp)
    # …
阅读更多
检查RabbitMQ队列是否堵塞的Python脚本

检查RabbitMQ队列是否堵塞的Python脚本

啥也不说了,上脚本之前先说一下有种做成zabbix自动发现的方案不是很合适,因为线上的集群动不动就几千个queue,这样生成的zabbix监控项太多,综合各方面考虑都不是很合适,下面的方案是把结果写到文件里面,然后配置个让zabbix agent定时去扫关键字的模板,具体怎么弄就不赘述了,直接上我们的Python脚本哦。

# -*- coding: utf-8 -*-
import re
import subprocess
list_vhost_cmd = "/sbin/rabbitmqctl list_vhosts |grep -v 'Listing vhosts'"
list_vhost_result = subprocess.check_output(list_vhost_cmd, shell=True).strip().split('\n')
no_exception_count = 0
with open('./results.txt', 'w') as f:
    for vhost in list_vhost_result:
        list_queue_cmd = "/sbin/rabbitmqctl list_queues -p {0} |grep -Ev 'Listing queues|Timeout:|name\tmessages'".format(vhost)
        try:
            list_queue_result = subprocess.check_output(list_queue_cmd, shell=True).strip().split('\n') …
阅读更多