用ELK分析每天4亿多条腾讯云MySQL审计日志(2)--EQL
上一篇介绍了用ELK分析4亿多条审计日志过程,现在介绍如何用Python3分析ES的程序
需要分析的核心库审计数据:
1,950多张表,几十个账号,
2,5种操作类型(select,update,insert,delete,replace),14个实例(1主13从库)
分析说明:
select汇总: 必须包含from关键字:排除INSERT INTO 表 SELECT '609818','1' 这样情况
insert汇总: 必须有into关键字: 排除select中有insert关键字
update汇总: 不包含for 关键字: 排查 for update 的select查询
delete汇总: 不包含into 关键字: 排除insert等内容里包含delete的数据情况
replace汇总: 必须有into 关键字: 排除select查询中有replace函数
分析方法:
为保证把以上数据都能分析出来, 将950多张表,存放到数据表中,循环950多次表,每个表循环5次类型:
sql="select id,name,ea_time from tab order by id desc --查询全部表
dml={'select','update','insert','delete','replace'} --每个表循环5次类型
后来研发发现,分析程序表ol_list统计,但"库名.表",如line.ol_list,不会统计出来。后来修改EQL解决,具体代码如下:
下列是“”select“查询EQL的代码:

if op.find('select')>=0: # select,包含from
body ={"query":{
"bool":{ "must":[{
"match":{"Sql":'{op}'.format(op=op) }},{
"match":{"Sql": 'from'}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match": 1,
"filter":{
"range":{
"Timestamp.keyword":{
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
} }}},
"size":0, "aggs":{ "aggr_mame":{
"terms":{
"field":"User.keyword",
"size":2000
},
"aggs":{
"aggr_der":{
"terms":{
"field":"PolicyName.keyword"
},
"aggs":{
"top_tag_hits":{
"top_hits":{
"size":1
}
} }}}}}
}
说明:
1,使用:"minimum_should_match": 1, ,这个是兼容: "表名","库名.表名“
5种类型的全部EQL:

if op.find('select')>=0: # select,包含from
body ={"query":{
"bool":{ "must":[{
"match":{"Sql":'{op}'.format(op=op) }},{
"match":{"Sql": 'from'}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match": 1,
"filter":{
"range":{
"Timestamp.keyword":{
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
} }}},
"size":0, "aggs":{ "aggr_mame":{
"terms":{
"field":"User.keyword",
"size":2000
},
"aggs":{
"aggr_der":{
"terms":{
"field":"PolicyName.keyword"
},
"aggs":{
"top_tag_hits":{
"top_hits":{
"size":1
}
} }}}}}
}
elif op.find('update')>=0: # update 不能有for关键字
body = {"query": {
"bool": {"must": [{
"match": {"Sql": '{op}'.format(op=op)}},{
"match": {"PolicyName.keyword": 'd8t'}}],
"must_not": [{"match": {"Sql": "for"}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match": 1,
"filter": {
"range": {
"Timestamp.keyword": {
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
}}}},
"size": 0, "aggs": {"aggr_mame": {
"terms": {
"field": "User.keyword",
"size": 2000
},
"aggs": {
"aggr_der": {
"terms": {
"field": "PolicyName.keyword"
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"size": 1
}
}}}}}}
}
elif op.find('replace') >= 0: # replace 必须有into关键字
body = {"query": {
"bool": {"must": [{
"match": {"Sql": '{op}'.format(op=op)}}, {
"match": {"PolicyName.keyword": 'd8t'}},{
"match": {"Sql": 'into'}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match": 1,
"filter": {
"range": {
"Timestamp.keyword": {
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
}}}},
"size": 0, "aggs": {"aggr_mame": {
"terms": {
"field": "User.keyword",
"size": 2000
},
"aggs": {
"aggr_der": {
"terms": {
"field": "PolicyName.keyword"
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"size": 1
}
}}}}}}
}
elif op.find('insert') >= 0: # insert 必须有into关键字
body = {"query": {
"bool": {"must": [{
"match": {"Sql": '{op}'.format(op=op)}}, {
"match": {"PolicyName.keyword": 'd8t'}},{
"match": {"Sql": 'into'}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match":1,
"filter": {
"range": {
"Timestamp.keyword": {
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
}}}},
"size": 0, "aggs": {"aggr_mame": {
"terms": {
"field": "User.keyword",
"size": 2000
},
"aggs": {
"aggr_der": {
"terms": {
"field": "PolicyName.keyword"
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"size": 1
}
}}}}}}
}
else: # delete 不能有into关键字
body = {"query": {
"bool": {"must": [{
"match": {"Sql": '{op}'.format(op=op)}},{
"match": {"PolicyName.keyword": 'd8t'}}],
"must_not": [{"match": {"Sql": "into"}}],
"should": [{
"term": {"Sql": '{name}'.format(name=tabname)}}, {
"term": {"Sql": 'online.{name}'.format(name=tabname)}}],
"minimum_should_match": 1,
"filter": {
"range": {
"Timestamp.keyword": {
"lte": "{date}".format(date=end_time),
"gte": "{begindate}".format(begindate=begin_time),
}
}}}},
"size": 0, "aggs": {"aggr_mame": {
"terms": {
"field": "User.keyword",
"size": 2000
},
"aggs": {
"aggr_der": {
"terms": {
"field": "PolicyName.keyword"
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"size": 1
}
}}}}}}
}
写入统计数据Py:

doc = res["aggregations"]["aggr_mame"]['buckets']
cn = conn()
cur = cn.cursor()
if len(doc):
for item in doc:
user=item['key'] # 账号
total=str(item['doc_count']) # 该账号在全部实例下的调用次数
if len(item["aggr_der"]["buckets"]):
for bucket in item["aggr_der"]["buckets"]:
server=bucket['key'] # 服务器实例
s_total =str(bucket['doc_count']) # 该服务器实例下的调用次数
sql=bucket["top_tag_hits"]["hits"]["hits"][0]["_source"]["Sql"] # 样例Sql
sql=emoji.demojize(transferContent(sql)) #转义并去掉表情符号
tsql="replace into ea_tj(tab,username,op,num,server,sqltext,dt) "\
" values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}')".format(tabname,user,op,s_total,server,sql,dt)
cur.execute(tsql)
cn.commit()
存放分析结果表:

CREATE TABLE `ea_tj` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tab` varchar(200) NOT NULL COMMENT '表名',
`username` varchar(200) NOT NULL COMMENT '账号',
`op` varchar(50) DEFAULT NULL COMMENT '操作类型',
`num` bigint(11) NOT NULL COMMENT '次数',
`server` varchar(200) NOT NULL COMMENT '实例策略名',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`sqltext` text COMMENT '样例SQL',
`dt` date DEFAULT NULL COMMENT '线上SQL执行日期',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `un` (`tab`,`username`,`op`,`server`,`dt`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
具体汇总数据:
1,每天13个实例,表,账号,操作之间关系汇总(用来Online表拆分)
2,每天13个数据库实例账号的连接IP汇总(用来迁移VPC)
3,统计调用总次数 (用来分析调用次数异常)
汇总1的结果数据:

用ELK分析每天4亿多条腾讯云MySQL审计日志(2)--EQL的更多相关文章
- jquery的$.extend和$.fn.extend作用及区别/用span实现进度条/腾讯云IIS端口号修改
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); 虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便. ...
- [日志分析]Graylog2采集mysql慢日志
之前聊了一下graylog如何采集nginx日志,为此我介绍了两种采集方法(主动和被动),让大家对graylog日志采集有了一个大致的了解. 从日志收集这个角度,graylog提供了多样性和灵活性,大 ...
- 使用Docker快速部署ELK分析Nginx日志实践(二)
Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...
- 4:ELK分析tomcat日志
五.ELK分析tomcat日志 1.配置FIlebeat搜集tomcat日志 2.配置Logstash从filebeat输入tomcat日志 3.查看索引 4.创建索引
- 使用Docker快速部署ELK分析Nginx日志实践
原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...
- elk是指logstash,elasticsearch,kibana三件套,这三件套可以组成日志分析和监控工具
Logstash是一个完全开源的工具,他可以对你的日志进行收集.分析,并将其存储供以后使用(如,搜索),您可以使用它.说到搜索,logstash带有一个web界面,搜索和展示所有日志.kibana 也 ...
- Python脚本收集腾讯云CDN日志,并入ELK日志分析
负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...
- ELK 构建 MySQL 慢日志收集平台详解
ELK 介绍 ELK 最早是 Elasticsearch(以下简称ES).Logstash.Kibana 三款开源软件的简称,三款软件后来被同一公司收购,并加入了Xpark.Beats等组件,改名为E ...
- ELK构建MySQL慢日志收集平台详解
上篇文章<中小团队快速构建SQL自动审核系统>我们完成了SQL的自动审核与执行,不仅提高了效率还受到了同事的肯定,心里美滋滋.但关于慢查询的收集及处理也耗费了我们太多的时间和精力,如何在这 ...
- 腾讯云EMR大数据实时OLAP分析案例解析
OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过QQ音乐与腾 ...
随机推荐
- VUE - 配置跨域
'/api': { target: 'http://localhost:8088/', //这里后台的地址模拟的;应该填写你们真实的后台接口 changOrigin: true, //允许跨域 pat ...
- css - absolute居中
position:absolut; left:50%; top:50%; margin-left: -(自身一半宽度); margin-top: -(自身一半高度)
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.26)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 一个轻量快速的C++日志库
limlog 作一篇文章记录实现,驱动优化迭代. 代码仓库 用法 实现 后端实现 前端实现 日期时间的处理 线程id的获取 日志行的其他项处理 优化 整形字符串格式化优化 测试 benchmark 性 ...
- [转帖]django使用html渲染页面样式+数据库管理员的创建
一.django页面渲染 1.在templates中创建html格式的文件-index.html,在该文件中添加body,设置样式,比如: <h1 style = "backgroun ...
- [转帖]mysql-connect-java驱动从5.x升级到8.x的CST时区问题
https://juejin.cn/post/7029291622537887774 前言 旧项目MySQL Java升级驱动,本来一切都好好的,但是升级到8.x的驱动后,发现入库的时间比实际时间 ...
- [转帖]shell编程之循环语句
目录 一.循环语句 for循环 for语句的结构 嵌套循环 while语句的结构 while语句应用示例 until语句的结构 until语句示例 二.跳出循环 continue跳出循环 break跳 ...
- [转帖]Shell 判断文件或文件夹是否存在(不存在则创建)
目录 1. 文件夹不存在创建文件夹 2. 判断文件夹是否存在 3. 判断文件是否存在 4. 常用的文件比较符 1. 文件夹不存在创建文件夹 if [ ! -d "/data/" ] ...
- [转帖] q命令-用SQL分析文本文件
https://www.cnblogs.com/codelogs/p/16060830.html 简介# 在Linux上分析文本文件时,一般会使用到grep.sed.awk.sort.uniq等命令, ...
- 金蝶Cosmic虚拟机简单使用与总结
背景 知己知彼 简单学习下友商发出来的测试软件 看看有否对自己现在的工作有所指导 也看看对方的部署方式有啥优缺点 当然了仅是测试, 不是生产软件可能有失真. 注意 我没有测试序列号, 登录系统耗时很久 ...