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
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.一、首先登錄須要審計的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();
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;
繼續寫入:
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 數據庫。