乾貨 | MySQL數據庫安全之審計

 

每家公司都但願業務高速增加,最好能出幾個爆款產品或者爆款業務,從而帶動公司營收高速攀升。但站在數據庫管理員的角度,這倒是實實在在的壓力,業務高速增加必然帶來數據量的暴增。數據庫系統的選型和設計是支撐整個業務系統的重要因素。mysql

MySQL數據庫是基於雲原生的數據庫產品之一,雲原生爲雲數據庫提供了重要動力,相比於傳統自建數據庫,雲數據庫比單個數據庫具備更大的彈性和可擴展性。sql

數據庫審計主要用於監視並記錄對數據庫服務器的各種操做行爲,並記入審計日誌或數據庫中以便往後進行跟蹤、查詢、分析,以實現對用戶操做的監控和審計。審計是一項很是重要的工做,也是企業數據安全體系的重要組成部分。數據庫

MySQL企業版自帶審計功能,可是須要付費。MySQL社區版沒有審計功能,基於成本的考慮,不少用戶採用社區版MySQL做爲業務系統數據庫。採用社區版MySQL如何實現重要的審計功能,本文從自建和雲服務兩種狀況來解答這個問題。安全

 

自建MySQL數據庫的場景

 

本文自建數據庫全部實驗環境是基於window10下MySQL5.7這個版本。服務器

 

方法一 Genreal Log運維

默認狀況下,MySQL不開啓General log; 開啓General log後,MySQL將全部到達MySQL Server的SQL語句記錄下來。工具

開啓General log步驟:

一、查看General Log開啓狀況:執行SQL命令show variables like '%general_log%’ ;能夠看到默認general_log是OFF的:性能

 

二、開啓General Log: 執行SQL命令set global general_log=on 然後查看general_log打開了:測試

 

三、驗證:general_log打開後,全部SQL的訪問都會記錄在general_log_file指向的日誌文件。咱們執行幾個SQL語句測試:雲計算

然後查看ZB-PF11H2E3.log日誌文件裏面的內容,咱們看到剛纔作的操做都已經記錄在日誌裏了:

開啓General Log只要用戶執行了操做,不管對錯,MySQL就會記錄日誌,這樣的話日誌量會很是龐大,對數據庫效率有影響。因此咱們通常不建議開啓開功能,個別狀況下可能會臨時的開一段時間以供排查故障等使用。

 

方法二 BinLog+Init_connect

BinLog是MySQL操做時留下的日誌,BinLog一方面能夠用在數據庫的恢復與主從複製上,另一方面能夠用來作數據庫的審計。

因爲BinLog日誌裏面沒法查詢是誰在哪一個時間段登陸的等信息,缺乏審計必要的信息。在MySQL中,每一個鏈接都會先執行init_connect進行鏈接的初始化,咱們能夠在這裏獲取用戶的登陸名稱和thread ID值。而後配合BinLog,就能夠追蹤到每一個操做語句的操做時間,操做人等信息,再加上BinLog的日誌信息實現審計。

配置和驗證過程以下:

一、建立審計用的數據庫和表:

 

二、建立具備操做auditdb數據權限的用戶:

若是已經有用戶,須要對現有用戶添加操做auditdb的權限:

1 MySQL> insert into mysql.db (Host,Db,User1,Insert_priv) values ('%','auditdb','','Y');
2 Query OK, 1 row affected (0.03 sec)
3 MySQL> flush privileges;
4 Query OK, 0 rows affected (0.00 sec)

 

三、設置init_connect,並重啓MySQL數據庫在初始化參數文件[mysql]部分添加以下內容:

1 log-bin=mysql-bin #開啓Binlog
2 init_connect='insert into auditdb.accesslog(connectionid, connectionuser,logintime) values(connection_id(),user(),now());' #設置初始化鏈接參數

 

四、用user1用戶登陸,執行一些寫入和刪除的操做;

五、用mysqlbinlog工具查看BinLog,根據delete操做找到相應的ThreadId,然後在前面建立的審計日誌表auditdb.accesslog裏面根據ThreadID找到用戶登陸信息:

