原创: 李勇 京东云开发者社区 今天mysql
每家公司都但愿业务高速增加,最好能出几个爆款产品或者爆款业务,从而带动公司营收高速攀升。但站在数据库管理员的角度,这倒是实实在在的压力,业务高速增加必然带来数据量的暴增。数据库系统的选型和设计是支撑整个业务系统的重要因素。sql
MySQL数据库是基于云原生的数据库产品之一,云原生为云数据库提供了重要动力,相比于传统自建数据库,云数据库比单个数据库具备更大的弹性和可扩展性。数据库
数据库审计主要用于监视并记录对数据库服务器的各种操做行为,并记入审计日志或数据库中以便往后进行跟踪、查询、分析,以实现对用户操做的监控和审计。审计是一项很是重要的工做,也是企业数据安全体系的重要组成部分。安全
MySQL企业版自带审计功能,可是须要付费。MySQL社区版没有审计功能,基于成本的考虑,不少用户采用社区版MySQL做为业务系统数据库。采用社区版MySQL如何实现重要的审计功能,本文从自建和云服务两种状况来解答这个问题。服务器
本文自建数据库全部实验环境是基于window10下MySQL5.7这个版本。运维
方法一 Genreal Log工具
默认状况下,MySQL不开启General log; 开启General log后,MySQL将全部到达MySQL Server的SQL语句记录下来。性能
**一、**查看General Log开启状况:执行SQL命令show variables like '%general_log%’ ;能够看到默认general_log是OFF的:测试
**二、**开启General Log: 执行SQL命令set global general_log=on 然后查看general_log打开了:ui
**三、**验证: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的日志信息实现审计。
**一、**建立审计用的数据库和表:
**二、**建立具备操做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)
**三、**设置init_connect,并重启MySQL数据库在初始化参数文件[mysql]部分添加以下内容:
1log-bin=mysql-bin #开启Binlog 2init_connect='insert into auditdb.accesslog(connectionid, connectionuser,logintime) values(connection_id(),user(),now());' #设置初始化链接参数
**四、**用user1用户登陆,执行一些写入和删除的操做;
**五、**用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插件(下载地址:downloads.mariadb.org/mariadb/5.5…)
**二、**安装:把server_audit.dll复制到对应的mysql插件库中D:\mysql57\lib\plugin,执行install安装命令:
**三、**安装验证:Mysql>show variables like '%audit%'
server_audit_logging:启动或关闭审计
server_audit_events:指定记录事件的类型,能够用逗号分隔的多个值(connect,query,table) ,默认为空表明审计全部事件。
server_audit_incl_users:指定哪些用户的活动将记录,默认审计全部用户,该变量比server_audit_excl_users优先级高
server_audit_excl_users:指定哪些用户行为不记录
server_audit_output_type:指定日志输出类型,可为SYSLOG或FILE,缺省输出至审计文件
**一、**开启审计mysql>set global server_audit_logging=on
因为是验证测试,咱们其他参数都按默认设置。
**二、**执行一些数据库操做:
**三、**查看审计记录日志,server_audit.log,默认在data目录下:
咱们看见,刚才在Mysql数据库的操做都已经审计上了。
目前云计算的普及,云供应商都提供云数据库服务,固然Mysql是云数据库服务重要的一员。相比传统数据库,云数据库易于部署、管理和扩展,提供数据可靠性、安全性、运行状态监控等全套解决方案。 那么在云数据库Mysql上是如何实现对数据库的审计的呢?咱们以京东云云数据库Mysql为例,京东云的Mysql审计功能是经过MariaDB Audit Plugin插件实现的。下面给你们介绍云数据库Mysql审计的开启、使用、关闭等功能。
**一、**登陆云数据库 RDS 管理控制台;
**二、**选择须要查询 SQL 审计的目标实例,点击目标实例, 进入实例详情页,切换至 SQL 审计 Tab 页;
**三、**点击审计状态开关就能够在线切换审计的开启与关闭;
**四、**执行一些数据库的操做,然后看审计数据。审计开启后,SQL 审计查询功能说明以下:
执行时间:能够选择从当前时间往前推 7 天的时间区间,做为 SQL 审计查询的时间段;
数据库:能够查看指定数据库的 SQL 语句;
帐号:能够查看指定帐号的 SQL 语句。
**五、**点击查询按钮,查看符合要求的SQL审计结果列表:
经过上面的例子,能够看见,云数据库的管理和运维比自建数据库确实要简单不少,用户不用关心审计的方式、审计数据的存储位置等等。只不过,云数据库因为是以云服务的形式提供给最终用户,用户就须要按照云服务的要求和使用说明进行操做。
重磅来袭 *618带你上云 * 云数据库-MySQL只需1折
点击“阅读原文”了解更多详情