10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

MySQL 数据库安全之审计

  • 2019-10-24
  • 本文字数:2722 字

    阅读完需:约 9 分钟

MySQL数据库安全之审计

每家公司都希望业务高速增长,最好能出几个爆款产品或者爆款业务,从而带动公司营收高速攀升。但站在数据库管理员的角度,这却是实实在在的压力,业务高速增长必然带来数据量的暴增。数据库系统的选型和设计是支撑整个业务系统的重要因素。

MySQL 数据库是基于云原生的数据库产品之一,云原生为云数据库提供了重要动力,相比于传统自建数据库,云数据库比单个数据库具有更大的弹性和可扩展性。


数据库审计主要用于监视并记录对数据库服务器的各类操作行为,并记入审计日志或数据库中以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分。


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 #开启Binlog2init_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 数据的审计。

一、下载与安装

1、下载 MariaDB Audit Plugin 插件 下载地址



2、安装:把 server_audit.dll 复制到对应的 mysql 插件库中 D:\mysql57\lib\plugin,执行 install 安装命令:



3、安装验证: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,缺省输出至审计文件

三、审计过程示例

1、开启审计 mysql>set global server_audit_logging=on



由于是验证测试,我们其余参数都按默认设置。


2、执行一些数据库操作:



3、查看审计记录日志,server_audit.log,默认在 data 目录下:



我们看见,刚才在 Mysql 数据库的操作都已经审计上了。

使用公有云 RDS 服务的场景

目前云计算的普及,云供应商都提供云数据库服务,当然 Mysql 是云数据库服务重要的一员。相比传统数据库,云数据库易于部署、管理和扩展,提供数据可靠性、安全性、运行状态监控等全套解决方案。


那么在云数据库 Mysql 上是如何实现对数据库的审计的呢?我们以京东云云数据库 Mysql 为例,京东云的 Mysql 审计功能是通过 MariaDB Audit Plugin 插件实现的。下面给大家介绍云数据库 Mysql 审计的开启、使用、关闭等功能。


1、登录云数据库 RDS 管理控制台;


2、选择需要查询 SQL 审计的目标实例,点击目标实例, 进入实例详情页,切换至 SQL 审计 Tab 页;


3、点击审计状态开关就可以在线切换审计的开启与关闭;


4、执行一些数据库的操作,而后看审计数据。审计开启后,SQL 审计查询功能说明如下:


  • 执行时间:可以选择从当前时间往前推 7 天的时间区间,作为 SQL 审计查询的时间段;

  • 数据库:可以查看指定数据库的 SQL 语句;

  • 账号:可以查看指定账号的 SQL 语句。


5、点击查询按钮,查看符合要求的 SQL 审计结果列表:



通过上面的例子,可以看见,云数据库的管理和运维比自建数据库确实要简单很多,用户不用关心审计的方式、审计数据的存储位置等等。只不过,云数据库由于是以云服务的形式提供给最终用户,用户就需要按照云服务的要求和使用说明进行操作。


2019-10-24 22:452381

评论

发布
暂无评论
发现更多内容

专访 KubeVela 核心团队:如何简化云原生复杂环境下的应用交付和管理

阿里巴巴中间件

阿里云 云原生 OAM KubeVela

【OH干货】 告别代码,让Openharmony软总线测试用例跑起来!!!

拓维信息

分布式软总线 OpenHarmony

一文弄懂Linux下五种IO模型

Linux服务器开发

epoll Linux服务器开发 Linux后台开发 select IO复用

团队需要移动CRM系统的原因

低代码小观

移动 CRM 客户关系管理 CRM系统 客户关系管理系统

华云数据与龙蜥社区完成产品兼容互认证,携手推动开源生态体系建设与发展

OpenAnolis小助手

云计算 开源社区 生态体系 华云数据 兼容互认证

【Altium Designer】工程的组成 & 创建

謓泽

3月月更

每周问答精选:PolarDB 和 PolarDB-X 的区别是什么?

阿里云数据库开源

数据库 阿里云 开源 polarDB

云计算时代服务器运维就用行云管家!功能齐全,福利多多!

行云管家

云计算 云管平台 服务器运维

百万大数据错题笔记

Clarke

一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点

阿里巴巴中间件

阿里云 云原生 中间件 蓝绿发布 A/B 测试

知识社会的到来:知识管理与知识协同

小炮

知识管理

网络安全kali之利用宏感染word文档获取shell

侠盗安全

网络安全 kali kali Linux

华米科技 x StarRocks:让智能穿戴数据焕发新活力

StarRocks

数据库 数据分析 StarRocks

手把手教你搭建博客

亚马逊云科技 (Amazon Web Services)

MapReduce的Shuffle过程及Hadoop优化(包括:压缩、小文件、集群优化)

编程江湖

Apache ShardingSphere Agent 可观察性实用指南

SphereEx

数据库 ShardingSphere SphereEx apache 社区

物联网——智能点灯搭建

kof11321

面试高并发,凉了!!(全程高能,建议收藏)

冰河

并发编程 多线程 高并发 协程 异步编程

RadonDB MySQL on Kubernetes 2.1.3 发布!

RadonDB

MySQL 数据库 Kubernetes 高可用 RadonDB

【IT运维】传统运维与云运维到底有什么不同呢?

行云管家

云计算 IT运维 云运维

SpringBoot性能怎样优化

编程江湖

从 0 到 1 教你在亚马逊云科技中部署动态网站 Typecho 系统

亚马逊云科技 (Amazon Web Services)

php 亚马逊 typecho

科创人·36氪副总裁王坤:企服产品应重视使用者体验,36氪将推出中国版「魔力象限」

科创人

企业服务

【高效开发】不止面对面,Cloud Studio 推出 MetaWork 云协作套件

CODING DevOps

疫情 协同办公 Cloud Studio 云端编码

Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker

阿里巴巴中间件

云计算 阿里云 云原生 中间件 sealer

带你详细了解mongodb数据库

编程江湖

云效代码管理 Codeup 是什么?别说你还不知道

阿里云云效

阿里云 DevOps 云原生 云效 Codeup

业内高规格!数字峰会七大板块之一,行业盛会诚邀采购商莅临!

科技热闻

领域驱动设计入门与实践[上]

LigaAI

领域驱动设计与实践

Figma断供大疆,对国产设计软件的启示

ToB行业头条

SaaS tob 国产替代

Flink Watermark 机制及总结

腾讯云大数据

大数据 flink 实战 流计算 Oceanus

MySQL数据库安全之审计_架构_李勇_InfoQ精选文章