Mysql版本: 5.6.24-72.2

一、通过init-connect + binlog 实现MySQL审计功能

基本原理:

由于审计的关键在于DML语句,而所有的DML语句都可以通过binlog记录。

不过遗憾的是目前MySQL binlog 中只记录,产生这条记录的connection id(随连接数自增,循环使用),这对之后的反查没有任何帮助。

因此考虑通过init-connect,在每次连接的初始化阶段,记录下这个连接的用户,和connection_id信息。

在后期审计进行行为追踪时,根据binlog记录的行为及对应的connection-id 结合 之前连接日志记录 进行分析,得出最后的结论

1. 设置init-connect :

1.1创建用于存放连接信息的表

create database AuditDB default charset utf8;
use AuditDB;
CREATE TABLE accesslog (`id` int(11) primary key auto_increment, `LoginTime` timestamp, `LocalName` varchar(30), `MatchName` varchar(30));

1.2 保证所有的用户对此表有写权限

use mysql;
insert into db (Host,Db,User,Insert_priv) values ('%','AuditDB','','Y');
flush privileges;

1.3 设置init-connect

在my.cnf 中的 [mysqld] 的block 添加以下配置;

init-connect='insert into AuditDB.accesslog (id,LoginTime,LocalName,MatchName) values (connection_id(),now(),user(),current_user());'

这里必须开启binlog:
log-bin=xxx

1.4 重启数据库生效

service mysql restart

2. 测试:

2.1 创建用户, 授权。 创建表

CREATE USER 'monitor'@'localhost' IDENTIFIED BY '123456';
grant all on maildb.* to monitor@'%';
mysql -h localhost -umonitor -p123456 -D maildb
create table test1 (name varchar(32), id int(11));

  

2.2 查询每次登录的记录:

mysql -h localhost -umonitor -p123456
select * from AuditDB.accesslog;

查找是谁创建的test1表,先在binlog中查找到创建表时候的thread_id

[root@Node_01 ~]# mysqlbinlog /usr/local/mysql/binlog/binlog.000021 |grep --color 'test1' -B 5
#150917 12:41:43 server id 11 end_log_pos 939 CRC32 0x5691b7f5 Xid = 20
COMMIT/*!*/;
# at 939
#150917 12:42:18 server id 11 end_log_pos 1066 CRC32 0xde7951a0 Query thread_id=4(此处) exec_time=0 error_code=0
SET TIMESTAMP=1442464938/*!*/;
create table test1 (name varchar(32), id int(11))

  

根据 thread_id 在 AuditDB.accesslog 对应 id字段: 就可以查出这是 monitor@localhost 干的了.

mysql> select * from AuditDB.accesslog where id=4;
+----+---------------------+-------------------+-------------------+
| id | LoginTime | LocalName | MatchName |
+----+---------------------+-------------------+-------------------+
| 4 | 2015-09-17 12:41:43 | monitor@localhost | monitor@localhost |
+----+---------------------+-------------------+-------------------+

  

3. Q&A

Q:使用init-connect会影响服务器性能吗?

A:理论上,只会在用户每次连接时往数据库里插入一条记录,不会对数据库产生很大影响。除非连接频率非常高(当然,这个时候需要注意的就是如何进行连接复用和控制,而非是不是要用这种方法的问题了)

Q:access-log表如何维护?

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

Q:表有其他用途么?

A:有!access-log表当然不只用于审计,当然也可以用于对于数据库连接的情况进行数据分析,例如每日连接数分布图等等,只有想不到没有做不到。

Q:会有遗漏的记录吗?

A:会的,init-connect 是不会在super用户登录时执行的。所以access-log里不会有数据库超级用户的记录,这也是为什么我们不主张多个超级用户,并且多人使用的原因。

参考: http://www.cnblogs.com/cenalulu/archive/2012/05/09/2491736.html

二、macfee公司基于percona开发的mysql audit 插件:

