首页 > 数据库 >mysql审计之BinLog+Init_connect

mysql审计之BinLog+Init_connect

时间:2023-12-12 21:02:31浏览次数:25  
标签:audit BinLog log init Init connect 审计

一、概述

1、实现原理
BinLog是MySQL操作时留下的日志,BinLog一方面可以用在数据库的恢复与主从复制上,另外一方面可以用来做数据库的审计。
在MySQL中,每个连接都会先执行init_connect进行连接的初始化,我们可以在这里获取用户的登录名称和thread ID值。
然后配合BinLog,就可以追踪到每个操作语句的操作时间,操作人等信息,再加上BinLog的日志信息实现审计。

2、优势
配置简单

3、弊端
只能记录登录名称和thread ID,还要根据thread ID去查binlog文件,操作复杂
由于BinLog日志里面无法查询是谁在哪个时间段登录的等信息,缺少审计必要的信息。
采用这种方式进行审计,由于init-connect只会在连接时执行,不会对数据库产生大的性能影响,但是init-connect不会记录拥有root权限的用户记录.

二、具体配置

1、配置审计

1.创建审计用的数据库和表
create database audit_db;
use audit_db;
create table access_log(
    id int primary key auto_increment,
    connection_id int,
    connection_user varchar(30),
    logintime datetime
);
#因为是记录在具体库的具体表里,如果主从同步没做忽略库表,则会主库这张表的信息同步到从库

2、建用户并授权
grant all privileges on audit_log.* to 'user001'@'localhost' identified by 'password001';
flush privileges;

3、设置init_connect,并重启MySQL数据库在初始化参数文件[mysql]部分添加如下内容
log-bin=mysql-bin #开启Binlog
init_connect='insert into audit_db.access_log(connection_id, connection_user,logintime) values(connection_id(),user(),now());' #设置初始化连接参数
 
3.使用user001登录进行增删改查的操作
略
 
4.用mysqlbinlog工具查看BinLog,根据delete操作找到相应的ThreadId,而后在前面创建的审计日志表audit_db.access_log
里面根据ThreadID找到用户登录信息
show master status;
比如:查看当前binlog mysqlbin.000029的内容,并找到delete操作对应的ThreadID
mysqlbinlog …/data/mysql-bin.000029
从Binlog中可以得知删除Test2表对应的threadid是8,根据ThreadID在审计表里查看用户的登录信息,可以得知这个删除操作是user001用户在本机执行的操作
select * from audit_log.access_log;

5、试验记录
业务用户要额外授权audit_db表的权限,不然业务用户执行操作的时候无法写入audit_db表,会直接弹出报错,当前命令都是执行失败状态
拥有超级管理员权限的用户操作不被记录
只记录连接时的id,不记录退出和具体操作命令
数据会从主库同步到从库

2、关闭审计

直接将配置文件中init_connect配置删除并重启mysql即可

标签:audit,BinLog,log,init,Init,connect,审计
From: https://blog.51cto.com/u_13236892/8790780

相关文章

  • docker启动容器报错:Error response from daemon: driver failed programming external
    安装的docker启动报错如下:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointnacos(2b0f4edff8f640559af9626936d1b38d965302ef525af483716e8e8c9121583e):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptcp-d0/0--dp......
  • selenium运行时的ValueError: Timeout value connect was <object object at 0x000001
    fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("https://www.baidu.com/")运行时出现ValueError:Timeoutvalueconnectwas<objectobjectat0x000001FE483C4170>错误大概率原因是:selenium和urllib3库的版本冲突导致修改版本为:selenium=3.1......
  • 深入理解Oracle 的 connect by level
    1、connectby connectby中的条件就表示了父子之间的连接关系比如connectbyid=priorpid默认是从根开始,如connectbypriorid=pid,表示构造树时,本记录的id是下条的pid,即找pid=本条id的记录做下条记录。交换prior位置,表示从叶开始。如connectbyid=priorpi......
  • Ramfs、rootfs和initramfs【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/filesystems/ramfs-rootfs-initramfs.htmlRamfs、rootfs和initramfs作者[email protected]什么是ramfs?Ramfs是一个非常简单的文件系统,它将Linux的磁盘缓存机制(页面缓存和目录项缓存)作为一个动态可调整大小的基于RAM的文件......
  • ApplicationContextInitializer在Spring容器执行refresh之前执行
    ApplicationContextInitializer用于在刷新Spring容器之前的回调接口。ApplicationContextInitializer是Spring框架原有的概念,这个类的主要目的就是在ConfigurableApplicationContext类型(或者子类型)的ApplicationContext进行刷新refresh之前,允许我们对ConfigurableApplicatio......
  • 记一次docker buildx build 推送到本地私有仓库出现 connection refused 的问题
    想在本地编译多个架构的基础镜像,这样后续有其他业务使用的时候,不必从头开始编译。使用传统的dockerbuild-tImageName:tag方式,只能编译和主机相同架构的镜像。而dockerbuildxbuild不支持将编译好的镜像放置在本地docker中,只能以文件的形式放在本地。因此需要在本地搭建......
  • KEILC51编译问题ERROR L104: MULTIPLE PUBLIC DEFINITIONS重复定义
    这个问题是keil中比较常见的,但对于很多新手比较头疼的像出现这种104的报错 出现上述错误则是因为函数Delay_ms重复定义,我们只需要把这个函数名改一个就OK了 我们可以把.c.h文件的Delay_ms改为Delay1_ms,在调用函数也改为Delay1_ms,然后编译就不会出错了。 ......
  • 数据库数据恢复—无备份,binlog未开启的Mysql数据库误删表数据的数据恢复案例
    mysql数据库数据恢复环境:本地服务器,windowsserver操作系统,部署有mysql单实例,数据库引擎类型为innodb,独立表空间,无数据库备份,未开启binlog。mysql数据库故障:工作人员使用Delete命令删除数据时未添加where子句进行筛选,导致全表数据被删除,删除后未对该表进行任何操作。针对mysql......
  • How to connect two pairs of AirPods to one phone simultaneously
    TechStreamingHomeKitchenHealthStyleBeautyGiftsDealsMore REVIEWS  TECHHowtoconnecttwopairsofAirPodstoonephonesimultaneouslyWrittenby AbigailAbesamisDemarest and DevonDelfino; editedby ElenaMatarazzo Updated......
  • MySQL服务器8核32G max_connections设置为10000的情况,springboot里面的Druid参数配置
    MySQL服务器8核32Gmax_connections设置为10000的情况,springboot里面的Druid参数配置多少合适啊,MySQL服务器8核32G,max_connections设置为10000,确实是相当大的一个配置啊。对于Druid的参数配置,得看你系统的具体情况。一般来说,你可以考虑以下几个参数:initialSize:连接池的初始大小,你......