数据库DDL审计
一、为什么需要数据库DDL审计?
DDL在生产系统中扮演非常重要的作用。
1)首先从业务角度来说,DDL可能意味着表结构变更,意味着新的版本即将发布,是个重要的时刻。
2)其次从运维角度来说,DDL尤其是针对大表的DDL,耗时一般在小时级别,且任何不当操作,都有可能造成系统被锁死
3)最后从版本发布角度来看,如果能记录系统表结构变更的历史,对于理解整个系统是大有裨益的
因此针对线上DDL,每个公司都会有相关的规定。比如线上DDL,必须在凌晨1:00到早上5:00之间,防止对业务造成影响;或者做DDL操作前,需要提前备案等。
二、怎么做数据库DDL审计?
目前已知的做MySQL DDL审计的产品有如下几种。
1)Oracle官方提供的收费版audit plugin
2)Percona提供的开源audit plugin
3)Mariadb提供的开源audit plugin
4)安全厂商Macafee提供的开源audit plugin
从功能上来说,Oracle官方版本和Percona版本的audit plugin的审计策略包括
A)登录
B)查询
C)登录、查询
可以看出其并不提供只针对DDL操作的记录,因此并不是一款理想的DDL审计产品。
Mariadb的audit plugin拥有更细粒度的控制,比如只记录DDL。但是当我把server_audit.so安装到Oracle官方版本的MySQL上时,客户端连接数据库报错
mysql -h192.168.15.128 -P3319 -utest -p test
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0
至于Macafee的audit plugin性能,在超过十个用户并发时,性能会下降到60%左右。(http://www.cnblogs.com/cenalulu/archive/2012/11/12/mysql_audit_plugin_test.html)
上面的链接是一位大众点评DBA在2012年做的测试,时隔四年之后是否有性能提升,还需要做测试。
为了尽快得到一个测试结果,我在虚拟机(2core,2G,50G的SSD)上运行。
测试语句 : select id from tb1;
环境1:无audit plugin
环境2:开启audit plugin,注:默认记录所有行为
环境3:开启audit plugin,但只记录ddl
其QPS分别为:15042 ,5507 , 15000
从测试结果中可以看出,在记录所有行为时,性能会下降60%以上。
另外在使用过程中,我运行
uninstall plugin AUDIT
导致数据库意外重启
报错信息如下。
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (7fa29c0054c0): uninstall plugin AUDIT
Connection ID (thread ID): 2
Status: NOT_KILLED
因此建议大家慎重考虑这款产品的成熟度。
三、基于binary log的解决方案
binary log记录了数据库的所有数据写入操作和DDL操作。因此可以利用binary log中的信息,去获得系统中所有的DDL。相对于其他方式,有如下优点
- 无须侵入数据库内部代码,避免降低数据库稳定性
- 对系统性能没有明显影响
- 部署方式灵活。既可以与数据库部署在同一台机器上,也可以远程部署在不同机器上。
基于上述几点,我选择使用binlog方案。在mysqlbinlog代码的基础上,增加过滤DDL事件并插入到目标数据库的功能。其用法为:
./mysqlbinlog --host=192.168.15.128 --port=3319 --user=test --password=test --read-from-remote-server --stop-never --protocol=tcp --host-target=192.168.15.128 --port-target=3319 --user-target=test --password-target=test --db-target=test 3319.000127
注意target参数为扩展参数。
执行后,可以从数据库表中看到DDL事件。
mysql> select * from ddlevent\G
*************************** 1. row ***************************
query: create table suck9(id int)
executiontime: 1481374445
hostname: 192.168.15.128
port: 3319
endlogpos: 363
logname: 3319.000089
*************************** 2. row ***************************
query: create table suck10(id int)
executiontime: 1481374506
hostname: 192.168.15.128
port: 3319
endlogpos: 529
logname: 3319.000089
*************************** 3. row ***************************
query: create table suck11(id int)
executiontime: 1481374550
hostname: 192.168.15.128
port: 3319
endlogpos: 695
logname: 3319.000089
四、youge DDL audit
为了使DDL audit不是一个DBA专属的玩具,而是一个运维管理人员,甚至公司管理人员都可以使用的产品。我增加了相关界面。
首页为:

点击明细,查看某时间段内,所有server的具体DDL违规事件

五、欢迎提出宝贵意见
首先写这篇文章,是想获得初期的反馈。如果喜欢的人多的话,我会把它再优化一下,并放出来供大家下载使用。
数据库DDL审计的更多相关文章
- 数据库DDL语句书写规范
数据库DDL语句书写规范 1.SQL语句编写说明编写SQL语句应遵循统一的规范,包括大小写.空格.换行.缩进等等,只有完全一样的SQL才能在数据库中共享,从而减少硬解析. 字段类型.长度:根据数据情况 ...
- 0818基于360开源数据库流量审计MySQL Sniffer
开源数据库流量审计MySQL Sniffer 我最推崇的数据库安全产品就是基于流量的数据库审计,因为它不需要更改网络结构,并且也是最关键的是,不影响数据库服务器性能,不用苦口婆心的劝数据库管理员安装监 ...
- Oracle 数据库SQL审计
在我们日常的工作中,一些安全性的要求高的数据库需要增加审计操作,哪个用户什么时间做了什么操作. 1.打开数据库的审计 alter system set audit_sys_operations=TRU ...
- oracle表ddl审计
============= 表ddl 审计============== 1.table信息 SQL> select * from test; ID CUST_CREDIT_LIMIT TIME ...
- 数据库DDL、DML、DCL、DQL、DPL、CCL的全称和使用
数据库DDL.DML.DCL.DQL.DPL.CCL的全称和使用 简介: SQL (Structure Query Language):结构化查询语言,一种特殊目的的编程语言,一种数据库查询和程序设计 ...
- SQLServer 创建服务器和数据库级别审计
概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...
- SQL Server 创建服务器和数据库级别审计
一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...
- 数据库DDL操作
DDL1. 数据库* 查看所有数据库:SHOW DATABASES* 切换(选择要操作的)数据库:USE 数据库名* 创建数据库:CREATE DATABASE [IF NOT EXISTS] myd ...
- 数据库DDL
自己对数据库的整理,也是对自己知识的梳理 SQL ( Structure query language ) 结构化查询语言 SQL语言分为4个部分 1.DDL(Data Definition Lang ...
随机推荐
- js基础练习二之简易日历
今天学到了js基础教程3,昨天的课后练习还没来的及做,这个是类似简易日历的小案例,视频还没听完,今晚继续...... 先看效果图: 其实做过前面的Tab选项卡,这个就很好理解了,通过鼠标放在不同月份月 ...
- asp.net5 Area的处理
Controller加上Attribute [Area("SystemSecurity")] startup中配置 app.UseMvc(routes => { // Are ...
- asp.net MVC3 无法打开项目文件“E:\我们的项目\Project\HeatingMIS.Web\HeatingMIS.Web.csproj”。此安装不支持该项目类型。
在vs中打开mvc3项目,虽然装了mvc3,但是还是会遇到莫名其妙的错误,这是我在做开发的时候遇到的一个问题,附带解决方案,和大家分享一下 问题描述:无法打开项目文件“E:\我们的项目\Project ...
- html与css面试结合工作的总结难点
面试的时候一般会常常问起的,同时也是工作的时候会常常问道的几个问题,一下之列表内容,详细的后会附有文章,希望能帮到大家,同时有不足希望大家多多补充交流. 1.主要是的是浮动的问题(常见的问题有,三列布 ...
- World Wind .NET开发
World Wind .NET开发
- u-boot移植 III
延续上一篇, 烧录完成后, 串口屁毛都没有了, 运行了代码比较工具, 看看问题在哪. board/100ask24x0/ 没有问题, 除了lowlevel_init.S, 不过我没在uboot中用 ...
- php 两段文本对比,不同的文字显示高亮
php 两段文本对比,不同的文字显示高亮[下面这个只能区分错误后面的..] <?php $str1 ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg ...
- 最近几天玩freebsd奋斗成果总结
玩freebsd发现真的很累人..相信如下问题第一次玩freebsd都遇到过: 安装系统默认只有文本模式,需要手工安装gnome,kde等desktop environment. Freebsd安装. ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- ajax 跨域请求
1. $.ajax({ type: "get", async: false, url: "http://61.160.194.208:8383/Api/login?acc ...