上一篇介绍了用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的更多相关文章

  1. jquery的$.extend和$.fn.extend作用及区别/用span实现进度条/腾讯云IIS端口号修改

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); 虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便. ...

  2. [日志分析]Graylog2采集mysql慢日志

    之前聊了一下graylog如何采集nginx日志,为此我介绍了两种采集方法(主动和被动),让大家对graylog日志采集有了一个大致的了解. 从日志收集这个角度,graylog提供了多样性和灵活性,大 ...

  3. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  4. 4:ELK分析tomcat日志

    五.ELK分析tomcat日志 1.配置FIlebeat搜集tomcat日志 2.配置Logstash从filebeat输入tomcat日志 3.查看索引 4.创建索引

  5. 使用Docker快速部署ELK分析Nginx日志实践

    原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...

  6. elk是指logstash,elasticsearch,kibana三件套,这三件套可以组成日志分析和监控工具

    Logstash是一个完全开源的工具,他可以对你的日志进行收集.分析,并将其存储供以后使用(如,搜索),您可以使用它.说到搜索,logstash带有一个web界面,搜索和展示所有日志.kibana 也 ...

  7. Python脚本收集腾讯云CDN日志,并入ELK日志分析

    负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...

  8. ELK 构建 MySQL 慢日志收集平台详解

    ELK 介绍 ELK 最早是 Elasticsearch(以下简称ES).Logstash.Kibana 三款开源软件的简称,三款软件后来被同一公司收购,并加入了Xpark.Beats等组件,改名为E ...

  9. ELK构建MySQL慢日志收集平台详解

    上篇文章<中小团队快速构建SQL自动审核系统>我们完成了SQL的自动审核与执行,不仅提高了效率还受到了同事的肯定,心里美滋滋.但关于慢查询的收集及处理也耗费了我们太多的时间和精力,如何在这 ...

  10. 腾讯云EMR大数据实时OLAP分析案例解析

    OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过QQ音乐与腾 ...

随机推荐

  1. mongo-基本操作

    mogo基本操作 mongo对命令大小写敏感,SQL对大小写不敏感 存放 json数据,一条json数据是一个文档 数据库 查看数据库 show databases 切换数据库 use db db 不 ...

  2. [转帖]Oracle 19c 新特性|增加 VARCHAR2 数据类型的大小限制

    JiekeXuAll China Database Union2022-10-13 795 经朋友介绍,我读完 Tim Hall 于 2022 年 9 月 27 日他的博客上发表的博文.10 月 11 ...

  3. linux 内存盘的使用方式与验证

    linux 内存盘的使用方式与验证 背景 某些情况下, 硬盘的写入是一个很大的瓶颈 使用 内存文件系统的方式应该能够极大的提高IO的速度. 内存盘的优点是比较快, 缺点就是数据不是持久化的. 其实还是 ...

  4. [转帖]谈谈对K8S CNI、CRI和CSI插件的理解

    K8S的设计初衷就是支持可插拔架构,解决PaaS平台不好用.不能用.需要定制化等问题,K8S集成了插件.附加组件.服务和接口来扩展平台的核心功能.附加组件被定义为与环境的其他部分无缝集成的组件,提供类 ...

  5. CentOS7 上面升级git 2.24的方法

    本来想使用tar包进行安装 但是发现tar包安装时总是报错如下: [root@centos76 git-2.25.0]# make LINK git-imap-send imap-send.o: In ...

  6. 文盘Rust -- 安全连接 TiDB/Mysql

    作者:京东科技 贾世闻 最近在折腾rust与数据库集成,为了偷懒,选了Tidb Cloud Serverless Tier 作为数据源.Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb ...

  7. 修改windows电脑键盘按键映射

    改键的需求 买了一把61键的小键盘,有些按钮没有,比如Home.End.四个方向键,这些键需要按Fn+XX来实现,所以上网查了一下键盘按键修改的方法,即把按键给改了,比如把右边的Ctrl改成方向键. ...

  8. 批量修改SVN的用户名和密码的尝试

    起源 公司规定每6个月需要修改一次密码,否则每天都有邮件和内网提醒.因为邮箱密码和svn等一系列应用绑定,避免每次修改密码后需要手工输入修改多个svn仓库的帐号和密码. PS.同一个前缀的svn不用重 ...

  9. Pytest 源码解读 [1] - [pluggy] 核心设计理念浅读

    背景: Pytest 是一个功能强大的 Python 测试框架,它使用了一个名为 "pluggy" 的插件系统来扩展其功能.在 Pytest 的源码中,pluggy 模块负责实现插 ...

  10. 在K8S中,deploy升级过程包括什么?

    在Kubernetes (K8S) 中,Deployment的升级过程主要包括以下几个步骤: 更新Deployment配置: 当需要对应用程序进行升级时,通常会更新Deployment的YAML配置文 ...