mysql審計實現方法

來源:互聯網
上載者:User

標籤:so檔案   oba   query   自增   for   github   ges   測試   date   

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 ‘monitor‘@‘localhost‘ IDENTIFIED BY ‘123456‘;grant all on maildb.* to [email protected]‘%‘;mysql -h localhost -umonitor -p123456 -D maildbcreate table test1 (name varchar(32), id int(11));

  

2.2 查詢每次登入的記錄:

mysql -h localhost -umonitor -p123456select * 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 = 20COMMIT/*!*/;# at 939#150917 12:42:18 server id 11 end_log_pos 1066 CRC32 0xde7951a0 Query thread_id=4(此處) exec_time=0 error_code=0SET 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-527cp 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.soaudit_offsets=7680, 7728, 4384, 5024, 88, 2720, 96, 0, 32, 104, 152, 7848audit_json_file=ONaudit_json_log_file=/usr/local/mysql/audit_log/mysql-audit.jsonaudit_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審計實現方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.