MySql数据库之审计(开启log+设置init-connect实现无插件审计)

Posted 地球太危险了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql数据库之审计(开启log+设置init-connect实现无插件审计)相关的知识,希望对你有一定的参考价值。

目录

一、查询审计配置情况

二、永久开启审计

三、临时开启审计

四、设置init-connect

1、创建用于存放连接日志的数据库和表

2、授权某个用户拥有对审计表的select和insert权限

3、设置init_connect参数

五、验证

六、番外

注:有关MySql数据库的其他操作请参见MySql目录进行查找。


一、查询审计配置情况

show global variables like 'log_timestamps';
show global variables like '%general%';

解释:可以看到 log 时间戳是系统时间;此时 log 功能没打开;log 文件放在/var/lib/mysql/jdh.log下,注意这个 log 存放路径是默认的,每个人不一样,根据你自己的情况而定。


二、永久开启审计

注:若想系统重启后还能生效,就需要按如下操作,若临时用一下只需参看【三、临时开启审计】。

vim /etc/mysql/my.cnf
在/etc/mysql/my.cnf中添加下述配置

[mysqld]
general_log = on                                          // on为开启;off为关闭
general_log_file = /var/lib/mysql/jdh.log         // 审计信息存储位置
log_timestamps = SYSTEM                                // 设置日志文件的输出时间为地方时

解释:经验证,其实在mysql中只要打开log开关就会一直开着,也无需在配置文件中进行配置。

注意:上方的 my.cnf 配置文件为我的 linux 服务器上的 mysql 配置文件默认地址,不同系统和不同版本的 mysql 可能不一样。


三、临时开启审计

在mysql中执行以下命令
set global general_log = on;
set global general_log_file = /var/lib/mysql/jdh.log     注:log 保存文件需要改成你自己的,一般是默认路径,就不用改了。
set global log_timestamps = SYSTEM;

解释:基本会默认时间戳和 log 文件位置。大多数只需要第一条命令打开 log 开关就行了。

到此为止我们已经打开了审计得功能,但这只是记录了所有的对数据库的操作,所以接下来我们将通过 init-connect+binlog 来实现相对完整的审计功能。

四、设置init-connect

1、创建用于存放连接日志的数据库和表

create 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 '审计用户登录信息';

2、授权某个用户拥有对审计表的select和insert权限

列出授权所有用户的语句:
select concat("grant insert on auditlog.t_audit to '",user,"'@'",host,"';") from mysql.user;  #拼结授权语句
注:这条语句只是列出了所有语句,需要手动复制再授权一下。
授权某个用户的格式:
grant select,insert on auditlog.t_audit to user@localhost identified by ‘password’;

先创建一个临时用户进行验证:

CREATE USER U1;

再给用户U1赋予对表Student操作的一定权限:

GRANT SELECT, DELETE ON TABLE Student TO U1;

所以以上授权为例:grant select,insert on auditlog.t_audit to U1;

注意: 对于所有的普通级别的用户,必须全部都要对日志表具有读写权限, 否则将导致没有权限的用户无法使用数据库。

3、设置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());'

以上语句以便下次重启时能生效。

五、验证

我们使用新用户 U1 登陆,查看审计表 auditlog.t_audit 是否记录了本次登陆,并尝试能否删除。

接下来使用本用户进行一系列的操作,然后退出。

进入 log 查看删除记录,找出删除的那条记录时间。

登陆 root 用户,查看审计表 auditlog.t_audit 并找出删除记录的人。

发现用户 U1 在2019-05-07 15:18:56 登陆了。

而查看 log 日志发现用户 U1 用户在登陆期间做了删除操作,且登陆时间与 log 表中记录一致,且线程 ID 也一致。铁证如山!

六、番外

access-log表如何维护?

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

为什么开启了已经保存了所有的操作和用户信息还需要再建立一个表保存用户的登陆信息呢?

1、无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。因此加了表后可以根据一个大体的操作时间来进行筛选出这个时间段中执行这个操作的登陆用户的thread_id,然后再在表中查找这个thread_id号是哪个用户登陆的就可以很快筛选出执行具体某个操作的用户了。

2、因为新建的表普通用户没有权限删除记录,而log文件时可以删除记录的,所以若没有审计表的话若普通用户能接触保存log的那台主机,则能手动删除。

注:有关MySql数据库的更多其他操作请参见MySql目录进行查找。(建议收藏)

参考博文:

mysql数据库开启审计功能_背锅浩的博客-CSDN博客_mysql开启审计功能

mysql基于init-connect+binlog完成审计功能 - 泽锦 - 博客园

以上是关于MySql数据库之审计(开启log+设置init-connect实现无插件审计)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL利用init-connect增加访问审计功能异常

Mysql的审计插件

mysql日志全部都没有开启,怎么回事

如何开启PHP日志功能?

0816关于MySQL的审计 init-connect+binlog实现用户操作追踪

安装mysql 开启服务时出错/etc/init.d/mysqld: line 264: 的解决办法