Mysql8中的無插件方式審計(jì)
需求
在mysql 8中記錄用戶對(duì)數(shù)據(jù)庫(kù)表的操作內(nèi)容,操作時(shí)間,客戶端源ip地址。
在mysql5.7完美地采用MariaDB的server_audit插件來記錄{時(shí)間,節(jié)點(diǎn),用戶,源IP,事件類型,庫(kù),語句,影響行數(shù)}等審計(jì),但從mysql8開始已不支持該插件,同類的第三方插件也無法使用。
目前找到的方式:
[ binlog + init-connect ],binlog可以審計(jì)到所有數(shù)據(jù)記錄及表結(jié)構(gòu)變更相關(guān)的記錄,但,不記錄連接的信息,要通過額外的手段來記錄,比如show full processlist;
是可得出連接信息中的process id,與binlog中的thread id進(jìn)行關(guān)聯(lián)分析,得到連接的信息{用戶名、登錄時(shí)間、源ip},為了永久記錄process id,采用init-connect 方式記錄到數(shù)據(jù)庫(kù)表中。
1. 創(chuàng)建init-connect用于記錄的庫(kù)和表
mysql> create database mysql_access_log; mysql> create table mysql_access_log.access_log ( conn_id int(11) default null, `time` timestamp, `localname` varchar(30), `matchname` varchar(30));
2. 授權(quán)用戶于該庫(kù)的表mysql_access_log.accesslog有insert權(quán)限
如用戶user_web
mysql> grant insert on `mysql_access_log`.`access_log` to 'user_web'@'%';
3. 配置用戶登錄日志插入表
my.cnf中 [mysqld] 下添加,并重啟mysql生效
init-connect='insert into mysql_access_log.access_log values(connection_id(),now(),user(),current_user());'
4. 特別注意
①init-connect只記錄非super權(quán)限用戶,所以好好管理用戶,按情況回收super權(quán)限;
②非super權(quán)限用戶登錄都受init-connect影響,未授權(quán)對(duì)mysql_access_log.access_log有insert權(quán)限的用戶即無法登錄成功!
③當(dāng)重啟mysql后connection_id會(huì)存在不按歷史續(xù)增長(zhǎng)而重復(fù)出現(xiàn),所以查記錄時(shí)注意多個(gè)重復(fù)的id記錄。
5. 開啟mysql-binlog日志記錄
在my.cnf中 [mysqld] 下添加,并重啟mysql生效
# 二進(jìn)制日志 log-bin=mysql-bin # binlog-do-db=db #僅作用的庫(kù) expire_logs_days = 20 max_binlog_size = 300m
6. 從binlogi日志 取thread_id去查用戶名和源ip
模擬刪除book庫(kù)books表中的一條記錄-----過程省略!
解密mysql-bin查看內(nèi)容,找到DELETE操作的thread_id號(hào),如這里的8。
[root@localhost data]# mysqlbinlog --base64-output=decode-row -vv mysql-bin.000003 > ./mysql-bin.000003--vv.log [root@localhost data]# tail -n 30 ./mysql-bin.000003--vv.log #200712 18:24:01 server id 1 end_log_pos 1008 CRC32 0x62294de5 Query thread_id=8 exec_time=0 error_code=0 SET TIMESTAMP=1594549441/*!*/; SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; #200712 18:24:01 server id 1 end_log_pos 1079 CRC32 0x0723c708 Table_map: `book`.`books` mapped to number 95 #200712 18:24:01 server id 1 end_log_pos 1187 CRC32 0xc96cc08e Delete_rows: table id 95 flags: STMT_END_F ### DELETE FROM `book`.`books` ### @1=44 /* INT meta=0 nullable=0 is_null=0 */ ### @2='XML 完全探索' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
根據(jù)thread_id號(hào)去找init-connect記錄表的登錄用戶和源ip
[root@localhost data]# mysql -u root -p -e "select * from mysql_access_log.access_log where conn_id=8 ;" | conn_id | time | localname | matchname | +---------+---------------------+-------------------------+------------+- | 8 | 2020-07-12 18:23:41 | user_web@192.168.53.119 | user_web@% | +---------+---------------------+-------------------------+------------+-
7. 開啟general-log日志記錄
[ binlog + init-connect ] 方式,受限于binlog本身記錄日志的局限,無法審計(jì)一些并不記錄在binlog中的內(nèi)容。
比如無SELECT、Connect;可同時(shí)開啟mysql的general-log記錄,記錄執(zhí)行的所有的語句的信息。
在my.cnf中 [mysqld] 下添加,并重啟mysql生效
general-log=1 general_log_file = /opt/mysql/data/general_log_file.log #按你實(shí)際路徑,注意權(quán)限
但存在的不足
- a. 無論所執(zhí)行語句是否正確執(zhí)行,都會(huì)記錄,會(huì)導(dǎo)致大量的無用信息,后面的篩選不易操作;
- b. 當(dāng)server的并發(fā)訪問非常大時(shí),log的記錄會(huì)對(duì)IO產(chǎn)一定的影響,以致于影響server的性能;
- c. 日志文件很容易快速增長(zhǎng);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
asp+mysql+utf8 網(wǎng)頁出現(xiàn)亂碼問題的解決方法
無論在網(wǎng)頁中加多少UTF8的定義,顯示的結(jié)果都還是會(huì)有一些小格子,反而定義為gb2312,顯示完全正常2014-03-03MySQL limit子句用法及優(yōu)化小結(jié)
limit在獲取到滿足條件的數(shù)據(jù)量時(shí)即會(huì)立刻終止SQL的執(zhí)行,本文主要介紹了MySQL limit子句用法及優(yōu)化小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09mysql存儲(chǔ)過程之引發(fā)存儲(chǔ)過程中的錯(cuò)誤條件(SIGNAL和RESIGNAL語句)實(shí)例分析
這篇文章主要介紹了mysql存儲(chǔ)過程之引發(fā)存儲(chǔ)過程中的錯(cuò)誤條件(SIGNAL和RESIGNAL語句),結(jié)合實(shí)例形式分析了mysql使用SIGNAL和RESIGNAL語句來引發(fā)存儲(chǔ)過程中的錯(cuò)誤條件相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12DataGrip的MySQL數(shù)據(jù)導(dǎo)出和導(dǎo)入操作超詳細(xì)指南
很多時(shí)候我們會(huì)遇到需要將本機(jī)數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出或者其他數(shù)據(jù)庫(kù)數(shù)據(jù)的導(dǎo)入操作,這篇文章主要給大家介紹了關(guān)于DataGrip的MySQL數(shù)據(jù)導(dǎo)出和導(dǎo)入操作超詳細(xì)指南,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04關(guān)于加強(qiáng)MYSQL安全的幾點(diǎn)建議
現(xiàn)在php+mysql組合越來越多,這里腳本之家小編就為大家分享一下mysql的安裝設(shè)置的幾個(gè)小技巧2016-04-04