MySQL审计⼯具AuditPlugin安装使⽤
本实验的审计插件均是安装在 mysql-community-server-5.7.9 的服务器上。
插件安装(社区版)
插件下载地址:
解压:
# 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.
inflating: audit-plugin-mysql-5.7-1.1.
inflating: audit-plugin-mysql-5.7-1.1.
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-audi
t.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
⽤户⽩名单。
详细的参数说明,可以直接访问官⽅说明:
最后为了保证重启数据库,配置不丢失,修改myf 配置⽂件,将下⾯的配置添加到[mysqld]中,所以在配置⽂件中myf加⼊参数: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
需要在 myf 中 [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)
卸载完成后需要从 myf 中删除 audit_uninstall_plugin=1 ,否则下次mysql启动会报错:[ERROR] /data/mysql/bin/mysqld: unknown variable 'audit_uninstall_plugin=1'参考:
MariaDB server_audit 审计插件
MySQL 社区版还可以安装 MariaDB 的审计插件,安装⽅法同上⾯的基本⼀致。
MariaDB_5.5.37版本和MariaDB_10.0.10以后版本的audit插件⽀持MariaDB, MySQL、Percona Server使⽤。
和 区别:
  :兼容的,接⼝⼏乎⼀致,只限于社区版
  :10.x.x使⽤新技术,接⼝会与mysql逐渐区别开来。⽬标就是以后想MariaDB新接⼝过渡。
这⾥采⽤的是下载 MariaDB ⼆进制安装包,解压获取 server_audit.so 插件,版本为5.5.58,下载地址:,下载解压后,复制 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              |
+-------------------------------+-----------------------+
可以在 myf 中添加如下配置,然后重启 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社区插件简洁许多。
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语句。
# 各标签元素解释
安装mysql失败<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>。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。