MySQL之init_connect審計應用

1、演示環境說明:

2臺內網dellR620 物理服務器測試。
系統都是 centos7.6 x86_64最小化安裝
關閉selinux 關閉iptables,二進制解壓安裝mysql5.7.30。並且要開啓binglog 且爲row格式。
2臺機器內網地址已經演示環境角色以下:html

192.168.1.217 建立mysql審計表,來審計此機器上的mysql服務用戶登陸信息
192.168.1.215 在此機器上經過用戶xiaolaodi@'%' 遠程登陸 192.168.1.217 機器上的MySQL,進行模擬寫入和刪除操做mysql

2、參數說明:

init_connect 是MySQL5.6引入的參數。
具體說明能夠參考官網地址
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.htmllinux

由測試得出init_connect='XXXXXXX' 是用戶登陸到數據庫上以後,在執行第一次查詢SQL以前執行'XXXXXXXX' 裏面的內容的。
若是init_connect 的內容有語法錯誤,致使執行失敗,會致使用戶沒法執行查詢,從mysql 退出
須要注意的是:init_connect 對具備super 權限的用戶是無效的。也就是說超級帳戶無視init_connect設置(即init_connect的設置對來自超級帳戶的鏈接不生效)
因而根據這個參數的功能,咱們能夠利用這個特性和binlog記錄實踐ID,審計全部普通用戶在什麼時間登陸庫,對庫中的表作了什麼事情sql

3、具體演示過程以下:

3.一、首先登錄須要審計的mysql,建立一張本身定義的能夠記錄登錄MySQL服務的用戶和地址表mysql_acc_log數據庫

create table mysql_acc_log (id int (11) unsigned not null primary key auto_increment,
`thread_id` bigint COMMENT '線程ID',
`local_user`  varchar (30) not null default '' COMMENT '鏈接的ID用戶+地址', 
`match_user`  varchar (30) not null default '' COMMENT '匹配到的用戶ID',
`Logintime` datetime);

select connection_id(),user(),current_user(),now();

MySQL之init_connect審計應用

3.2在線動態設置init_connect參數內容:centos

mysql> set global init_connect='insert into test001.mysql_acc_log(thread_id,local_user,match_user,Logintime) values(connection_id(),user(),current_user(),now());';
Query OK, 0 rows affected (0.00 sec)
mysql>

3.3 建立全部須要監控的帳號,賦予所用須要監控的普通用戶要對這張表擁有 insert 權限

提示注意:
此方法須要給數據庫全部用戶都對test001.mysql_acc_log授寫權限,不然插入用戶信息會失敗;
不要受權 update 、delete 等權限,不然普通用戶登陸 MySQL 能夠手動刪除他鏈接的信息tomcat

爲了模擬演示,新建一個普通權限的測試用戶,而且能夠對mysql_acc_log 這個表insert服務器

grant insert on test001.mysql_acc_log to  xiaolaodi@'%';
grant all on test001.* to xiaolaodi@'%' identified by 'shueid*723she';flush privileges;
grant all on tudoudb.* to xiaolaodi@'%' identified by 'shueid*723she';flush privileges;

3.4##建立另一張測試表,來隨便插入幾條數據。追查是誰刪除了線上的MySQL庫表中的記錄數app

CREATE TABLE `test_event` (
`id` int(8) NOT NULL AUTO_INCREMENT, 
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`) #主鍵ID
) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

insert into test_event(username,password,create_time) values("李四","tomcat",now());

3.5建立測試表插入數據,並delete刪除數據演示ide

[root@local-215 ~]#  mysql -uxiaolaodi -h 192.168.1.217 -p'shueid*723she'
xiaolaodi@mysqldb 22:35:  [(none)]> use tudoudb;
Database changed
xiaolaodi@mysqldb 22:35:  [tudoudb]>  insert into test_event(username,password,create_time) values("李四","tomcat",now());

192.168.1.215 機器查看錶test001.mysql_acc_log記錄:

mysql> select * from test001.mysql_acc_log;

MySQL之init_connect審計應用

繼續寫入:

xiaolaodi@mysqldb 22:37:  [tudoudb]>  insert into test_event(username,password,create_time) values("李四","tomcat",now());
Query OK, 1 row affected (0.01 sec)

xiaolaodi@mysqldb 22:42:  [tudoudb]> select * from  test_event;
+----+----------+----------+---------------------+
| id | username | password | create_time         |
+----+----------+----------+---------------------+
|  1 | 李四     | tomcat   | 2020-09-12 18:49:50 |
|  2 | 李四     | tomcat   | 2020-09-12 22:41:30 |
|  3 | 李四     | tomcat   | 2020-09-12 22:48:27 |
+----+----------+----------+---------------------+

xiaolaodi@mysqldb 22:43:  [tudoudb]> delete from  test_event where id=3;

3.6 、分析binglog日誌,肯定登陸mysql服務的thread_id=5 執行的刪除動做

[root@mysql02 ~]# mysqlbinlog -v --base64-output=decode-rows /data1/mysql/3306/binlog/mysql-bin.000016|grep -iC10 delete > audit.log

[root@mysql02 ~]# cat audit.log 
SET @@SESSION.GTID_NEXT= '5ec577a4-f401-11ea-bf6d-14187756553d:5446'/*!*/;
# at 1594
#200912 22:49:27 server id 12173306  end_log_pos 1669 CRC32 0x88105258  Query   thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1599922167/*!*/;
BEGIN
/*!*/;
# at 1669
# at 1727
#200912 22:49:27 server id 12173306  end_log_pos 1792 CRC32 0x6fbda508  Table_map: `tudoudb`.`test_event` mapped to number 116
# at 1792
#200912 22:49:27 server id 12173306  end_log_pos 1866 CRC32 0xbcfbe639  Delete_rows: table id 116 flags: STMT_END_F
### DELETE FROM `tudoudb`.`test_event`
### WHERE
###   @1=3
###   @2='李四'
###   @3='tomcat'
###   @4='2020-09-12 22:48:27'
# at 1866
#200912 22:49:27 server id 12173306  end_log_pos 1897 CRC32 0xc8ccf0e4  Xid = 129
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;

查看mysql審計表mysql_acc_log找到對應的線程id號

#200912 22:49:27 server id 12173306  end_log_pos 1669 CRC32 0x88105258  Query   thread_id=5 exec_time=0 error_code=0

thread_id=5 這個線程的登陸用戶它執行的刪除動做

3.七、mysql_acc_log找到對應的線程id號肯定當時操做的登陸用戶

能夠看到線程 thread_id=5,而且時間也是200912 22:49:27左右。能夠肯定就是 xiaolaodi@'%' 用戶操做的 delete 語句。

經過 local_user 字段能夠看到是192.168.1.215 這個地址使用 xiaolaodi@'%' 用戶鏈接的 MySQL 數據庫。

相關文章
相關標籤/搜索