最近因爲一些事情的發生,出現了好端端的頁面,變成了空頁面。轉頭開發同事就來質問我,是不是我動了什麼,後來經過調查發現,是平臺運營的同事誤刪資料導致的。
所以如果運維或者開發部門有很多人都分配了數據庫的增刪改之類的操作權限的話,某一天哪個表或者字段丟失了都無法找到是誰幹的,所以這個鍋只能運維來背了。因此很有必要把數據庫的操作記錄保存下來,但是代價就是服務器的效能就會變差一些了,但爲了安全起見,還是建議開啓的。
在一些操作限制中,難免會有人質疑具有super權限的用戶做了什麼動作,所以還是把root用戶也一同審計在內,可以避免不必要的麻煩
1.我們就以mysql-5.7.17爲例,安插第三方的插件來進行審計。通過多方瞭解,知道MySQL AUDIT Plugin是一個 MySQL安全審計插件,由McAfee提供,設計強調安全性和審計能力。可用作獨立審計解決方案,或配置爲數據傳送給外部監測工具。
audit下載地址:
https://bintray.com/mcafee/mysql-audit-plugin/release
2.準備安裝audit插件
[root@~]unzip audit-plugin-mysql-5.7-1.1.2-694-linux-x86_64.zip
Archive: audit-plugin-mysql-5.7-1.1.2-694-linux-x86_64.zip
creating: audit-plugin-mysql-5.7-1.1.2-694/
creating: audit-plugin-mysql-5.7-1.1.2-694/lib/
inflating: audit-plugin-mysql-5.7-1.1.2-694/lib/libaudit_plugin.so
inflating: audit-plugin-mysql-5.7-1.1.2-694/COPYING
inflating: audit-plugin-mysql-5.7-1.1.2-694/THIRDPARTY.txt
inflating: audit-plugin-mysql-5.7-1.1.2-694/README.txt
creating: audit-plugin-mysql-5.7-1.1.2-694/utils/
inflating: audit-plugin-mysql-5.7-1.1.2-694/utils/offset-extract.sh
3.查看mysql爲安插audit插件的路徑
mysql > show global variables like 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| plugin_dir |/data0/mysql/lib/plugin/ |
+---------------+--------------------------+
1 row in set (0.00 sec)
4.將需要安裝的插件複製到上述指定路徑,並賦予可執行權限即可
[root@~]cd audit-plugin-mysql-5.7-1.1.2-694/lib
[root@lib]cp libaudit_plugin.so /data0/mysql/lib/plugin/
[root@~]cd /data0/mysql/lib/plugin/
[root@plugin]chmod a+x libaudit_plugin.so
5.有了4的步驟以後,便可以在數據庫上加載審計插件
mysql> install plugin audit soname 'libaudit_plugin.so';
Query OK, 0 rows affected (1.78 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
6.加載插件完畢後,查看審計插件是否已經插入到了數據庫內,並查看相關插件版本
mysql> show global status like '%audit%';
+------------------------+-----------+
| Variable_name | Value |
+------------------------+-----------+
| Audit_protocol_version | 1.0 |
| Audit_version | 1.1.2-694 |
+------------------------+-----------+
2 rows in set (0.00 sec)
7.開啓數據庫的審計功能
mysql> set global audit_json_file=on;
Query OK, 0 rows affected (0.00 sec)
8.查看數據庫跟審計有關的相關信息
mysql> show global variables like '%audit%';
+---------------------------------+------------+
| Variable_name | Value |
+-----------------------------------------------+
| audit_before_after | after |
| audit_checksum | |
| audit_client_capabilities | OFF |
| audit_delay_cmds | |
| audit_delay_ms | 0 |
| audit_force_record_logins | OFF |
| audit_header_msg | ON |
| audit_json_file | ON |
| audit_json_file_bufsize | 1 |
| audit_json_file_flush | OFF |
| audit_json_file_retry | 60 |
| audit_json_file_sync | 0 |
| audit_json_log_file | mysql-audit.json |
| audit_json_socket | OFF |
| audit_json_socket_name | /var/run/db-audit/mysql.audit__data0_mysql-data_3306 |
| audit_json_socket_retry | 10 |
| audit_offsets | |
| audit_offsets_by_version | ON |
| audit_password_masking_cmds | CREATE_USER,GRANT,SET_OPTION,SLAVE_START,CREATE_SERVER,ALTER_SERVER,CHANGE_MASTER,UPDATE |
| audit_password_masking_regex | identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|\s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"] |
| audit_record_cmds | |
| audit_record_objs | |
| audit_sess_connect_attrs | ON |
| audit_socket_creds | ON |
| audit_uninstall_plugin | OFF |
| audit_validate_checksum | ON |
| audit_validate_offsets_extended | ON |
| audit_whitelist_cmds | BEGIN,COMMIT,PING |
| audit_whitelist_users | |
+---------------------------------+------------------------+
29 rows in set (0.00 sec)
9.可以更改你想存放日誌的路徑,以便日後記得在哪裏查找查看日誌
audit_json_log_file就是數據庫中審計日誌mysql-audit.json存放的路徑,一般審計日誌放在了數據庫的數據存放的路徑上。像我的mysql-audit.json就存放在/data0/mysql-data裏。當然如果你要換到你指定的路徑也可以,用 mysql > set global audit_json_log_file='你想放置的路徑';
10.縮減日誌內容
在查看已經開啓的審計日誌以後,你就會發現日誌量太大了,只要網站有人訪問,肯定都會有select的日誌記錄,因爲在默認情況下audit_record_cmds=null,記錄所有操作指令,但是我們開啓審計日誌的目的是爲了審計,不是爲了記流水賬,所以只記錄insert、delete、update就可以了。這樣就比較符合我們的初衷,所以可以像下面那樣做:
mysql > set global audit_record_cmds = 'insert,delete,update';
11.侷限到你想要審計的數據庫即可
在默認情況下audit_record_objs=null,即是數據庫裏的所有對象都列爲記錄對象。但爲了安全起見,我都審計。當然也可以指定哪些數據庫的表格需要進行審計記錄,如下例設置:
mysql > set global audit_record_objs = 'mysql.*,test.*';
12.mysql審計還是有搞特殊化的,就是白名單這種東西,簡言之就是可以指定誰免受審計之苦。
設定如下:
mysql > set global audit_whitelist_users = 'z';
13.查看審計日誌內容
cat /data0/mysql-data/mysql-audit.json
大概通過上述步驟,審計就可以說簡略的完成了。