mysql審計實現方法
Mysql版本: 5.6.24-72.2
一、通過init-connect + binlog 實現MySQL審計功能
基本原理:
由於審計的關鍵在於DML語句,而所有的DML語句都可以通過binlog記錄。
不過遺憾的是目前MySQL binlog 中只記錄,產生這條記錄的connection id(隨連接數自增,循環使用),這對之後的反查沒有任何幫助。
因此考慮通過init-connect,在每次連接的初始化階段,記錄下這個連接的用戶,和connection_id信息。
在後期審計進行行為追蹤時,根據binlog記錄的行為及對應的connection-id 結合 之前連接日誌記錄 進行分析,得出最後的結論
1. 設置init-connect :
1.1創建用於存放連接信息的表
create database AuditDB default charset utf8; use AuditDB; CREATE TABLE accesslog (`id` int(11) primary key auto_increment, `LoginTime` timestamp, `LocalName` varchar(30), `MatchName` varchar(30));
1.2 保證所有的用戶對此表有寫權限
use mysql; insert into db (Host,Db,User,Insert_priv) values (‘%‘,‘AuditDB‘,‘‘,‘Y‘); flush privileges;
1.3 設置init-connect
在my.cnf 中的 [mysqld] 的block 添加以下配置;
init-connect=‘insert into AuditDB.accesslog (id,LoginTime,LocalName,MatchName) values (connection_id(),now(),user(),current_user());‘
這裏必須開啟binlog:
log-bin=xxx
1.4 重啟數據庫生效
service mysql restart
2. 測試:
2.1 創建用戶, 授權。 創建表
CREATE USER [email protected]
2.2 查詢每次登錄的記錄:
mysql -h localhost -umonitor -p123456 select * from AuditDB.accesslog;
查找是誰創建的test1表,先在binlog中查找到創建表時候的thread_id
[[email protected]_01 ~]# mysqlbinlog /usr/local/mysql/binlog/binlog.000021 |grep --color ‘test1‘ -B 5 #150917 12:41:43 server id 11 end_log_pos 939 CRC32 0x5691b7f5 Xid = 20 COMMIT/*!*/; # at 939 #150917 12:42:18 server id 11 end_log_pos 1066 CRC32 0xde7951a0 Query thread_id=4(此處) exec_time=0 error_code=0 SET TIMESTAMP=1442464938/*!*/; create table test1 (name varchar(32), id int(11))
根據 thread_id 在 AuditDB.accesslog 對應 id字段: 就可以查出這是 [email protected] 幹的了.
mysql> select * from AuditDB.accesslog where id=4; +----+---------------------+-------------------+-------------------+ | id | LoginTime | LocalName | MatchName | +----+---------------------+-------------------+-------------------+ | 4 | 2015-09-17 12:41:43 | [email protected] | [email protected] | +----+---------------------+-------------------+-------------------+
3. Q&A
Q:使用init-connect會影響服務器性能嗎?
A:理論上,只會在用戶每次連接時往數據庫裏插入一條記錄,不會對數據庫產生很大影響。除非連接頻率非常高(當然,這個時候需要註意的就是如何進行連接復用和控制,而非是不是要用這種方法的問題了)
Q:access-log表如何維護?
A: 由於是一個log系統,推薦使用archive存儲引擎,有利於數據厄壓縮存放。如果數據庫連接數量很大的話,建議一定時間做一次數據導出,然後清表。
Q:表有其他用途麽?
A:有!access-log表當然不只用於審計,當然也可以用於對於數據庫連接的情況進行數據分析,例如每日連接數分布圖等等,只有想不到沒有做不到。
Q:會有遺漏的記錄嗎?
A:會的,init-connect 是不會在super用戶登錄時執行的。所以access-log裏不會有數據庫超級用戶的記錄,這也是為什麽我們不主張多個超級用戶,並且多人使用的原因。
參考: http://www.cnblogs.com/cenalulu/archive/2012/05/09/2491736.html
二、macfee公司基於percona開發的mysql audit 插件:
wiki首頁:https://github.com/mcafee/mysql-audit/wiki
二進制包下載:https://bintray.com/mcafee/mysql-audit-plugin/release包含了5.1,5.5,5.6對應的二進制包
下載: https://bintray.com/artifact/download/mcafee/mysql-audit-plugin/1.0.8/audit-plugin-mysql-5.6-1.0.8-527-linux-x86_64.zip
1 安裝配置插件
1.1 解壓:
unzip audit-plugin-mysql-5.6-1.0.8-527-linux-x86_64.zip
1.2 查看mysql插件目錄:
mysql> SHOW GLOBAL VARIABLES LIKE ‘plugin_dir‘; +---------------+------------------------------------+ | Variable_name | Value | +---------------+------------------------------------+ | plugin_dir | /usr/local/mysql/lib/mysql/plugin/ | +---------------+------------------------------------+
1.3 復制下載的so文件至plugin_dir,創建日誌目錄
cd audit-plugin-mysql-5.6-1.0.8-527 cp lib/libaudit_plugin.so /usr/local/mysql/lib/mysql/plugin/ mkdir /usr/local/mysql/audit_log/ chown mysql.mysql /usr/local/mysql/audit_log/
1.4 下載offset腳本,根據版本計算
offsets具體可以參考https://github.com/mcafee/mysql-audit/wiki/Troubleshooting
wget https://raw.github.com/mcafee/mysql-audit/master/offset-extract/offset-extract.sh # chmod +x offset-extract.sh # ./offset-extract.sh /usr/local/mysql/bin/mysqld //offsets for: /usr/local/mysql/bin/mysqld (5.6.24-72.2) {"5.6.24-72.2","c518d31ce76de4d470fcf2712877712e", 7680, 7728, 4384, 5024, 88, 2720, 96, 0, 32, 104, 152, 7848},
1.5:配置my.cnf,在mysqld塊裏面加入以下內容:
plugin-load=AUDIT=libaudit_plugin.so audit_offsets=7680, 7728, 4384, 5024, 88, 2720, 96, 0, 32, 104, 152, 7848 audit_json_file=ON audit_json_log_file=/usr/local/mysql/audit_log/mysql-audit.json audit_record_cmds=insert,delete,update,create,drop,revoke,alter,grant,set #針對這些語句來審計
1.6 重啟mysql數據庫
service mysql restart
2.1 驗證是否生效:
查看版本:
mysql> SHOW GLOBAL STATUS LIKE ‘AUDIT_version‘; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | Audit_version | 1.0.8-527 | +---------------+-----------+
查看是否開啟:
mysql> SHOW GLOBAL VARIABLES LIKE ‘audit_json_file‘; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | audit_json_file | ON | +-----------------+-------+
可以創建一個test1表,查看/usr/local/mysql/audit_log/mysql-audit.json文件中會有記錄.
2.2 重要的參數說明:
1. audit_json_file #是否開啟audit功能
2. audit_json_log_file #記錄文件的路徑和名稱信息
3. audit_record_cmds #audit記錄的命令,默認為記錄所有命令可以設置為任意dml、dcl、ddl的組合
如:audit_record_cmds=select,insert,delete,update
還可以在線設置set global audit_record_cmds=NULL(表示記錄所有命令)
其他配置參數參考: https://github.com/mcafee/mysql-audit/wiki/Configuration
mysql審計實現方法