通过钉钉群组进行监控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、创建钉钉智能群助手机器人
添加机器人:
选择自定义机器人:
复制密钥和Webhook到python脚本中:
2、Github Token值
进入个人账号的配置中,选择Developer settings:
将上图的Token值复制到python脚本中即可。
六、启动监控脚本及注意事项
1、启动脚本
使用nohup后台启动监控脚本cve-monitor.py
,并将输出保存到out.log
nohup python3 -u /opt/cvemonitor/cve-monitor.py >/opt/cvemonitor/out.log 2>&1 &
最后一个“&”表示后台运行程序
“nohup” 表示程序不被挂起
“python3”表示使用python3执行python代码
“-u”表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)
“test.py”表示python的源代码文件
“test.log”表示输出的日志文件
“>”表示将打印信息重定向到日志文件
“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相关信息,实现机器人消息推送。
主要思路:
- 命令后台启动脚本
- 定时任务执行shell脚本,检测监控程序是否运行,若程序掉了则重新执行启动命令