wiki首页:https://github.com/mcafee/mysql-audit/wiki

二进制包下载:https://bintray.com/mcafee/mysql-audit-plugin/release包含了5.1,5.5,5.6对应的二进制包

下载: https://bintray.com/artifact/download/mcafee/mysql-audit-plugin/1.0.8/audit-plugin-mysql-5.6-1.0.8-527-linux-x86_64.zip

1 安装配置插件

1.1 解压:

unzip audit-plugin-mysql-5.6-1.0.8-527-linux-x86_64.zip

  

1.2 查看mysql插件目录:

mysql> SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
+---------------+------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------+
| plugin_dir | /usr/local/mysql/lib/mysql/plugin/ |
+---------------+------------------------------------+

  

1.3 复制下载的so文件至plugin_dir,创建日志目录

cd audit-plugin-mysql-5.6-1.0.8-527
cp lib/libaudit_plugin.so /usr/local/mysql/lib/mysql/plugin/
mkdir /usr/local/mysql/audit_log/
chown mysql.mysql /usr/local/mysql/audit_log/

  

1.4 下载offset脚本,根据版本计算
offsets具体可以参考https://github.com/mcafee/mysql-audit/wiki/Troubleshooting

wget https://raw.github.com/mcafee/mysql-audit/master/offset-extract/offset-extract.sh
# chmod +x offset-extract.sh
# ./offset-extract.sh /usr/local/mysql/bin/mysqld
//offsets for: /usr/local/mysql/bin/mysqld (5.6.24-72.2)
{"5.6.24-72.2","c518d31ce76de4d470fcf2712877712e", 7680, 7728, 4384, 5024, 88, 2720, 96, 0, 32, 104, 152, 7848},

  

1.5:配置my.cnf,在mysqld块里面加入以下内容:

plugin-load=AUDIT=libaudit_plugin.so
audit_offsets=7680, 7728, 4384, 5024, 88, 2720, 96, 0, 32, 104, 152, 7848
audit_json_file=ON
audit_json_log_file=/usr/local/mysql/audit_log/mysql-audit.json
audit_record_cmds=insert,delete,update,create,drop,revoke,alter,grant,set #针对这些语句来审计

  

1.6 重启mysql数据库

service mysql restart

  

2.1 验证是否生效:

查看版本:

mysql> SHOW GLOBAL STATUS LIKE 'AUDIT_version';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| Audit_version | 1.0.8-527 |
+---------------+-----------+

  

查看是否开启:

mysql> SHOW GLOBAL VARIABLES LIKE 'audit_json_file';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| audit_json_file | ON |
+-----------------+-------+

  

可以创建一个test1表,查看/usr/local/mysql/audit_log/mysql-audit.json文件中会有记录.

2.2 重要的参数说明:

1. audit_json_file #是否开启audit功能
2. audit_json_log_file #记录文件的路径和名称信息
3. audit_record_cmds #audit记录的命令,默认为记录所有命令可以设置为任意dml、dcl、ddl的组合
如:audit_record_cmds=select,insert,delete,update
还可以在线设置set global audit_record_cmds=NULL(表示记录所有命令)

其他配置参数参考: https://github.com/mcafee/mysql-audit/wiki/Configuration

