本實驗的審計插件均是安裝在 mysql-community-server-5.7.9 的服務器上。
插件安裝(社區版)
插件下載地址:
https://bintray.com/mcafee/mysql-audit-plugin/release#files
解壓:
# unzip audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip Archive: audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip creating: audit-plugin-mysql-5.7-1.1.4-725/ creating: audit-plugin-mysql-5.7-1.1.4-725/lib/ inflating: audit-plugin-mysql-5.7-1.1.4-725/lib/libaudit_plugin.so inflating: audit-plugin-mysql-5.7-1.1.4-725/COPYING inflating: audit-plugin-mysql-5.7-1.1.4-725/THIRDPARTY.txt inflating: audit-plugin-mysql-5.7-1.1.4-725/README.txt inflating: audit-plugin-mysql-5.7-1.1.4-725/plugin-name.txt creating: audit-plugin-mysql-5.7-1.1.4-725/utils/
查看MySQL的插件目錄:
> show variables like 'plugin_dir'; +---------------+------------------------------+ | Variable_name | Value | +---------------+------------------------------+ | plugin_dir | /usr/local/mysql/lib/plugin/ | +---------------+------------------------------+
復制庫文件到MySQL庫目錄下:
# cp audit-plugin-mysql-5.7-1.1.4-725/lib/libaudit_plugin.so /usr/local/mysql/lib/plugin/ # chmod a+x libaudit_plugin.so
進入mysql命令窗口,安裝插件:
> install plugin audit soname 'libaudit_plugin.so'; Query OK, 0 rows affected (0.06 sec)
查看mysql當前已經加載了哪些插件:
> show plugins; +----------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | ………… | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | | AUDIT | ACTIVE | AUDIT | libaudit_plugin.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+
查看版本:
> show global status like '%audit%'; +------------------------+-----------+ | Variable_name | Value | +------------------------+-----------+ | Audit_protocol_version | 1.0 | | Audit_version | 1.1.4-725 | +------------------------+-----------+
開啟Audit功能:
> SET GLOBAL audit_json_file=ON; Query OK, 0 rows affected (0.00 sec)
執行任何語句(默認會記錄任何語句,有語法錯誤的不會記錄),然后去mysql數據目錄查看mysql-audit.json文件(默認為該文件)。
插入一些數據,查看一下mysql-audit.json文件信息(json格式),如下:
{ "msg-type": "activity", "date": "1510038432019", "thread-id": "43", "query-id": "1891", "user": "root", "priv_user": "root", "ip": "", "host": "localhost", "connect_attrs": { "_os": "linux-glibc2.5", "_client_name": "libmysql", "_pid": "4009", "_client_version": "5.7.9", "_platform": "x86_64", "program_name": "mysql" }, "pid": "4009", "os_user": "root", "appname": "mysql", "rows": "1", "cmd": "insert", "objects": [ { "db": "part", "name": "e", "obj_type": "TABLE" } ], "query": "insert into e values (9898,'smart','james')" }
可以查看插件有哪些可配置的參數:
mysql> SHOW GLOBAL VARIABLES LIKE '%audi%';
其中我們需要關注的參數有:
1. audit_json_file
是否開啟audit功能。
2. audit_json_log_file
記錄文件的路徑和名稱信息(默認放在mysql數據目錄下)。
3. audit_record_cmds
audit記錄的命令,默認為記錄所有命令。可以設置為任意dml、dcl、ddl的組合。如:audit_record_cmds=select,insert,delete,update。還可以在線設置set global audit_record_cmds=NULL。(表示記錄所有命令)
4. audit_record_objs
audit記錄操作的對象,默認為記錄所有對象,可以用SET GLOBAL audit_record_objs=NULL設置為默認。也可以指定為下面的格式:audit_record_objs=,test.*,mysql.*,information_schema.*。
5. audit_whitelist_users
用戶白名單。
詳細的參數說明,可以直接訪問官方說明:
https://github.com/mcafee/mysql-audit/wiki/Configuration
最后為了保證重啟數據庫,配置不丟失,修改my.cnf 配置文件,將下面的配置添加到[mysqld]中,所以在配置文件中my.cnf加入參數:
- audit_json_file=on #保證mysql重啟后自動啟動插件
- plugin-load=AUDIT=libaudit_plugin.so #防止刪除了插件,重啟后又會加載
- audit_record_cmds='insert,delete,update,create,drop,alter,grant,truncate' #要記錄哪些命令語句,因為默認記錄所有操作;
保存重啟即可看到效果。
插件卸載
直接執行 UNINSTALL PLUGIN AUDIT 卸載會報錯:
> uninstall plugin AUDIT; ERROR 1148 (42000): Uninstall AUDIT plugin disabled > set audit_uninstall_plugin=on; ERROR 1238 (HY000): Variable 'audit_uninstall_plugin' is a read only variable
需要在 my.cnf 中 [mysqld] 下添加 audit_uninstall_plugin=1,重啟mysql。重啟完畢后執行兩次 UNINSTALL PLUGIN AUDIT; 即可卸載。
> UNINSTALL PLUGIN AUDIT; ERROR 1620 (HY000): Uninstall AUDIT plugin must be called again to complete > UNINSTALL PLUGIN AUDIT; Query OK, 0 rows affected, 1 warning (0.01 sec)
卸載完成后需要從 my.cnf 中刪除 audit_uninstall_plugin=1 ,否則下次mysql啟動會報錯:[ERROR] /data/mysql/bin/mysqld: unknown variable 'audit_uninstall_plugin=1'
MariaDB server_audit 審計插件
MySQL 社區版還可以安裝 MariaDB 的審計插件,安裝方法同上面的基本一致。
下載地址:https://mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin/ (也可以直接下載MariaDB對應的版本后,解壓后在plugin目錄下有server_audit.so插件)
MariaDB_5.5.37版本和MariaDB_10.0.10以后版本的audit插件支持MariaDB, MySQL、Percona Server使用。
MariaDB_5.x.x 和 MariaDB_10.x.x 區別:
MariaDB_5.x.x:兼容MySQL5.x.x的,接口幾乎一致,只限於社區版
MariaDB_10.x.x:10.x.x使用新技術,接口會與mysql逐漸區別開來。目標就是以后想MariaDB新接口過渡。
這里采用的是下載 MariaDB 二進制安裝包,解壓獲取 server_audit.so 插件,版本為5.5.58,下載地址:mariadb-5.5.58-linux-x86_64.tar.gz ,下載解壓后,復制 mariadb-5.5.58-linux-x86_64/lib/plugin 下的 server_audit.so 到 /usr/local/mysql/lib/plugin 下,添加 +x 權限。然后安裝:
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
查看變量開啟設置情況,默認貌似都是關閉的:
> show variables like '%server_audit%'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | server_audit_events | | | server_audit_excl_users | | | server_audit_file_path | server_audit.log | | server_audit_file_rotate_now | OFF | | server_audit_file_rotate_size | 1000000 | | server_audit_file_rotations | 9 | | server_audit_incl_users | | | server_audit_loc_info | | | server_audit_logging | OFF | | server_audit_mode | 1 | | server_audit_output_type | file | | server_audit_query_log_limit | 1024 | | server_audit_syslog_facility | LOG_USER | | server_audit_syslog_ident | mysql-server_auditing | | server_audit_syslog_info | | | server_audit_syslog_priority | LOG_INFO | +-------------------------------+-----------------------+
可以在 my.cnf 中添加如下配置,然后重啟 mysqld:
server_audit_events='CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL' #備注:指定哪些操作被記錄到日志文件中
server_audit_logging=on
server_audit_file_path =/data/mysql/auditlogs/ #備注:審計日志存放路徑,該路徑下會生成一個server_audit.log文件,就會記錄相關操作記錄了
server_audit_file_rotate_size=200000000
server_audit_file_rotations=200
server_audit_file_rotate_now=ON
也可以動態開啟審計功能:
> set global server_audit_logging=on; Query OK, 0 rows affected (0.00 sec)
默認在mysql的數據目錄下生成文件 server_audit.log ,日志格式為:
20171107 17:56:16,CentOS6.6-Slave1,,,4,11,QUERY,,'select host,user,plugin from mysql.users',1146
20171107 18:26:00,CentOS6.6-Slave1,,,4,13,QUERY,,'insert into t values (7)',0
20171107 18:27:49,CentOS6.6-Slave1,,,4,15,QUERY,,'shows',1064 #語法錯誤的語句也會被記錄
可以看到,MariaDB的審計插件日志要比MySQL社區插件簡潔許多。
參數說明:(請參考:https://mariadb.com/kb/en/mariadb/server_audit-system-variables/)
server_audit_output_type:指定日志輸出類型,可為SYSLOG或FILE
server_audit_logging:啟動或關閉審計
server_audit_events:指定記錄事件的類型,可以用逗號分隔的多個值(connect,query,table),如果開啟了查詢緩存(query cache),查詢直接從查詢緩存返回數據,將沒有table記錄
server_audit_file_path:如server_audit_output_type為FILE,使用該變量設置存儲日志的文件,可以指定目錄,默認存放在數據目錄的server_audit.log文件中
server_audit_file_rotate_size:限制日志文件的大小
server_audit_file_rotations:指定日志文件的數量,如果為0日志將從不輪轉
server_audit_file_rotate_now:強制日志文件輪轉
server_audit_incl_users:指定哪些用戶的活動將記錄,connect將不受此變量影響,該變量比server_audit_excl_users優先級高
server_audit_syslog_facility:默認為LOG_USER,指定facility
server_audit_syslog_ident:設置ident,作為每個syslog記錄的一部分
server_audit_syslog_info:指定的info字符串將添加到syslog記錄
server_audit_syslog_priority:定義記錄日志的syslogd priority
server_audit_excl_users:該列表的用戶行為將不記錄,connect將不受該設置影響
server_audit_mode:標識版本,用於開發測試
卸載 server_audit
mysql> UNINSTALL PLUGIN server_audit; mysql> show variables like '%audit%'; Empty set (0.00 sec)
防止 server_audit 插件被卸載,需要在配置文件中添加:
[mysqld]
server_audit=FORCE_PLUS_PERMANENT
重啟MySQL生效
mysql> UNINSTALL PLUGIN server_audit; ERROR 1702 (HY000): Plugin 'server_audit' is force_plus_permanent and can not be unloaded
值得注意的是,應該在server_audit插件被安裝好,並且已經運行之后添加這些配置,否則過早在配置文件添加這個選項,會導致MySQL發生啟動錯誤!
MySQL Enterprise Audit Plugin
MySQL 企業版的 Enterprise Edition 中自帶 Audit Plugin ,名為 audit_log.so ,安裝也很簡單:
> install plugin audit_log soname 'audit_log.so';
默認在 datadir 目錄下生成 audit.log ,其格式為 xml ,下面舉幾個例子。
#退出 mysql shell <AUDIT_RECORD> <TIMESTAMP>2017-11-09T03:28:23 UTC</TIMESTAMP> <RECORD_ID>4_2017-11-09T03:23:12</RECORD_ID> <NAME>Quit</NAME> <CONNECTION_ID>3</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root</USER> <OS_LOGIN/> <HOST>localhost</HOST> <IP/> <COMMAND_CLASS>connect</COMMAND_CLASS> <CONNECTION_TYPE>Socket</CONNECTION_TYPE> </AUDIT_RECORD>
# 登錄失敗,用戶名或密碼錯誤,錯誤碼 1045 <AUDIT_RECORD> <TIMESTAMP>2017-11-09T03:28:25 UTC</TIMESTAMP> <RECORD_ID>5_2017-11-09T03:23:12</RECORD_ID> <NAME>Connect</NAME> <CONNECTION_ID>4</CONNECTION_ID> <STATUS>1045</STATUS> <STATUS_CODE>1</STATUS_CODE> <USER>root</USER> <OS_LOGIN/> <HOST>localhost</HOST> <IP/> <COMMAND_CLASS>connect</COMMAND_CLASS> <CONNECTION_TYPE>Socket</CONNECTION_TYPE> <PRIV_USER>root</PRIV_USER> <PROXY_USER/> <DB/> </AUDIT_RECORD>
# 登錄成功 STATUS=0 <AUDIT_RECORD> <TIMESTAMP>2017-11-09T03:29:43 UTC</TIMESTAMP> <RECORD_ID>6_2017-11-09T03:23:12</RECORD_ID> <NAME>Connect</NAME> <CONNECTION_ID>5</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root</USER> <OS_LOGIN/> <HOST>localhost</HOST> <IP/> <COMMAND_CLASS>connect</COMMAND_CLASS> <CONNECTION_TYPE>Socket</CONNECTION_TYPE> <PRIV_USER>root</PRIV_USER> <PROXY_USER/> <DB/> </AUDIT_RECORD>
# 執行命令 show_variables <AUDIT_RECORD> <TIMESTAMP>2017-11-09T03:31:12 UTC</TIMESTAMP> <RECORD_ID>9_2017-11-09T03:23:12</RECORD_ID> <NAME>Query</NAME> <CONNECTION_ID>5</CONNECTION_ID> <STATUS>0</STATUS> <STATUS_CODE>0</STATUS_CODE> <USER>root[root] @ localhost []</USER> <OS_LOGIN/> <HOST>localhost</HOST> <IP/> <COMMAND_CLASS>show_variables</COMMAND_CLASS> <SQLTEXT>show global variables like '%audit%'</SQLTEXT> </AUDIT_RECORD>
注意:企業版 audit plugin 也會記錄語法錯誤的sql語句。
# 各標簽元素解釋 <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>。