MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子

简介

Part1:写在最前

MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿。

MariaDB如何审计,可移步:

http://suifu.blog.51cto.com/9167728/1857594

准备

Part1:创建所需库

[[email protected] telegraf]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 859
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> create database auditdb;
Query OK, 1 row affected (0.00 sec)

Part2:创建所需表

[[email protected] ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 266
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use auditdb;
Database changed

mysql> CREATE TABLE accesslog (
    -> ID INT (10) UNSIGNED NOT NULL PRIMARY KEY auto_increment,
    -> ConnectionID INT (10) UNSIGNED,
    -> ConnUser VARCHAR (30) NOT NULL DEFAULT ‘‘,
    -> MatchUser VARCHAR (30) NOT NULL DEFAULT ‘‘,
    -> LoginTime datetime
    -> );
Query OK, 0 rows affected (0.02 sec)

Part3:在my.cnf中添加

init-connect=‘Insert into auditdb.accesslog(ConnectionID ,ConnUser ,MatchUser ,LoginTime)values(connection_id(),user(),current_user(),now());‘

并重启数据库

[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS!

测试

Part1:环境

[[email protected] ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 266
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use auditdb;

mysql> use helei;
Database changed

mysql> select * from t1;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
+----+
8 rows in set (0.00 sec)

Part2:用不同用户登录操作

[[email protected] telegraf]# mysql -uhelei -pMANAGER
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 185
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use helei;
Database changed

mysql> select * from t1;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
+----+
8 rows in set (0.00 sec)

mysql> delete from t1 where id = 2;
Query OK, 1 row affected (0.00 sec)

mysql> delete from t1 where id = 4;
Query OK, 1 row affected (0.00 sec)

[[email protected] telegraf]# mysql -uyuhao -pMANAGER
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 185
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use helei;
Database changed

mysql> select * from t1;
+----+
| id |
+----+
|  3 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
+----+
8 rows in set (0.00 sec)

mysql> delete from t1 where id = 3;
Query OK, 1 row affected (0.00 sec)


Part3:查看用户ID

mysql> select * from accesslog;
+----+--------------+-----------------+-----------+---------------------+
| ID | ConnectionID | ConnUser        | MatchUser | LoginTime           |
+----+--------------+-----------------+-----------+---------------------+
|  1 |           10 | [email protected] | [email protected]%   | 2016-12-08 19:07:49 |
|  2 |           19 | [email protected] | [email protected]%   | 2016-12-08 19:08:44 |
|  3 |          125 | [email protected] | [email protected]%   | 2016-12-08 19:24:46 |
|  4 |          128 | [email protected] | [email protected]%   | 2016-12-08 19:25:01 |
|  5 |          182 | [email protected] | [email protected]%   | 2016-12-08 19:33:02 |
|  6 |          185 | [email protected] | [email protected]%   | 2016-12-08 19:33:20 |
+----+--------------+-----------------+-----------+---------------------+
6 rows in set (0.00 sec)

Part4:binlog日志对比

这里可以看到t1表的id=2和id=4列是由thread_id=182用户删掉的,也就是helei用户

#161208 19:33:39 server id 1250  end_log_pos 5275 CRC32 0x2ae798a9      Query   thread_id=182   exec_time=0     error_code=0
SET TIMESTAMP=1481254419/*!*/;
BEGIN
/*!*/;
# at 5275
#161208 19:33:39 server id 1250  end_log_pos 5324 CRC32 0x2cf42817      Rows_query
# delete from t1 where id=2
#161208 19:34:07 server id 1250  end_log_pos 5885 CRC32 0x947106d4      Query   thread_id=182   exec_time=0     error_code=0
SET TIMESTAMP=1481254447/*!*/;
BEGIN
/*!*/;
# at 5885
#161208 19:34:07 server id 1250  end_log_pos 5934 CRC32 0xfe1eb7fc      Rows_query
# delete from t1 where id=4

这里可以看到t1表的id=3列是由thread_id=185用户删掉的,也就是yuhao用户

#161208 19:33:49 server id 1250  end_log_pos 5579 CRC32 0x5f8d9879      Query   thread_id=185   exec_time=0     error_code=0
SET TIMESTAMP=1481254429/*!*/;
BEGIN
/*!*/;
# at 5579
#161208 19:33:49 server id 1250  end_log_pos 5630 CRC32 0x71feeadc      Rows_query
# delete from t1 where id = 3

参考资料:

http://dbspace.blog.51cto.com/6873717/1881053

——总结——

审计多多少少会影响数据库的性能,能不开尽量不开。另外开启审计数据库用户要实名制或者一对一,以免干了坏事儿的人赖账~由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

时间: 2024-10-19 08:23:34

MySQL日志审计 帮你揪出内个干坏事儿的小子的相关文章

MariaDB日志审计 帮你揪出内个干坏事儿的小子

Part1:谁干的? 做DBA的经常会遇到,一些表被误操作了,被truncate.被delete.甚至被drop.引起这方面的原因大多数都是因为人为+权限问题导致的.一些公共账户,例如ceshi账户,所有的人都可以进行操作,由这些公共账户引起的误操作,你在办公室大喊:谁把我的表删了?8成不会有人回应你. 审计日志功能,该技术主要在MariaDB10.0/10.1和Percona 5.6版本里实现.该功能在MySQL5.6/5.7企业版里也支持.本文主要介绍和演示MariaDB10.1中如何开启审

商业无间道:这款软件帮你揪出公司内奸

公司内部员工泄漏.盗窃.破坏公司信息已经成为了一个非常严重的网络安全问题.一家安全服务商说,它可以通过读取公司所有员工的电邮,来帮助工公司提前察觉"内部威胁". 假设你在一家大银行,或者硅谷的一家软件巨头,或者一所政府机构担任安全官员,每天早晨,你都可以用一个软件进行查询:"截至昨晚,谁是公司里最心怀不满的人呢?把前10个的名字显示出来." 埃里克·肖奥(Eric Shaw)是一名心理学家,长期在情报界担任顾问.他为网络安全公司Stroz Friedberg开发了一

MySQL 日志管理

一.MySQL 日志 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. MySQL 日志类型: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 错误日志 一般查询日志: DML, SELECT, 对于非常繁忙的数据库,会产生大量的日志 慢查询日志:执行时间很慢的查

mysql日志详细解析

MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默认开启的.并且,错误日志无法被禁止.默认情况下,错误日志存储在mysql数据库的数据文件中.错误日志

[原]MySQL日志

0x01.About MySQL有四种类型的日志:Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一种错误日志,记录MySQL运行过程ERROR,WARNING,NOTE等信息,系统出错或者某条记录出问题可以查看ERROR日志. 第二种日常运行日志,记录MySQL运行中的每条请求数据. 第三种二进制日志,包含了一些事件,这些事件描述了数据库的改动,如建表.数据改动等,也包括一些潜在改动,主要用于备份恢复.回滚等操作. 第四种慢查

mysql日志详细解析 [转]

原文出处:http://pangge.blog.51cto.com/6013757/1319304 MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默

揪出Android流氓软件

http://www.icpcw.com/Smartphone/Android/Android/1471/147142_all.htm http://www.williamlong.info/archives/3134.html 如果使用豌豆荚或其他应用市场安装APP之后,手机会定期收到一些垃圾推送,打开不是向你推荐程序,就是各种无用的广告,我想你的第一反应绝对是“怒”,接下来就很想知道是哪款软件在捣鬼.难道只能一个一个去卸载?费力又费时.本期小编就来告诉你如何揪出这些潜藏很深的流氓. 引鬼上身

mysql日志详细解析【转载】

转自:http://pangge.blog.51cto.com/6013757/1319304 MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默认开

为什么需要日志审计系统

什么是日志 简单地说,日志就是计算机系统.设备.软件等在某种情况下记录的信息.具体的内容取决于日志的来源.例如,Unix操作系统会记录用户登录和注销的消息,防火墙将记录ACL通过和拒绝的消息,磁盘存储系统在故障发生或者在某些系统认为将会发生故障的情况下生成日志信息.日志中有大量信息,这些信息告诉你为什么需要生成日志,系统已经发生了什么.例如,Web服务器一般会在有人访问Web页面请求资源(图片.文件等等)的时候记录日志.如果用户访问的页面需要通过认证,日志消息将会包含用户名.这就是日志数据的一个