mysql服務(wù)器自身沒有提供審計(jì)功能,但是我們可以使用init-connect + binlog的方法進(jìn)行mysql的操作審計(jì)。由于mysql binlog記錄了所有對(duì)數(shù)據(jù)庫(kù)長(zhǎng)生實(shí)際修改的sql語句,及其執(zhí)行時(shí)間,和connection_id但是卻沒有記錄connection_id對(duì)應(yīng)的詳細(xì)用戶信息。在后期審計(jì)進(jìn)行行為追蹤時(shí),根據(jù)binlog記錄的行為及對(duì)應(yīng)的connection-id 結(jié)合 之前連接日志記錄 進(jìn)行分析,得出最后的結(jié)論。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)撫順縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1. 設(shè)置init-connect
1.1 創(chuàng)建用于存放連接日志的數(shù)據(jù)庫(kù)和表
create database accesslog;
CREATE TABLE accesslog.accesslog (`id` int(11) primary key auto_increment, `time` timestamp, `localname` varchar(30), `matchname` varchar(30))
1.2 創(chuàng)建用戶權(quán)限
可用現(xiàn)成的root用戶用于信息的讀取
grant select on accesslog.* to root;
如果存在具有to *.* 權(quán)限的用戶需要進(jìn)行限制。
這里還需要注意用戶必須對(duì)accesslog表具有insert權(quán)限
grant select on accesslog.* to user@’%’;
1.3 設(shè)置init-connect
在[mysqld]下添加以下設(shè)置:
init-connect=’insertinto accesslog.accesslog(id, time, localname, matchname)
values(connection_id(),now(),user(),current_user());’
------注意user()和current_user()的區(qū)別
log-bin=xxx
這里必須開啟binlog
1.4 重啟數(shù)據(jù)庫(kù)生效
shell /etc/init.d/mysql restart
2. 記錄追蹤
2.1 thread_id確認(rèn)
可以用以下語句定位語句執(zhí)行人
Tencent:~ # mysqlbinlog --start-datetime='2011-01-26 16:00:00'
--stop-datetime='2011-01-26 17:00:00' /var/lib/mysql/mysql-bin.000010
| grep -B 5 'wsj'
COMMIT/*!*/;
# at 767
#110126 16:16:43 server id 1 end_log_pos 872 Query thread_id=19 exec_time=0 error_code=0
use test/*!*/;
SET TIMESTAMP=1296029803/*!*/;
create table wsj(id int unsigned not null)
--
BEGIN
/*!*/;
# at 940
#110126 16:16:57 server id 1 end_log_pos 1033 Query thread_id=19 exec_time=0 error_code=0
SET TIMESTAMP=1296029817/*!*/;
insert into wsj(id) values (1)
--
BEGIN
/*!*/;
# at 1128
#110126 16:16:58 server id 1 end_log_pos 1221 Query thread_id=19 exec_time=0 error_code=0
SET TIMESTAMP=1296029818/*!*/;
insert into wsj(id) values (2)
2.2 用戶確認(rèn)
thread_id 確認(rèn)以后,找到元兇就只是一條sql語句的問題了。
mysql select * from accesslog where id=19;
+----+---------------------+---------------------+-----------+
| id | time | localname | matchname |
+----+---------------------+---------------------+-----------+
| 19 | 2011-01-26 16:15:54 | test@10.163.164.216 | test@% |
+----+---------------------+---------------------+-----------+
1 row in set (0.00 sec)
這個(gè)可以借助工具了,如mysql抓包工具 MySQL Sniffer
效果就是,訪問數(shù)據(jù)庫(kù)的來源ip,訪問的庫(kù),表,sql這樣的,如下:
首先介紹下 pt-stalk,它是 Percona-Toolkit 工具包中的一個(gè)工具,說起 PT 工具包大家都不陌生,平時(shí)常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于這個(gè)工具包,這里就不多介紹了。
pt-stalk 的主要功能是在出現(xiàn)問題時(shí)收集 OS 及 MySQL 的診斷信息,這其中包括:
1. OS 層面的 CPU、IO、內(nèi)存、磁盤、網(wǎng)絡(luò)等信息;
2. MySQL 層面的行鎖等待、會(huì)話連接、主從復(fù)制,狀態(tài)參數(shù)等信息。
而且 pt-stalk 是一個(gè) Shell腳本,對(duì)于我這種看不懂 perl 的人來說比較友好,腳本里面的監(jiān)控邏輯與監(jiān)控命令也可以拿來參考,用于構(gòu)建自己的監(jiān)控體系。
三、使用
接著我們來看下如何使用這個(gè)工具。
pt-stalk 通常以后臺(tái)服務(wù)形式監(jiān)控 MySQL 并等待觸發(fā)條件,當(dāng)觸發(fā)條件時(shí)收集相關(guān)診斷數(shù)據(jù)。
觸發(fā)條件相關(guān)的參數(shù)有以下幾個(gè):
function:
°?默認(rèn)為 status,代表監(jiān)控 SHOW GLOBAL STATUS 的輸出;
°?也可以設(shè)置為 processlist,代表監(jiān)控 show processlist 的輸出;
variable:
°?默認(rèn)為 Threads_running,代表 監(jiān)控參數(shù),根據(jù)上述監(jiān)控輸出指定具體的監(jiān)控項(xiàng);
threshold:
°?默認(rèn)為 25,代表 監(jiān)控閾值,監(jiān)控參數(shù)超過閾值,則滿足觸發(fā)條件;
°?監(jiān)控參數(shù)的值非數(shù)字時(shí),需要配合 match 參數(shù)一起使用,如 processlist 的 state 列;
cycles:
°?默認(rèn)為 5,表示連續(xù)觀察到五次滿足觸發(fā)條件時(shí),才觸發(fā)收集;
連接參數(shù):host、password、port、socket。
其他一些重要參數(shù):
iterations:該參數(shù)指定 pt-stalk 在觸發(fā)收集幾次后退出,默認(rèn)會(huì)一直運(yùn)行。
run-time:觸發(fā)收集后,該參數(shù)指定收集多長(zhǎng)時(shí)間的數(shù)據(jù),默認(rèn) 30 秒。
sleep:該參數(shù)指定在觸發(fā)收集后,sleep 多久后繼續(xù)監(jiān)控,默認(rèn) 300 秒。
interval:指定狀態(tài)參數(shù)的檢查頻率,判斷是否需要觸發(fā)收集,默認(rèn) 1 秒。
dest:監(jiān)控?cái)?shù)據(jù)存放路徑,默認(rèn)為 /var/lib/pt-stalk。
retention-time :監(jiān)控?cái)?shù)據(jù)保留時(shí)長(zhǎng),默認(rèn) 30 天。
daemonize:以后臺(tái)服務(wù)運(yùn)行,默認(rèn)不開啟。
log:后臺(tái)運(yùn)行日志,默認(rèn)為 /var/log/pt-stalk.log。
collect:觸發(fā)發(fā)生時(shí)收集診斷數(shù)據(jù),默認(rèn)開啟。
°?collect-gdb:收集 GDB 堆棧跟蹤,需要 gdb 工具。
°?collect-strace:收集跟蹤數(shù)據(jù),需要 strace 工具。
°?collect-tcpdump:收集 tcpdump 數(shù)據(jù),需要 tcpdump 工具。
不知你是不是指這個(gè):
用慣了微軟的ms sql的事件探查器,一直也想在mysql中找到相應(yīng)的這么一種工具:
修改my.cnf,在mysqld下添加log一行,
[mysqld]
log = /tmp/mysqld.sql
然后,重新啟動(dòng)mysql,tail -f /tmp/mysqld.sql,就可以實(shí)時(shí)看到myql服務(wù)器當(dāng)前正在執(zhí)行的語句了。
文章出處: