Mysql5.6審計功能,mysql5.6審計
1. 前言 為了安全和操作的可追溯性考慮,越來越多的公司加入了審計功能。mysql5.5推出了相關的審計功能,到5.6.20功能進一步完善,算是勉強可用了,雖然細粒度方面做的不是太好,但是後續版本還是可以期待一下的。這裡主要介紹下相關的功能和特性。
2. 開啟審計2.1 設定檔載入mysql5.6中的審計是通過audit_log外掛程式來實現的,我們可以在設定檔中載入該外掛程式來開啟。
[mysqld] plugin-load=audit_log.so
如果希望資料庫強制開啟審計功能,如果不開啟的話server不啟動,或者審計功能不能進行時server掛住,加入
[mysqld] plugin-load=audit_log.so audit-log=FORCE_PLUS_PERMANENT
2.2 載入外掛程式列表審計功能的開啟還有另外一種方式,就是在命令列中安裝審計外掛程式。確保在資料庫的外掛程式目錄中存在audit_log.so。[i686資料庫的外掛程式目錄預設是/usr/lib/mysql/plugin,中,也可以指定參數plugin_dir]
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
3. 參數介紹審計參數如下:
3.1 audit_log_buffer_size audit_log_buffer_size :審計緩衝,建議設定為4096的倍數,該參數只有在audit_log_strategy為ASYNCHRONOUS時生效。
3.2 audit_log_connection_policyaudit_log_connection_policy:記錄了串連審計的資訊。包含三個參數
Value |
Description |
ALL |
Log all connection events |
ERRORS |
Log only failed connection events |
NONE |
Do not log connection events |
如果設定了audit_log_policy可能會被覆蓋。3.3 audit_log_current_sessionaudit_log_current_session:標誌當前會話是否進入審計,是個唯讀參數,只能通過 audit_log_exclude_accounts和 audit_log_include_accounts來控制哪兒些進入會話審計。
3.4 audit_log_exclude_accounts/audit_log_include_accountsaudit_log_exclude_accounts:控制哪兒些使用者可以不進入審計,字串類型,預設可以使用逗號分隔。
audit_log_include_accounts:控制哪兒些使用者可以進入審計,字串類型,預設可以使用逗號分隔。
exclude和include同時只有一個參數生效。3.5 audit_log_fileaudit_log_file:可以用於控制審計日誌的名稱和路徑。
3.6 audit_log_flushaudit_log_flush:控制審計日誌的歸檔,只有在audit_log_rotate_on_size=0的時候生效,在手工重新命名審計日誌歸檔後,可以指定audit_log_flush=1來產生新的審計日誌。
3.7 audit_log_formataudit_log_format:審計日誌的格式,分為OLD和NEW(NEW格式在5.6.14才出現)。當更改格式的時候需要進行3個步驟:
1 :關閉資料庫2:重新命名當前的audit.log檔案
3:更改audit_log_format參數,並重啟mysql,重啟後會自動產生一個新的audit.log檔案
防止NEW格式和OLD格式在同一個審計日誌中,會導致審計功能錯誤。audit_log_policy :記錄了審計日誌的控制策略:
Value |
Description |
ALL |
Log all events |
LOGINS |
Log only login events |
QUERIES |
Log only query events |
NONE |
Log nothing (disable the audit stream |
3.8 audit_log_statement_policyaudit_log_statement_policy:記錄了語句的審計策略,可能會被audit_log_policy給覆蓋:
Value |
Description |
ALL |
Log all statement events |
ERRORS |
Log only failed statement events |
NONE |
Do not log statement events |
3.9 audit_log_rotate_on_sizeaudit_log_rotate_on_size:審計日誌的檔案大小。當參數大於0的時候,當審計日誌超過限制後,會自動的重新命名為加時間戳記尾碼的記錄檔。同時建立新的審計日誌。
3.10 audit_log_strategyaudit_log_strategy:審計日誌的重新整理策略分為:
Value |
Meaning |
ASYNCHRONOUS |
Log asynchronously, wait for space in output buffer |
PERFORMANCE |
Log asynchronously, drop request if insufficient space in output buffer |
SEMISYNCHRONOUS |
Log synchronously, permit caching by operating system |
SYNCHRONOUS |
Log synchronously, call sync() after each request |
4. 日誌格式審計日誌格式是XML的形式,NEW要比OLD的標籤詳細一些。具體的標籤資訊如下:執行個體:
<?xml version="1.0" encoding="UTF-8"?><AUDIT> <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:24 UTC</TIMESTAMP> <RECORD_ID>1_2013-09-17T15:03:24</RECORD_ID> <NAME>Audit</NAME> <SERVER_ID>1</SERVER_ID> <VERSION>1</VERSION> <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --socket=/usr/local/mysql/mysql.sock --port=3306</STARTUP_OPTIONS> <OS_VERSION>x86_64-osx10.6</OS_VERSION> <MYSQL_VERSION>5.7.2-m12-log</MYSQL_VERSION> </AUDIT_RECORD> <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:40 UTC</TIMESTAMP> <RECORD_ID>2_2013-09-17T15:03:24</RECORD_ID> <NAME>Connect</NAME> <CONNECTION_ID>2</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root</USER> <OS_LOGIN></OS_LOGIN> <HOST>localhost</HOST> <IP>127.0.0.1</IP> <COMMAND_CLASS>connect</COMMAND_CLASS> <PRIV_USER>root</PRIV_USER> <PROXY_USER></PROXY_USER> <DB>test</DB> </AUDIT_RECORD>... <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP> <RECORD_ID>4_2013-09-17T15:03:24</RECORD_ID> <NAME>Query</NAME> <CONNECTION_ID>2</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root[root] @ localhost [127.0.0.1]</USER> <OS_LOGIN></OS_LOGIN> <HOST>localhost</HOST> <IP>127.0.0.1</IP> <COMMAND_CLASS>drop_table</COMMAND_CLASS> <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT> </AUDIT_RECORD> <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP> <RECORD_ID>5_2013-09-17T15:03:24</RECORD_ID> <NAME>Query</NAME> <CONNECTION_ID>2</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root[root] @ localhost [127.0.0.1]</USER> <OS_LOGIN></OS_LOGIN> <HOST>localhost</HOST> <IP>127.0.0.1</IP> <COMMAND_CLASS>create_table</COMMAND_CLASS> <SQLTEXT>CREATE TABLE t (i INT)</SQLTEXT> </AUDIT_RECORD>... <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP> <RECORD_ID>7_2013-09-17T15:03:24</RECORD_ID> <NAME>Quit</NAME> <CONNECTION_ID>2</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER></USER> <OS_LOGIN></OS_LOGIN> <HOST></HOST> <IP></IP> <COMMAND_CLASS>connect</COMMAND_CLASS> </AUDIT_RECORD>... <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:47 UTC</TIMESTAMP> <RECORD_ID>9_2013-09-17T15:03:24</RECORD_ID> <NAME>Shutdown</NAME> <CONNECTION_ID>3</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root[root] @ localhost [127.0.0.1]</USER> <OS_LOGIN></OS_LOGIN> <HOST>localhost</HOST> <IP>127.0.0.1</IP> <COMMAND_CLASS></COMMAND_CLASS> </AUDIT_RECORD> <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:47 UTC</TIMESTAMP> <RECORD_ID>10_2013-09-17T15:03:24</RECORD_ID> <NAME>Quit</NAME> <CONNECTION_ID>3</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER></USER> <OS_LOGIN></OS_LOGIN> <HOST></HOST> <IP></IP> <COMMAND_CLASS>connect</COMMAND_CLASS> </AUDIT_RECORD> <AUDIT_RECORD> <TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP> <RECORD_ID>11_2013-09-17T15:03:24</RECORD_ID> <NAME>NoAudit</NAME> <SERVER_ID>1</SERVER_ID> </AUDIT_RECORD></AUDIT>
<audit>:檔案的根標籤為<AUDIT>,並以 </AUDIT>為結束標籤
<AUDIT_RECORD> :包含一系列的必選標籤和可選標籤,可選標籤是否出現取決於audit record類型。
<NAME>:必選,例如<NAME>Query</NAME>,可能出現的值還包含Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, Time.
<RECORD_ID>:必選,例如<RECORD_ID>28743_2013-09-18T21:03:24</RECORD_ID>,包含一些列數字和時間戳記,數字表示的是記錄數,每增加一條記錄,數字加1.
<TIMESTAMP>:必選,例如<TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP>,包含時間戳記和時區兩部分,記錄的是從用戶端接收到的sql執行完時刻的時間。
以下標籤audit record類型決定是否出現
<COMMAND_CLASS>:命令的類型。例如<COMMAND_CLASS>drop_table</COMMAND_CLASS>.
<CONNECTION_ID>:例如<CONNECTION_ID>127</CONNECTION_ID>,代表用戶端串連標識符的無符號整型數字。
<DB>:mysql串連的預設資料庫名稱,該標籤只在 <NAME>值是Connect或Change user時出現.
<HOST>:client端的主機名稱,該標籤只在 <NAME>值是Connect,Change user或Query時出現,例如<HOST>localhost</HOST>。
<IP>:client端的IP地址,該標籤只在 <NAME>值是Connect,Change user或Query時出現,例如<IP>127.0.0.1</IP>。
<MYSQL_VERSION>:mysql版本號碼,只在 <NAME>值是Audit時出現,例如<MYSQL_VERSION>5.7.1-m11-log</MYSQL_VERSION>
<OS_LOGIN>:外部使用者,該標籤只在 <NAME>值是Connect,Change user或Query時出現。
<OS_VERSION>:表示運行資料庫的伺服器的作業系統,只在 <NAME>值是Audit時出現,例如<OS_VERSION>x86_64-Linux</OS_VERSION>。
<PRIV_USER>:伺服器認證的用戶端名稱。該標籤只在 <NAME>值是Connect或Change user時出現。例如<PRIV_USER>root</PRIV_USER>。
<PROXY_USER>:通過proxy串連到mysql的使用者。該標籤只在 <NAME>值是Connect或Change user時出現。
<SERVER_ID>:mysql資料庫伺服器的ID號,該標籤只在 <NAME>值是Audit或No Audit時出現。例如<SERVER_ID>1</SERVER_ID>。
<SQLTEXT>:實際執行的SQL語句。該標籤只在 <NAME>值是 Query 或 Execute時出現。例如<SQLTEXT>DELETE FROM t1</SQLTEXT>。
<STARTUP_OPTIONS>:mysql資料庫啟動選項,該標籤只在 <NAME>值是Audit時出現,例如<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log-output=FILE</STARTUP_OPTIONS>
<STATUS>:代表sql命令的執行狀態,0表示成功,其餘表示有錯誤。例如<STATUS>1051</STATUS>。
<STATUS_CODE>:代表sql命令的執行狀態,0表示成功,1表示有錯誤。例如<STATUS_CODE>0</STATUS_CODE>。
<USER>:用戶端串連mysql伺服器的使用者名稱。例如<USER>root[root] @ localhost [127.0.0.1]</USER>。
<VERSION>:表示記錄檔格式的版本號碼。該標籤只在 <NAME>值是Audit時出現。例如<VERSION>1</VERSION>。
5. 審計限制審計日誌預設存放在data路徑下,由於XML檔案沒有經過加密,官網建議通過參數指定到特殊路徑下,設定相應人員許可權,進行安全控制。此外審計功能有如下情況不能進行記錄:1)只有top-level(無變數定義)的語句才能進行審計,儲存程式如預存程序,觸發器,函數等不審計;2)涉及到外部檔案的語句無法進行審計,如load data infile。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。