查看當前binlog mysqlbin.000029的內容,並找到delete操做對應的ThreadID D:\mysql57\bin>mysqlbinlog   ../data/mysql-bin.000029 

從Binlog中能夠得知刪除Test2表對應的threadid是8,根據ThreadID在審計表裏查看用戶的登陸信息,能夠得知這個刪除操做是user1用戶在本機執行的操做。

說明:採用這種方式進行審計,因爲init-connect只會在鏈接時執行,不會對數據庫產生大的性能影響,可是init-connect不會記錄擁有root權限的用戶記錄.

 

方法三 使用審計插件

除了商業版的審計插件外,常見的還有三類審計插件Percona Audit Log Plugin、MariaDB Audit Plugin、McAfee MySQL Audit Plugin。這幾個插件功能上大同小異,只是展現的內容和格式略有不一樣。
咱們以MariaDB Audit Plugin爲例,給你們介紹如何採用插件的方式實現對Mysql數據的審計。

1、下載與安裝

一、下載MariaDB Audit Plugin插件(下載地址:https://downloads.mariadb.org/mariadb/5.5.64/)

 

二、安裝:把server_audit.dll複製到對應的mysql插件庫中D:\mysql57\lib\plugin,執行install安裝命令:

 

三、安裝驗證:Mysql>show variables like '%audit%'

 

2、關鍵審計參數說明

  • server_audit_logging:啓動或關閉審計

  • server_audit_events:指定記錄事件的類型,能夠用逗號分隔的多個值(connect,query,table) ,默認爲空表明審計全部事件。

  • server_audit_incl_users:指定哪些用戶的活動將記錄,默認審計全部用戶,該變量比server_audit_excl_users優先級高

  • server_audit_excl_users:指定哪些用戶行爲不記錄

  • server_audit_output_type:指定日誌輸出類型,可爲SYSLOG或FILE,缺省輸出至審計文件

 

3、審計過程示例

一、開啓審計mysql>set global server_audit_logging=on 

因爲是驗證測試,咱們其他參數都按默認設置。

二、執行一些數據庫操做:

 

三、查看審計記錄日誌,server_audit.log,默認在data目錄下:

咱們看見,剛纔在Mysql數據庫的操做都已經審計上了。

 

使用公有云RDS服務的場景

 

目前雲計算的普及,雲供應商都提供雲數據庫服務,固然Mysql是雲數據庫服務重要的一員。相比傳統數據庫,雲數據庫易於部署、管理和擴展,提供數據可靠性、安全性、運行狀態監控等全套解決方案。
那麼在雲數據庫Mysql上是如何實現對數據庫的審計的呢?咱們以京東云云數據庫Mysql爲例,京東雲的Mysql審計功能是經過MariaDB Audit Plugin插件實現的。下面給你們介紹雲數據庫Mysql審計的開啓、使用、關閉等功能。

一、登陸雲數據庫 RDS 管理控制檯;

二、選擇須要查詢 SQL 審計的目標實例,點擊目標實例, 進入實例詳情頁,切換至 SQL 審計 Tab 頁;

三、點擊審計狀態開關就能夠在線切換審計的開啓與關閉;

四、執行一些數據庫的操做,然後看審計數據。審計開啓後,SQL 審計查詢功能說明以下:

  • 執行時間:能夠選擇從當前時間往前推 7 天的時間區間,做爲 SQL 審計查詢的時間段;

  • 數據庫:能夠查看指定數據庫的 SQL 語句;

  • 帳號:能夠查看指定帳號的 SQL 語句。

五、點擊查詢按鈕,查看符合要求的SQL審計結果列表:

經過上面的例子,能夠看見,雲數據庫的管理和運維比自建數據庫確實要簡單不少,用戶不用關心審計的方式、審計數據的存儲位置等等。只不過,雲數據庫因爲是以雲服務的形式提供給最終用戶,用戶就須要按照雲服務的要求和使用說明進行操做。

歡迎點擊「連接」瞭解京東雲更多精彩內容

 

 

重磅來襲
*618帶你上雲 *
雲數據庫-MySQL只需1折

 

點擊京東雲瞭解更多詳情

相關文章
相關標籤/搜索