Mysql8中的无插件方式审计

 更新时间:2023年12月25日 10:17:59   作者:endzhi  
这篇文章主要介绍了Mysql8中的无插件方式审计,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

需求

在mysql 8中记录用户对数据库表的操作内容,操作时间,客户端源ip地址。

在mysql5.7完美地采用MariaDB的server_audit插件来记录{时间,节点,用户,源IP,事件类型,库,语句,影响行数}等审计,但从mysql8开始已不支持该插件,同类的第三方插件也无法使用。

目前找到的方式:

[ binlog + init-connect ],binlog可以审计到所有数据记录及表结构变更相关的记录,但,不记录连接的信息,要通过额外的手段来记录,比如show full processlist;

是可得出连接信息中的process id,与binlog中的thread id进行关联分析,得到连接的信息{用户名、登录时间、源ip},为了永久记录process id,采用init-connect 方式记录到数据库表中。

1. 创建init-connect用于记录的库和表

       mysql>   create database mysql_access_log;
       mysql>   create table mysql_access_log.access_log ( conn_id int(11) default null, `time` timestamp, `localname` varchar(30), `matchname` varchar(30));

2. 授权用户于该库的表mysql_access_log.accesslog有insert权限

如用户user_web

mysql>   grant insert on `mysql_access_log`.`access_log` to 'user_web'@'%';

3. 配置用户登录日志插入表

my.cnf中 [mysqld] 下添加,并重启mysql生效

init-connect='insert into mysql_access_log.access_log values(connection_id(),now(),user(),current_user());'

4. 特别注意

①init-connect只记录非super权限用户,所以好好管理用户,按情况回收super权限;

②非super权限用户登录都受init-connect影响,未授权对mysql_access_log.access_log有insert权限的用户即无法登录成功!

③当重启mysql后connection_id会存在不按历史续增长而重复出现,所以查记录时注意多个重复的id记录。

5. 开启mysql-binlog日志记录

my.cnf [mysqld] 下添加,并重启mysql生效

# 二进制日志
log-bin=mysql-bin
# binlog-do-db=db  #仅作用的库
expire_logs_days = 20
max_binlog_size = 300m

6. 从binlogi日志 取thread_id去查用户名和源ip

模拟删除book库books表中的一条记录-----过程省略!

解密mysql-bin查看内容,找到DELETE操作的thread_id号,如这里的8。

[root@localhost data]# mysqlbinlog  --base64-output=decode-row -vv  mysql-bin.000003  > ./mysql-bin.000003--vv.log  
 
[root@localhost data]# tail -n  30   ./mysql-bin.000003--vv.log
#200712 18:24:01 server id 1  end_log_pos 1008 CRC32 0x62294de5    Query   thread_id=8     exec_time=0   error_code=0
SET TIMESTAMP=1594549441/*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
#200712 18:24:01 server id 1  end_log_pos 1079 CRC32 0x0723c708         Table_map: `book`.`books` mapped to number 95
#200712 18:24:01 server id 1  end_log_pos 1187 CRC32 0xc96cc08e         Delete_rows: table id 95 flags: STMT_END_F
### DELETE FROM `book`.`books`
###   @1=44 /* INT meta=0 nullable=0 is_null=0 */
###   @2='XML 完全探索' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */

根据thread_id号去找init-connect记录表的登录用户和源ip

[root@localhost data]# mysql -u root -p -e "select * from mysql_access_log.access_log  where conn_id=8 ;" 
| conn_id | time                | localname               | matchname  |
+---------+---------------------+-------------------------+------------+-
|       8 | 2020-07-12 18:23:41 | user_web@192.168.53.119 | user_web@% |
+---------+---------------------+-------------------------+------------+-

7. 开启general-log日志记录

[ binlog + init-connect ] 方式,受限于binlog本身记录日志的局限,无法审计一些并不记录在binlog中的内容。

比如无SELECT、Connect;可同时开启mysql的general-log记录,记录执行的所有的语句的信息。

my.cnf [mysqld] 下添加,并重启mysql生效

general-log=1

general_log_file = /opt/mysql/data/general_log_file.log   #按你实际路径,注意权限

但存在的不足

  • a. 无论所执行语句是否正确执行,都会记录,会导致大量的无用信息,后面的筛选不易操作;
  • b. 当server的并发访问非常大时,log的记录会对IO产一定的影响,以致于影响server的性能;
  • c. 日志文件很容易快速增长;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • asp+mysql+utf8 网页出现乱码问题的解决方法

    asp+mysql+utf8 网页出现乱码问题的解决方法

    无论在网页中加多少UTF8的定义,显示的结果都还是会有一些小格子,反而定义为gb2312,显示完全正常
    2014-03-03
  • MySQL limit子句用法及优化小结

    MySQL limit子句用法及优化小结

    limit在获取到满足条件的数据量时即会立刻终止SQL的执行,本文主要介绍了MySQL limit子句用法及优化小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • MySQL优化教程之超大分页查询

    MySQL优化教程之超大分页查询

    这篇文章主要给大家介绍了关于MySQL优化教程之超大分页查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mysql 8.0.17 安装与使用教程图解

    mysql 8.0.17 安装与使用教程图解

    这篇文章主要介绍了mysql 8.0.17 安装与使用教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • mysql存储过程之引发存储过程中的错误条件(SIGNAL和RESIGNAL语句)实例分析

    mysql存储过程之引发存储过程中的错误条件(SIGNAL和RESIGNAL语句)实例分析

    这篇文章主要介绍了mysql存储过程之引发存储过程中的错误条件(SIGNAL和RESIGNAL语句),结合实例形式分析了mysql使用SIGNAL和RESIGNAL语句来引发存储过程中的错误条件相关操作技巧与注意事项,需要的朋友可以参考下
    2019-12-12
  • MYSQL主从库不同步故障一例解决方法

    MYSQL主从库不同步故障一例解决方法

    第一次做完主从库同步后正常,但工作过程中发现有一个库的数据库没有同步起来,在另外一个mysql(3307)中
    2010-06-06
  • Mysql中 IFNULL函数的使用详解

    Mysql中 IFNULL函数的使用详解

    IFNULL()函数在MySQL中用来检查第一个表达式是否为NULL,非NULL则返回第一个值,否则返回第二个值,本文就来详细的介绍一下如何使用,感兴趣的可以了解一下
    2024-09-09
  • DataGrip的MySQL数据导出和导入操作超详细指南

    DataGrip的MySQL数据导出和导入操作超详细指南

    很多时候我们会遇到需要将本机数据库数据导出或者其他数据库数据的导入操作,这篇文章主要给大家介绍了关于DataGrip的MySQL数据导出和导入操作超详细指南,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 关于加强MYSQL安全的几点建议

    关于加强MYSQL安全的几点建议

    现在php+mysql组合越来越多,这里脚本之家小编就为大家分享一下mysql的安装设置的几个小技巧
    2016-04-04
  • 超详细MySQL8.0.22安装及配置教程

    超详细MySQL8.0.22安装及配置教程

    这篇文章主要介绍了超详细MySQL8.0.22安装及配置教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论