转载自:https://blog.51cto.com/13941177/2173620

一、简介

1、概述

mysql本身已经提供了详细的sql执行记录–general log ,但是开启它有以下几个缺点:

1)无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。

2)sql并发量很大时,log的记录会对io造成一定的印象,是数据库效率降低。

3)日志文件很容易快速膨胀,不妥善处理会对磁盘空间造成一定影响。

2、原理

1) 由于审计的关键在于DML语句,而所有的DML语句都可以通过binlog记录。

2)不过遗憾的是目前MySQL binlog 中只记录,产生这条记录的connection id(随连接数自增,循环使用),这对之后的反查没有任何帮助。

3)因此考虑通过init-connect,在每次连接的初始化阶段,记录下这个连接的用户,和connection_id信息。

4)在后期审计进行行为追踪时,根据binlog记录的行为及对应的connection-id 结合 之前连接日志记录 进行分析,得出最后的结论。

备注:根据自己的实际环境使用审计方式,切记谨慎使用。

3、相对于audit审计插件

缺点:只对有低级权限的用户的操作有记录,权限高的则没有 。

优点:日志信息比较小,对性能影响小

二、安装审计功能

1、创建审计用的库表。

mysql> create database db_monitor charset utf8;

mysql> use db_monitor

CREATE TABLE accesslog

( thread_id int(11) DEFAULT NULL,   #进程id

log_time datetime default null,   #登录时间

localname varchar(50) DEFAULT NULL, #登录名称,带详细ip

matchname varchar(50) DEFAULT NULL,  #登录用户

key idx_log_time(log_time)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

2、配置init-connect参数

# vim /etc/my.cnf

[mysqld]

server-id = 130

federated

log-bin = mysql-bin

binlog_format = mixed

init_connect='insert into db_monitor.accesslog(thread_id,log_time,localname,matchname) values(connection_id(),now(),user(),current_user());'

3、删除默认用户:

mysql> delete from user where Host='localhost' and User='';

4、创建普通用户,不能有super权限,而且用户必须有对access_log库的access_log表的insert权限,否则会登录失败。

mysql> GRANT CREATE,DROP,ALTER,INSERT,DELETE,UPDATE,SELECT ON *.* TO audi01@'%' IDENTIFIED BY '147258';

mysql> flush privileges;

5、赋予用户access_log的insert、select权限,然后重新赋予权限:

mysql> GRANT SELECT,INSERT ON db_monitor.* TO audi01@'%';

mysql> flush privileges;

6、查看,使用audi01用户登录查看

mysql> select * from accesslog;

mysql> delete from accesslog where thread_id=10;

通过mysqlbinlog查看

# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000013

扩展说明:

1)init-connect只会在连接时执行,不会对数据库产生大的性能影响

2)init-connect是在连接时执行的动作命令,故可以用它来完成其它的功能,如:init_connect='SET autocommit=0'

3)init-connect不会记录拥有super权限的用户记录,为了防止init_connect语句由于语法错误或权限问题而所有用户都登陆不了的情况,保证至少super用户能登陆并修改此值。

4)于是一个log库,推荐使用archive存储引擎,有利于数据厄压缩存放。如果数据库连接数量很大的话,建议一定时间做一次数据导出,然后清表。

MySQL5.7 (审计)通过init_connect + binlog 实现MySQL审计功能的更多相关文章

  1. 通过init-connect + binlog 实现MySQL审计功能

    背景: 假设这么一个情况,你是某公司mysql-DBA,某日突然公司数据库中的所有被人为删了. 尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人. 但是拥有数据库操 ...

  2. mysql审计实现方法

    Mysql版本: 5.6.24-72.2 一.通过init-connect + binlog 实现MySQL审计功能 基本原理: 由于审计的关键在于DML语句,而所有的DML语句都可以通过binlog ...

  3. MySQL审计工具Audit Plugin安装使用

    本实验的审计插件均是安装在 mysql-community-server-5.7.9 的服务器上. 插件安装(社区版) 插件下载地址: https://bintray.com/mcafee/mysql ...

  4. 烂泥:通过binlog恢复mysql备份之前的数据

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章,我们讲解了如何通过mysql的binlog日志恢复mysql数据库,文章连接为<烂泥:通过binlog恢复mysql数据库>.其 ...

  5. 开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法

    开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法: 创建存储过程时 出错信息: ERROR 1418 (HY ...

  6. Ubuntu下rsyslog集中收集mysql审计日志

    服务端 1.安装最新版本rsyslog sudo apt-get install software-properties-common python-software-properties sudo ...

  7. 配置Mysql审计

    mysql-audit.json:Mysql审计日志 插件下载地址: https://bintray.com/mcafee/mysql-audit-plugin/release/1.1.4-725#f ...

  8. mysql审计插件-记录所有sql语句

    https://www.58jb.com/html/160.html https://www.jianshu.com/p/a0e0aec3cb6f MySQL审计工具Audit Plugin安装使用 ...

  9. 解析binlog生成MySQL回滚脚本

    如果数据库误操作想恢复数据.可以试试下面这个脚本.前提是执行DML操作. #!/bin/env python #coding:utf-8 #Author: Hogan #Descript : 解析bi ...

随机推荐

  1. python学习-49 json模块

    json模块 --------将任何类型都转换为json字符串 方法dumps import json dic={"name":"abc"} data = js ...

  2. Python 【收发邮件】

    发邮件 smtplib模块主要负责发送邮件 email模块主要负责构造邮件.这两个都是Python内置模块 smtplib.SMTP.方法 #按住Ctrl键并点击SMTP ,会看到对SMTP的解释(v ...

  3. 选择排序——C语言

    选择排序 1.算法描述 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕(放 ...

  4. SAS学习笔记22 t检验、卡方检验

  5. java类的访问修饰符

    1.java中外部类的访问修饰符有如下四种: public,默认,abstract,final // public,默认,abstract,final. public class Test1 {} c ...

  6. 【转载】在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support

    在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone config ...

  7. java封装数据类型——Integer

    今天来学习整型 int 的封装数据类型,Integer. 1. 定义 首先来看看定义.可以看到,Integer 继承 Number 抽象类,实现了 Comparable 接口.Number 类是常用数 ...

  8. Spring AOP编程经验总结

    编程范式概览:面向过程,面向对象,函数式编程,事件驱动编程,面向切面等, AOP是什么? Spring AOP是采用面向切面编程的编程范式,而非编程语言,它只能解决特定问题,而非所有问题,它与OOP不 ...

  9. CSS图片Img等比例缩放且居中显示

    常用来做图片放大显示的遮罩层imgScale HTML <div id="imgScale" > <img src=""> </d ...

  10. # 机器学习算法总结-第九天(XGboost)