参考网址:http://www.omgdba.com/mysql-audit-plugin-now-available-in-percona-server-5-5-and-5-6.html
个人感觉审计没啥用处,偶然间看到这个功能总结了解下。
####percona的审计插件的动态链接库下载地址:二进制安装目录下有库文件(audit_log.so) 自己找一下。下方提到的其它动态链接库获取方式一样,直接下载数据库安装包查找即可。
https://www.percona.com/downloads/Percona-Server-5.6/LATEST/binary/ ##二进制包下载 。
https://www.percona.com/downloads/Percona-Server-5.6/LATEST/source/ ##源码包下载。可能需要编译后获取到动态链接库。
二进制包下载解释:
原文地址:http://www.mysqlperformanceblog.com/2014/05/07/mysql-audit-plugin-now-available-in-percona-server-5-5-and-5-6/
昨天(2014-05-06)发布的两个新版本 Percona Server 5.5.37-35.0 和 Percona Server 5.6.17-65.0-56都包含了MySQL Audit Plugin(MySQL审计插件)的开源版本。以上产品发布之前,该插件只可用于MySQL企业版中。
注1:要说明一点,该实现是MySQL企业版审计日志插件的替代产品。Percona以GPL授权方式重新实现了审计插件,这在Oracle是闭源的。
注2:提一下:另外两个产品McAfee MySQL Audit Plugin 和 MariaDB Audit Plugin for MySQL也实现了开源审计插件。但是他们都用各自的不同于Oracle实现的审计日志方式。Percona的实现是第一个MySQL Enterprise Audit Plugin的替代插件。
在许多应用中,记录所有的MySQL使用记录是非常重要的。比如:
起初,最简单的选择是启用通用日志(enable general log)(其他选择包括使用二进制日志记录除select以外的查询,或者在MySQL连接器或应用中启用追踪)。然而,通用日志记录所有的查询会极大地降低MySQL应用的性能:Aleksandr Kuzminsky在2009年发布了一个测试基准向我们展示通用日志和慢查询日志的总开销(the overhead of MySQL general and slow log)。MySQL审计插件的主要好处在于可以异步记录所有查询(可在配置中更改)。无决定在Percona Server中使用新的审计插件并在应用中对比测试使用新插件和使用通用日志对性能的影响。
如何使用MySQL审计插件
首先,我们要启用MySQL审计插件,详见https://dev.mysql.com/doc/refman/5.5/en/audit-log-plugin-installation.html
1
2
3
4
5
6
7
8
9
|
mysql
>
select
version();
+-------------+
|
version()
|
+-------------+
|
5.5.37
-35.0
|
+-------------+
1
row
in
set
(0.00
sec)
mysql
>
INSTALL PLUGIN
audit_log
SONAME
'audit_log.so';
Query
OK,
0
rows
affected
(0.00
sec)
|
现在我们可以查看所有MySQL审计插件的选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mysql
>
show
global
variables
like
'%audit%';
+--------------------------+--------------+
|
Variable_name
|
Value
|
+--------------------------+--------------+
|
audit_log_buffer_size
|
1048576
|
|
audit_log_file
|
audit.
log
|
|
audit_log_flush
|
OFF
|
|
audit_log_format
|
OLD
|
|
audit_log_policy
|
ALL
|
|
audit_log_rotate_on_size
|
0
|
|
audit_log_rotations
|
0
|
|
audit_log_strategy
|
ASYNCHRONOUS
|
+--------------------------+--------------+
8
rows
in
set
(0.00
sec)
|
有很多参数,具体可参见https://dev.mysql.com/doc/refman/5.5/en/audit-log-plugin-options-variables.html 对MySQL性能最重要的参数是:
值 | 含义 |
ASYNCHRONOUS | 异步日志,等待输出缓冲区空间 |
PERFORMANCE | 异步日志,如果在输出缓冲区空间不足则降低请求 |
SEMISYBCHRONOUS | 同步日志,使用操作系统缓存 |
SYNCHRONOUS | 同步日志,每个请求过后都会调用sync()方法 |
在我看来,最有用的选项是ASYNCHRONOUS,在输出缓冲区不够大的情况下给我们提供性能和不丢失事务之间的平衡。
在MySQL社区版(MySQL Community server)中使用开源审计插件
你也可以在MySQL社区版中使用Percona开源版审计插件(5.5.37和5.6.17版本)。仅需要下载Percona Server的Linux tarball并将audit_log.so拷贝到你的MySQL插件目录中。
查找插件:
1
2
3
4
5
6
7
|
mysql
>
show
global
variables
like
'%plugin%';
+---------------+------------------------------+
|
Variable_name
|
Value
|
+---------------+------------------------------+
|
plugin_dir
|
/usr
/
local
/mysql
/lib
/plugin/
|
+---------------+------------------------------+
1
row
in
set
(0.00
sec)
|
拷贝文件:
1
|
# cp audit_log.so /usr/local/mysql/lib/plugin/
|
安装插件:
1
2
3
4
5
6
|
Server
version:
5.5.37
MySQL
Community
Server
(GPL)
mysql
>
INSTALL PLUGIN
audit_log
SONAME
'audit_log.so';
Query
OK,
0
rows
affected
(0.00
sec)
Server
version:
5.6.17
MySQL
Community
Server
(GPL)
mysql
>
INSTALL PLUGIN
audit_log
SONAME
'audit_log.so';
Query
OK,
0
rows
affected
(0.00
sec)
|
使用MySQL审计插件
插件启用后,它会使用XML格式将日志录入audit.log文件中,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
"NAME"
=
"Audit"
"RECORD"
=
"1_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T00:04:42 UTC"
"MYSQL_VERSION"
=
"5.5.37-35.0"
"STARTUP_OPTIONS"
=
"--basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/lib/mysql/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock"
"OS_VERSION"
=
"x86_64-Linux"
,
/>
"NAME"
=
"Query"
"RECORD"
=
"2_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T00:04:42 UTC"
"COMMAND_CLASS"
=
"install_plugin"
"CONNECTION_ID"
=
"1"
"STATUS"
=
"0"
"SQLTEXT"
=
"INSTALL PLUGIN audit_log SONAME 'audit_log.so'"
"USER"
=
"root[root] @ localhost []"
"HOST"
=
"localhost"
"OS_USER"
=
""
"IP"
=
""
/>
"NAME"
=
"Query"
"RECORD"
=
"3_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T00:05:07 UTC"
"COMMAND_CLASS"
=
"show_variables"
"CONNECTION_ID"
=
"1"
"STATUS"
=
"0"
"SQLTEXT"
=
"show global variables like '%audit%'"
"USER"
=
"root[root] @ localhost []"
"HOST"
=
"localhost"
"OS_USER"
=
""
"IP"
=
""
/>
|
……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
"NAME"
=
"Query"
"RECORD"
=
"10_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T12:33:20 UTC"
"COMMAND_CLASS"
=
"grant"
"CONNECTION_ID"
=
"2"
"STATUS"
=
"0"
"SQLTEXT"
=
"grant all on sbtest.* to sb@localhost identified by 'sb'"
"USER"
=
"root[root] @ localhost []"
"HOST"
=
"localhost"
"OS_USER"
=
""
"IP"
=
""
/>
"NAME"
=
"Connect"
"RECORD"
=
"11_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T12:34:53 UTC"
"CONNECTION_ID"
=
"3"
"STATUS"
=
"0"
"USER"
=
"sb"
"PRIV_USER"
=
"sb"
"OS_LOGIN"
=
""
"PROXY_USER"
=
""
"HOST"
=
"localhost"
"IP"
=
""
"DB"
=
"sbtest"
/>
"NAME"
=
"Query"
"RECORD"
=
"1292_2014-04-30T00:04:42"
"TIMESTAMP"
=
"2014-04-30T12:45:07 UTC"
"COMMAND_CLASS"
=
"select"
"CONNECTION_ID"
=
"32"
"STATUS"
=
"1146"
"SQLTEXT"
=
"SELECT pad FROM sbtest8 WHERE id=5036031"
"USER"
=
"sb[sb] @ localhost []"
"HOST"
=
"localhost"
"OS_USER"
=
""
"IP"
=
""
/>
|
重要提示:
注:明文密码问题只适用于MySQL 5.5版本。在MySQL 5.6中,语句中的密码在写入通用日志的时候都会被服务器重写,不会直接保存原始密码。
在MySQL 5.6中我们可以看到:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
"NAME"
=
"Query"
"RECORD"
=
"14_2014-05-05T21:56:20"
"TIMESTAMP"
=
"2014-05-07T13:51:04 UTC"
"COMMAND_CLASS"
=
"grant"
"CONNECTION_ID"
=
"2"
"STATUS"
=
"0"
"SQLTEXT"
=
"GRANT ALL PRIVILEGES ON `test`.* TO 'test'@'localhost' IDENTIFIED BY PASSWORD '*1E752E353CAA631945738535152AE894E47F5A48'"
"USER"
=
"root[root] @ localhost []"
"HOST"
=
"localhost"
"OS_USER"
=
""
"IP"
=
""
/>
|
1
2
|
ls
-
lah
/
var
/
lib
/
mysql
/
audit
.log
-
rw
-
rw
--
--
1
mysql
mysql
7.1G
May
4
07
:
30
/
var
/
lib
/
mysql
/
audit
.log
|
搜索审计日志记录
MySQL 提供工具mysqlauditgrep进行搜索/查询日志文件。不幸的是,我不能让它在Percona Server生成的日志中正常工作(尝试的版本是1.3 和1.4)。根据这条Bug,它不能转换”新”的审计格式。在我看来,使用默认格式mysqlauditgrep会返回转换错误,而设置“audit_log_format=NEW”不会返回结果。mysqlauditgrep是一个强大的很好用的工具,但是现在我们的搜索被限定在传统Linux Grep(不是一个简单的XML文档)或者定制的转换/搜索XML。
审计日志插件和通用日志的性能开销
最后,我想测量审计日志插件和通用日志的开销。我用sysbench做一个 OLTP测试基准通过4中方式来测试性能开销:
以下是测试结果:
测试方式 | 性能开销 |
Plugin + audit_log_policy = ALL | ~15% |
Plugin + audit_log_policy = LOGINS | ~0% sysbench只连接一次,所哟可能比这个要高事实上。 |
General_log | ~62% |
在这里我们可以看到,审计日志需要占用性能开销,然而,记录所有查询时这样的开销远比开启通用日志要小很多。这些都是快速的基准测试结果。如果需要更精确的测量,当然你可以做一个更好的测试。
令人心动的特性
审计插件可以只记录一些指定的行为。比如,只记录指定用户或只记录对指定表的访问日志,等等。可以给出更多的控制和消耗更少的开销(=更好的性能)。
总结
MySQL 审计插件是一个很好的特性,它是对MySQL性能和安全审计的非常有用的工具。它的性能开销可能影响到一些高负载系统,但是,这样做应该是合理的并且它比使用通用日志记录所有查询要好得多。