mysql基于init-connect的数据库审计
1、创建审计库
create database auditdb;
create table auditdb.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,
db_name varchar(50),
primary key (id)
) comment '审计用户登录信息';
2、授权所有的用户拥有对审计表的插入权限
-- 拼结授权语句
select concat("grant insert on auditdb.t_audit to '",user,"'@'",host,"';") from mysql.user;
flush privileges;
注意:
以后每添加一个用户都必须授权此表的插入权限,要不会连接不上。
3、设置init_connect参数
set global init_connect='insert into auditdb.t_audit(thread_id,login_time,localname,matchname,db_name) values(connection_id(),now(),user(),current_user(),database());';
并在配置文件中增加如下语句:
init-connect='insert into auditdb.t_audit(thread_id,login_time,localname,matchname,db_name) values(connection_id(),now(),user(),current_user(),database());'
以便下次重启时能生效。
4、验证:
使用普通用户登陆mysql,然后查看t_audit
审计表:
mysql> select * from t_audit;
+----+-----------+---------------------+--------------+--------------+---------+
| id | thread_id | login_time | localname | matchname | db_name |
+----+-----------+---------------------+--------------+--------------+---------+
| 1 | 12 | 2020-04-17 16:35:50 | u1@localhost | u1@127.0.0.1 | d1 |
| 2 | 14 | 2020-04-17 16:36:23 | u1@localhost | u1@127.0.0.1 | d2 |
| 3 | 15 | 2020-04-19 15:08:48 | u1@localhost | u1@127.0.0.1 | d3 |
+----+-----------+---------------------+--------------+--------------+---------+
至此,完成了对数据的简单审计。
5、扩展说明:
1.init-connect只会在连接时执行,不会对数据库产生大的性能影响
2.init-connect不会记录拥有super权限的用户记录,为了防止init_connect语句由于语法错误或权限问题而所有用户都登陆不了的情况,保证至少super用户能登陆并修改此值