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_policy
audit_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_session
audit_log_current_session:標志當前會話是否進入審計,是個只讀參數,只能通過 audit_log_exclude_accounts和 audit_log_include_accounts來控制哪兒些進入會話審計。
3.4 audit_log_exclude_accounts/audit_log_include_accounts
audit_log_exclude_accounts:控制哪兒些用戶可以不進入審計,字符串類型,默認可以使用逗號分隔。
audit_log_include_accounts:控制哪兒些用戶可以進入審計,字符串類型,默認可以使用逗號分隔。
exclude和include同時只有一個參數生效。
3.5 audit_log_file
audit_log_file:可以用於控制審計日志的名稱和路徑。
3.6 audit_log_flush
audit_log_flush:控制審計日志的歸檔,只有在audit_log_rotate_on_size=0的時候生效,在手工重命名審計日志歸檔後,可以指定audit_log_flush=1來生成新的審計日志。
3.7 audit_log_format
audit_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_policy
audit_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_size
audit_log_rotate_on_size:審計日志的文件大小。當參數大於0的時候,當審計日志超過限制後,會自動的重命名為加時間戳後綴的日志文件。同時創建新的審計日志。
3.10 audit_log_strategy
audit_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的標簽詳細一些。具體的標簽信息如下: 實例:
2013-09-17T15:03:24 UTC
1_2013-09-17T15:03:24
Audit
1
1
/usr/local/mysql/bin/mysqld
--socket=/usr/local/mysql/mysql.sock
--port=3306
x86_64-osx10.6
5.7.2-m12-log
2013-09-17T15:03:40 UTC
2_2013-09-17T15:03:24
Connect
2
0
0
root
localhost
127.0.0.1
connect
root
test
...
2013-09-17T15:03:41 UTC
4_2013-09-17T15:03:24
Query
2
0
0
root[root] @ localhost [127.0.0.1]
localhost
127.0.0.1
drop_table
DROP TABLE IF EXISTS t
2013-09-17T15:03:41 UTC
5_2013-09-17T15:03:24
Query
2
0
0
root[root] @ localhost [127.0.0.1]
localhost
127.0.0.1
create_table
CREATE TABLE t (i INT)
...
2013-09-17T15:03:41 UTC
7_2013-09-17T15:03:24
Quit
2
0
0
connect
...
2013-09-17T15:03:47 UTC
9_2013-09-17T15:03:24
Shutdown
3
0
0
root[root] @ localhost [127.0.0.1]
localhost
127.0.0.1
2013-09-17T15:03:47 UTC
10_2013-09-17T15:03:24
Quit
3
0
0
connect
2013-09-17T15:03:49 UTC
11_2013-09-17T15:03:24
NoAudit
1
:文件的根標簽為,並以 為結束標簽
:包含一系列的必選標簽和可選標簽,可選標簽是否出現取決於audit record類型。
:必選,例如Query,可能出現的值還包含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.
:必選,例如28743_2013-09-18T21:03:24,包含一些列數字和時間戳,數字表示的是記錄數,每增加一條記錄,數字加1.
:必選,例如2013-09-17T15:03:49 UTC,包含時間戳和時區兩部分,記錄的是從客戶端接收到的sql執行完時刻的時間。
以下標簽audit record類型決定是否出現
:命令的類型。例如drop_table.
:例如127,代表客戶端連接標識符的無符號整型數字。
:mysql連接的默認數據庫名稱,該標簽只在 值是Connect或Change user時出現.
:client端的主機名,該標簽只在 值是Connect,Change user或Query時出現,例如localhost。
:client端的IP地址,該標簽只在 值是Connect,Change user或Query時出現,例如127.0.0.1。
:mysql版本號,只在 值是Audit時出現,例如5.7.1-m11-log
:外部用戶,該標簽只在 值是Connect,Change user或Query時出現。
:表示運行數據庫的服務器的操作系統,只在 值是Audit時出現,例如x86_64-Linux。
:服務器認證的客戶端名稱。該標簽只在 值是Connect或Change user時出現。例如root。
:通過proxy連接到mysql的用戶。該標簽只在 值是Connect或Change user時出現。
:mysql數據庫服務器的ID號,該標簽只在 值是Audit或No Audit時出現。例如1。
:實際執行的SQL語句。該標簽只在 值是 Query 或 Execute時出現。例如DELETE FROM t1。
:mysql數據庫啟動選項,該標簽只在 值是Audit時出現,例如/usr/local/mysql/bin/mysqld --port=3306 --log-output=FILE
:代表sql命令的執行狀態,0表示成功,其余表示有錯誤。例如1051。
:代表sql命令的執行狀態,0表示成功,1表示有錯誤。例如0。
:客戶端連接mysql服務器的用戶名。例如root[root] @ localhost [127.0.0.1]。
:表示日志文件格式的版本號。該標簽只在 值是Audit時出現。例如1。
5. 審計限制
審計日志默認存放在data路徑下,由於XML文件沒有經過加密,官網建議通過參數指定到特殊路徑下,設置相應人員權限,進行安全控制。 此外審計功能有如下情況不能進行記錄: 1)只有top-level(無變量定義)的語句才能進行審計,存儲程序如存儲過程,觸發器,函數等不審計; 2)涉及到外部文件的語句無法進行審計,如load data infile。