mysql审计实现方法的更多相关文章

  1. MySQL审计工具Audit Plugin安装使用

    本实验的审计插件均是安装在 mysql-community-server-5.7.9 的服务器上. 插件安装(社区版) 插件下载地址: https://bintray.com/mcafee/mysql ...

  2. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  3. 查看mysql数据库版本方法总结

    当你接手某个mysql数据库管理时,首先你需要查看维护的mysql数据库版本:当开发人员问你mysql数据库版本时,而恰好你又遗忘了,那么此时也需要去查看mysql数据库的版本............ ...

  4. linux忘记mysql密码找回方法

    linux忘记mysql教程密码找回方法 今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦.    方法一: # /etc/init. ...

  5. Linux 每天自动备份mysql数据库的方法

    Linux 每天自动备份mysql数据库的方法 作者: 字体:[增加 减小] 类型:转载   linux下为了安全有时候需要自动备份mysql数据库,下面是具体的实现步骤.   /usr/bin为my ...

  6. Windows Server 2003开机自动启动MySQL服务设置方法

    Windows Server 2003开机自动启动MySQL服务设置方法 发布时间:2014-12-19 更新时间:2014-12-24 来源:网络 作者:eaglezhong 关键词: 2003 e ...

  7. linux下使用crontab定时备份MYSQL数据库的方法:

    摘要 linux下使用crontab定时备份MYSQL数据库的方法: 只需按照下面3步做,一切都在你的掌控之下: 第一步:在服务器上配置备份目录代码: ------------------------ ...

  8. .NET连接MySQL数据库的方法实现

    突然对.NET连接MySQL数据库有点兴趣,于是乎网上到处找资料,学习MySQL的安装,MySQL的使用等等等等,终于搞定了! 最终效果就是显示数据库中数据表的数据: 首先,当然要有MySQL数据库啦 ...

  9. (转载)查看三种MySQL字符集的方法

    (转载)http://database.51cto.com/art/201010/229171.htm MySQL字符集多种多样,下面为您列举了其中三种最常见的MySQL字符集查看方法,该方法供您参考 ...

随机推荐

  1. win10 安装git

    http://jingyan.baidu.com/article/a3a3f811d4cd308da2eb8ad1.html 双击exe安装包,在弹出的安全提示中点击“允许”.   安装向导的头两步都 ...

  2. GridView数据绑定控件的模版列时设置显示的格式

    形式 语法 结果 数字 {0:N2} 12.36   数字 {0:N0} 13   货币 {0:c2} $12.36   货币 {0:c4} $12.3656   货币 "¥{0:N2}&q ...

  3. elasticsearch 查询模板

    简单版示例: 2.x版本(相比于1.x版本,使用bool替代filtered,使用must替代query) { "query": { "bool": { &qu ...

  4. PHP_EOL是什么意思?

      PHP_EOL 代表php的换行符, 这个变量会根据平台而变, 在windows下会是/r/n, 在linux下是/n, 在mac下是/r             文章来源:刘俊涛的博客 地址:h ...

  5. Solaris磁盘配额

    磁盘配额:就跟汽车行驶速度一样.我们设定. 添加rq标志,使其支持配额功能. 命令:quota ,打开就是quotaon 对ZFS文件系统进行设置配额: 当设置quota=none 则可以取消配额设置 ...

  6. Cursor类用法:

      Cursor类用法:   http://www.2cto.com/kf/201109/103163.html   Ctrl+Shift+G 查找类.方法和属性的引用.这是一个非常实用的快捷键,例如 ...

  7. 转:Hadoop和Spark的异同

    转自:http://www.techweb.com.cn/network/system/2016-01-25/2267414.shtml 谈到大数据,相信大家对Hadoop和Apache Spark这 ...

  8. LeetCode 第 3 题(Longest Substring Without Repeating Characters)

    LeetCode 第 3 题(Longest Substring Without Repeating Characters) Given a string, find the length of th ...

  9. Python 模块之 ConfigParser: 用 Python 解析配置文件

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在 Python 里更是如此,在官方发布的库中就包含有做这件事情的库,那就是 ConfigParser,这里简单的做 ...

  10. CUGBACM_Summer_Tranning1 二进制枚举+模拟+离散化

    整体感觉:这个组队赛收获还挺多的.自从期末考试以后已经有一个多月没有 做过组队赛了吧,可是这暑假第一次组队赛就找回了曾经的感觉.还挺不错的!继续努力!! 改进的地方:这次组队赛開始的时候题目比較难读懂 ...