数据库审计主要用于监视并记录对数据库服务器的各类操作行为,并记入审计日志或数据库中以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分。
MySQL 企业版自带审计功能,但是需要付费。MySQL 社区版没有审计功能,基于成本的考虑,很多用户采用社区版 MySQL 作为业务系统数据库。采用社区版 MySQL 如何实现重要的审计功能,本文从自建和云服务两种情况来解答这个问题。
自建 MySQL 数据库的场景
本文自建数据库所有实验环境是基于 window10 下 MySQL5.7 这个版本。
方法一 Genreal Log
默认情况下,MySQL 不开启 General log; 开启 General log 后,MySQL 将所有到达 MySQL Server 的 SQL 语句记录下来。
开启 General log 步骤:
1、查看 General Log 开启情况:执行 SQL 命令 show variables like '%general_log%’ ;可以看到默认 general_log 是 OFF 的:
2、开启 General Log: 执行 SQL 命令 set global general_log=on 而后查看 general_log 打开了:
3、验证:general_log 打开后,所有 SQL 的访问都会记录在 general_log_file 指向的日志文件。我们执行几个 SQL 语句测试:
而后查看 ZB-PF11H2E3.log 日志文件里面的内容,我们看到刚才做的操作都已经记录在日志里了:
开启 General Log 只要用户执行了操作,无论对错,MySQL 就会记录日志,这样的话日志量会非常庞大,对数据库效率有影响。所以我们一般不建议开启开功能,个别情况下可能会临时的开一段时间以供排查故障等使用。
方法二 BinLog+Init_connect
BinLog 是 MySQL 操作时留下的日志,BinLog 一方面可以用在数据库的恢复与主从复制上,另外一方面可以用来做数据库的审计。
由于 BinLog 日志里面无法查询是谁在哪个时间段登录的等信息,缺少审计必要的信息。在 MySQL 中,每个连接都会先执行 init_connect 进行连接的初始化,我们可以在这里获取用户的登录名称和 thread ID 值。然后配合 BinLog,就可以追踪到每个操作语句的操作时间,操作人等信息,再加上 BinLog 的日志信息实现审计。
配置和验证过程如下:
1、创建审计用的数据库和表:
2、创建具有操作 auditdb 数据权限的用户:
如果已经有用户,需要对现有用户添加操作 auditdb 的权限:
1MySQL> insert into mysql.db (Host,Db,User1,Insert_priv) values ('%','auditdb','','Y');
2Query OK, 1 row affected (0.03 sec)
3MySQL> flush privileges;
4Query OK, 0 rows affected (0.00 sec)
复制代码
3、设置 init_connect,并重启 MySQL 数据库在初始化参数文件[mysql]部分添加如下内容:
1log-bin=mysql-bin #开启Binlog
2init_connect='insert into auditdb.accesslog(connectionid, connectionuser,logintime) values(c
复制代码
4、用 user1 用户登录,执行一些写入和删除的操作;
5、用 mysqlbinlog 工具查看 BinLog,根据 delete 操作找到相应的 ThreadId,而后在前面创建的审计日志表 auditdb.accesslog 里面根据 ThreadID 找到用户登录信息:
查看当前 binlog mysqlbin.000029 的内容,并找到 delete 操作对应的 ThreadID D:\mysql57\bin>mysqlbinlog…/data/mysql-bin.000029
从 Binlog 中可以得知删除 Test2 表对应的 threadid 是 8,根据 ThreadID 在审计表里查看用户的登录信息,可以得知这个删除操作是 user1 用户在本机执行的操作。
说明: 采用这种方式进行审计,由于 init-connect 只会在连接时执行,不会对数据库产生大的性能影响,但是 init-connect 不会记录拥有 root 权限的用户记录.
方法三 使用审计插件
除了商业版的审计插件外,常见的还有三类审计插件 Percona Audit Log Plugin、MariaDB Audit Plugin、McAfee MySQL Audit Plugin。这几个插件功能上大同小异,只是展示的内容和格式略有不同。
我们以 MariaDB Audit Plugin 为例,给大家介绍如何采用插件的方式实现对 Mysql 数据的审计。
一、下载与安装
下载 MariaDB Audit Plugin 插件下载地址
安装:把 server_audit.dll 复制到对应的 mysql 插件库中 D:\mysql57\lib\plugin,执行 install 安装命令:
安装验证:Mysql>show variables like ‘%audit%’
二、关键审计参数说明
三、审计过程示例
开启审计 mysql>set global server_audit_logging=on
由于是验证测试,我们其余参数都按默认设置。
执行一些数据库操作:
查看审计记录日志,server_audit.log,默认在>
我们看见,刚才在 Mysql 数据库的操作都已经审计上了。
使用公有云 RDS 服务的场景
目前云计算的普及,云供应商都提供云数据库服务,当然 Mysql 是云数据库服务重要的一员。相比传统数据库,云数据库易于部署、管理和扩展,提供数据可靠性、安全性、运行状态监控等全套解决方案。
那么在云数据库 Mysql 上是如何实现对数据库的审计的呢?我们以京东云云数据库 Mysql 为例,京东云的 Mysql 审计功能是通过 MariaDB Audit Plugin 插件实现的。下面给大家介绍云数据库 Mysql 审计的开启、使用、关闭等功能。
登录云数据库 RDS 管理控制台;
选择需要查询 SQL 审计的目标实例,点击目标实例, 进入实例详情页,切换至 SQL 审计 Tab 页;
点击审计状态开关就可以在线切换审计的开启与关闭;
执行一些数据库的操作,而后看审计数据。审计开启后,SQL 审计查询功能说明如下:
点击查询按钮,查看符合要求的 SQL 审计结果列表:
通过上面的例子,可以看见,云数据库的管理和运维比自建数据库确实要简单很多,用户不用关心审计的方式、审计数据的存储位置等等。只不过,云数据库由于是以云服务的形式提供给最终用户,用户就需要按照云服务的要求和使用说明进行操作。