博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql基于init-connect+binlog完成审计功能
阅读量:6931 次
发布时间:2019-06-27

本文共 2064 字,大约阅读时间需要 6 分钟。

 

目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版、Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用它来完成审计功能。

init-connect参数说明:

http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_init_connect

 

 

step1:创建用户数据库表

set names utf8create database auditlog;create table auditlog.t_audit(  id int not null auto_increment,  thread_id int not null,  login_time timestamp,  localname varchar(50) default null,  matchname varchar(50) default null,   primary key (id))ENGINE=InnoDB default charset=utf8 comment '审计用户登录信息';

 

step2:授权所有的用户拥有对审计表的插入权限

select concat("grant insert on auditlog.t_audit to '",user,"'@'",host,"';") from mysql.user;  #拼结授权语句 ……flush privileges;

注意,以后每添加一个用户都必须授权此表的插入权限,要不会连接不上。

 

step3:设置init_connect参数

set global init_connect='insert into auditlog.t_audit(id,thread_id,login_time,localname,matchname) values(null,connection_id(),now(),user(),current_user());';
 
并在配置文件中增加如下语句:
init-connect='insert into auditlog.t_audit(id,thread_id,login_time,localname,matchname) values(null,connection_id(),now(),user(),current_user());'
以便下次重启时能生效

 

 

验证:

我们登陆后并删除一条记录,查看binlog,我们可以看到此操作的thread_id为7:

 

然后我们来查看此表t_audit表:
[zejin] 3301>select * from auditlog.t_audit;+----+-----------+---------------------+---------------------------+-------------------------+| id | thread_id | login_time | localname | matchname |+----+-----------+---------------------+---------------------------+-------------------------+| 1 | 5 | 2016-08-10 11:01:07 | user_app@192.168.1.240 | user_app@192.168.1.% || 2 | 6 | 2016-08-10 11:02:02 | user_app@192.168.1.236 | user_app@192.168.1.% || 3 | 7 | 2016-08-10 11:19:54 | user_yunwei@192.168.1.240 | user_yunwei@192.168.1.% |+----+-----------+---------------------+---------------------------+-------------------------+3 rows in set (0.00 sec)

 

可以看到thread_id为7的用户为user_yunwei,在192.168.1.240机器上操作删除的,完成了对数据的简单审计。
 
扩展说明:
1.init-connect只会在连接时执行,不会对数据库产生大的性能影响
2.init-connect是在连接时执行的动作命令,故可以用它来完成其它的功能,如:init_connect='SET autocommit=0'
3.init-connect不会记录拥有super权限的用户记录,为了防止init_connect语句由于语法错误或权限问题而所有用户都登陆不了的情况,保证至少super用户能登陆并修改此值

 

 
 
 
 

 

转载地址:http://lcmjl.baihongyu.com/

你可能感兴趣的文章
jetty插件java.lang.OutOfMemoryError: PermGen space内存溢出
查看>>
使用 Shell 转换 Linux 目录下的所有其他编码文本文件转为UTF-8编码
查看>>
twisted 线程池管理
查看>>
利用shell + python + expect实现类似xshell功能(测试环境:ubuntu)
查看>>
什么是web前端
查看>>
sessionStorage 、localStorage 和 cookie 之间的区别
查看>>
linux 常用流量查看命令
查看>>
Linux常用命令
查看>>
mysql数据库与数据库实例的区别
查看>>
设计模式-单例模式
查看>>
【LeetCode OJ】Climbing Stairs
查看>>
Mac 在启动eclipse时 Failed to load JavaHL Library解决方法
查看>>
Struts2表单重复提交
查看>>
【React Native开发】React Native库版本升级(Upgrading)与降级讲解
查看>>
scala
查看>>
Hibernate 映射枚举(Enum) 类型的属性
查看>>
Oracle存储过程定时执行2种方法
查看>>
微职位学习产品升级啦~
查看>>
华众被控安装提示:h1001错误提示:许可证验证失败
查看>>
我的友情链接
查看>>