钉钉群组实现监控Github的CVE信息

通过钉钉群组进行监控Github中CVE-2022相关信息,实现机器人消息推送。

一、数据库信息

创建mysql数据库cvemonitor,将sql文件导入数据库,sql语句如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for github_monitor

-- ----------------------------

DROP TABLE IF EXISTS `github_monitor`;
CREATE TABLE `github_monitor`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cve_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `cve_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `cve_description` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `cve_name`(`cve_name`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

二、监控脚本

注意:脚本需要执行权限 chmod 777 cve_run.sh

import requests
import json
import dingtalkchatbot.chatbot as cb
import time
import pymysql

# 连接数据库
conn = pymysql.connect(host="数据库主机IP", user="数据库账户名", password="数据库密码", database="数据库名",charset="utf8")
# 设置钉钉群组机器人webhook值和secukey值
webhook = '此处填写钉钉智能群助手自定义机器人的webhook'
sckey = '此处填写钉钉智能群助手自定义机器人的密钥'

def dingding(text, msg,webhook,secretKey):
    ding = cb.DingtalkChatbot(webhook, secret=secretKey)
    ding.send_text(msg='{}\r\n{}'.format(text, msg), is_at_all=False)

def check(cve_name,url,cve_description):
    try:
        
        # 得到一个可以执行SQL语句的光标对象
        cursor = conn.cursor()
        sql = '''insert into github_monitor(cve_name,cve_url,cve_description) values('{}','{}','{}')'''.format(cve_name,url,cve_description)
        cursor.execute(sql)
        print("数据库插入成功")
        # 执行SQL语句
        body = "CVE编号:" + cve_name + "\r\n" + "Github地址:" + url + "\r\n" +"描述:"+ cve_description + "\r\n"
        dingding('有新的CVE发现', body, webhook, sckey)
        print("钉钉 发送 CVE 成功")
    except Exception as e:
        print('该CVE{}已经存在'.format(cve_name))
    except Exception as e:
        pass


if __name__ == '__main__':
    while True:
        now_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print("************************************************")
        print('*     当前检测时间为:'+now_time+'      *')
        print("************************************************")
        github_headers = {
            'Authorization': 'token {}'.format('此处填写github的token') 
        }
        url = 'https://api.github.com/search/repositories?q=CVE-2022&sort=updated'
        try:
            
            result = requests.get(url=url, headers=github_headers).text
            result = json.loads(result)
            for i in range(1, 20):
                url = result['items'][i]['html_url']
                cve_name = result['items'][i]['name']
                cve_description = result['items'][i]['description']
                check(cve_name, url,cve_description)
        except Exception as e:
            pass
        time.sleep(30*60) #每30分钟执行,推迟执行的秒数

三、配置shell脚本(cve_run.sh)执行监控程序

该脚本检测服务器是否已有监控脚本的进程,若无进程则执行命令后台启动脚本

注意:脚本需要执行权限 chmod 777 cve_run.sh

#!/bin/bash
export PATH=usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/bin/java/bin:usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/bin/java/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/netcat-0.7.1/bin:/root/bin

ps aux |grep "python3 -u /opt/cvemonitor/cve-monitor.py" |grep -qv "grep"
if [ $? -ne 0 ];then
    rm -rf out.log
    nohup python3 -u /opt/cvemonitor/cve-monitor.py >/opt/cvemonitor/out.log 2>&1 &
    echo "启动cve监控脚本成功"
else
    echo "cve监控脚本正在运行"
fi

四、配置定时任务

1、添加定时任务启动cve_run.sh脚本

vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
# 分 时 日 月 周 
# 每分钟执行该脚本

* * * * *  /opt/cvemonitor/cve_run.sh

2、保存定时任务以及查看定时任务执行日志

crontab /etc/crontab   #保存并加载定时任务,使之生效
service crond restart   #重启定时服务,立马生效
# 查看定时任务
crontab -l
# 使用命令查看crontab的执行日志:/var/log/cron只会记录是否执行了某些计划的脚本
tail -f /var/log/cron

五、钉钉群助手及Github

1、创建钉钉智能群助手机器人

添加机器人:

钉钉群组实现监控Github的CVE信息

选择自定义机器人:

钉钉群组实现监控Github的CVE信息

复制密钥和Webhook到python脚本中:

钉钉群组实现监控Github的CVE信息钉钉群组实现监控Github的CVE信息

2、Github Token值

进入个人账号的配置中,选择Developer settings:

钉钉群组实现监控Github的CVE信息钉钉群组实现监控Github的CVE信息钉钉群组实现监控Github的CVE信息钉钉群组实现监控Github的CVE信息

将上图的Token值复制到python脚本中即可。

六、启动监控脚本及注意事项

1、启动脚本

使用nohup后台启动监控脚本cve-monitor.py,并将输出保存到out.log

nohup python3 -u /opt/cvemonitor/cve-monitor.py >/opt/cvemonitor/out.log 2>&1 &
  1. 最后一个“&”表示后台运行程序

  2. “nohup” 表示程序不被挂起

  3. “python3”表示使用python3执行python代码

  4. “-u”表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)

  5. “test.py”表示python的源代码文件

  6. “test.log”表示输出的日志文件

  7. “>”表示将打印信息重定向到日志文件

  8. “2>&1”表示将标准错误输出转变化标准输出,可以将错误信息也输出到日志文件中(0-> stdin, 1->stdout, 2->stderr)

2、重启定时任务保证定时任务生效

service crond restart

3、遇到的问题

当我定时任务配置完成且启动后,通过查看日志cat /var/log/cron看到定时任务正常执行了cve_run.sh脚本但是cve-monitor.py脚本并没有正常启动。

来到cve_run.sh脚本的目录,使用命令sh cve_run.sh执行shell脚本,然后查看进程,发现python脚本进程正常执行;那为什么通过定时任务的方式用shell脚本来启动python监控程序却不行呢?原来是环境变量的问题

使用env |grep PATH命令查看当前服务器的环境变量,将 PATH= 这一段的内容复制后添加到定时任务脚本cve_run.sh中#!/bin/bash 下面一行进行环境变量的指定

#!/bin/bash
export PATH= 

六、总结

通过钉钉群组进行监控Github中CVE-2022相关信息,实现机器人消息推送。

主要思路:

  1. 命令后台启动脚本
  2. 定时任务执行shell脚本,检测监控程序是否运行,若程序掉了则重新执行启动命令
上一篇:URL的简单介绍


下一篇:Dubbo常见错误分析