用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音乐与腾 ...
随机推荐
- JVM大页内存的学习与使用
JVM大页内存的学习与使用 原理和背景 操作系统是计算机的重要组成部分. 现代的操作系统一般都采用 段页式内存管理. 段一般是为了管理和权限 页主要是为了虚拟内存和物理内存的映射. 分页管理可以让物理 ...
- [转帖]005、体系结构之TiKV_Raft日志
Raft日志 1.Raft与Multi Raft 2.Raft 日志复制 2.1.复制流程总览 2.2.Propose 2.3.Append 2.3.Replicate(Append) 2.4 Com ...
- [转帖]Tail Latency学习
https://www.cnblogs.com/Rohn/p/15123758.html Latency,中文译作延迟,Tail Latency即尾延迟. 实际生产中的Latency是一种(概率)分布 ...
- [转帖]Native Memory Tracking 详解(4):使用 NMT 协助排查内存问题案例
https://www.modb.pro/db/557714 从前面几篇文章,我们了解了 NMT 的基础知识以及 NMT 追踪区域分析的相关内容,本篇文章将为大家介绍一下使用 NMT 协助排查内存问题 ...
- [转帖]016 Linux 卧槽,看懂进程信息也不难嘛?top、ps
016 Linux 卧槽,看懂进程信息也不难嘛?top.pshttps://my.oschina.net/u/3113381/blog/5455267 1 扒开看看 top 命令参数详情 Linux ...
- 银河麒麟安装LLDB的方法以及调试 dump 文件 (未完成)
今天同事要进行 lldb进行调试dotnet的bug 本来在x86 上面进行相应的处理 但是发现报错. 没办法 正好有一台借来的arm服务器就搞了一下. 简单记录一下安装方法 1. 安装 apt的so ...
- 【OpenAI】ChatGPT函数调用(Function Calling)实践
6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力. 本文 ...
- vue报错:'XX' is defined but never used no-unused-vars
参考地址:http://www.gold404.cn/info/87 导致这个报错的原因就是eslint校验, 就是你当初在vue创建脚手架的时候选择了eslint校验: 后面你绝对会碰到这样的报错, ...
- Prompt工程师指南[高阶篇]:对抗性Prompting、主动prompt、ReAct、GraphPrompts、Multimodal CoT Prompting等
Prompt工程师指南[高阶篇]:对抗性Prompting.主动prompt.ReAct.GraphPrompts.Multimodal CoT Prompting等 1.对抗性 Prompting ...
- pymysql基本使用规则
1.执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(ho ...