mysql審計方案 MySQL審計功能

2021-10-17 22:36:57 字數 3030 閱讀 1001

mysql審計功能介紹

之前有同事發現資料丟失,由於mysql自身沒有提供審計功能,查詢binlog可以看到操作時間與連線ip,並不顯示哪個使用者做的操作,詢問開發同事都說沒有做刪除操作,也沒辦法定位操作的人員證據,無奈只能恢復資料。

general log會記錄詳細的sql執行記錄,但是生產環境如果業務量大,會產生大量的磁碟io操作,嚴重降低資料庫效能,所以生產環境一般不會開啟general log。後來發現可以使用init-connect + binlog的方法進行mysql的操作審計。由於mysql binlog記錄了所有對資料庫長生實際修改的sql語句,及其執行時間,和connection_id但是卻沒有記錄connection_id對應的詳細使用者資訊。在後期審計進行行為追蹤時,根據binlog記錄的行為及對應的connection-id 結合 之前連線記錄進行分析,得出最後的結論。

設定init-connect

1、建立用於存放連線資訊的表

mysql> create database auditdb default charset utf8;

mysql> use auditdb;

mysql> create table accesslog (

id int primary key auto_increment,

connectionid int,

connuser varchar(30),

matchuser varchar(30),

logintime datetime

2、保證所有鏈結使用者對此表有寫入許可權

mysql> insert into mysql.db (host,db,user,insert_priv) values ('%','auditdb','','y');

query ok, 1 row affected (0.03 sec)

mysql> flush privileges;

query ok, 0 rows affected (0.00 sec)

3、設定init-connect

在[mysqld]下新增以下設定:

#設定初始化連線操作

init-connect='insert into auditdb.accesslog(connectionid, connuser, matchuser, logintime) values(connection_id(),user(),current_user(),now());'

#開啟binlog

log-bin=***

4、重啟資料庫生效

shell> /etc/init.d/mysql restart

連線測試查詢

mysql> select * from auditdb.accesslog;

| id | connectionid | connuser | matchuser | logintime |

| 1 | 1 | svoid@localhost | svoid@localhost | 2015-04-24 14:16:18 |

| 2 | 3 | [email protected] | svoid@% | 2015-04-24 14:16:53 |

2 rows in set (0.00 sec)

查詢操作記錄

1、 進行模擬操作,下列操作可由多個連線進行

mysql> use test;

database changed

mysql> create table t (id int ,name varchar(20));

query ok, 0 rows affected (0.06 sec)

mysql> insert into t values(1,'a');

query ok, 1 row affected (0.16 sec)

mysql> insert into t values(2,'b');

query ok, 1 row affected (0.03 sec)

mysql> truncate table t ;

query ok, 0 rows affected (0.03 sec)

2、根據binlog,確認操作truncate的thread_id

mysqlbinlog --start-datetime='2015-04-24 14:10:00' --stop-datetime='2015-04-24 14:25:00' /db/mysql/data/mysql_info.000007 | grep -b 5 truncate

# at 1223

#150424 14:23:36 server id 1 end_log_pos 1302 query thread_id=3 exec_time=0 error_code=0

set timestamp=1429856616/*!*/;

/*!\c gbk *//*!*/;

set @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=33/*!*/;

truncate table t

根據上面的提示可以看到操作的thread_id=3

3、確認操作的使用者

mysql> select * from auditdb.accesslog where connectionid=3;

| id | connectionid | connuser | matchuser | logintime |

| 2 | 3 | [email protected] | svoid@% | 2015-04-24 14:16:53 |

1 row in set (0.00 sec)

補充init-connect 是不會在super使用者登入時執行, 所以最好不使用超級使用者

如多人使用同一使用者可能無法區分,最好乙個人分配乙個資料庫操作使用者

理論上,使用者每次連線時往資料庫裡插入一條記錄,不會對資料庫產生很大影響,考慮降低連線頻率及accesslog插入效率優化

整理自網路

svoid

2015-04-24

mysql 審計外掛程式 MySQL審計外掛程式使用

or詳細的配置可以參考官方文件 解壓檔案 unzip audit plugin mysql 5.7 1.1.7 805 linux x86 64.zip 將安裝包libaudit plugin.so檔案複製到 plugin dir目錄 root localhost 10 07 none show g...

mysql 訪問審計 mysql實現訪問審計

mysql的連線首先都是通過init connect初始化,然後連線到例項。我們利用這一點,通過在init connect的時候記錄下使用者的thread id,使用者名稱和使用者位址實現db的訪問審計功能。首先我們先建立審計用的庫表 為了不與業務的庫衝突,單獨建立自己的庫 create datab...

mysql審計框架 mysql審計平台搭建

yearning mysql sql語句審核平台。提供查詢審計,sql審核等多種功能 注意事項 僅依賴mysql資料庫。mysql版本必須5.7及以上版本,請事先自行安裝完畢且建立yearning庫,字符集應為utf8mb4 僅yearning所需mysql版本 yearning日誌僅輸出error...