May 15 2016

audit_log

audit_log 详解
该功能是一个commercial extension.它是被包含在MySQL Enterprise Edition的。所以社区版本可能就无法使用了。

虽然文档上是说它在5.5.28被包含在plugin目录下,不过在前几个版本(比如5.5.25a、5.5.24等)也是存在的。只不过可能开发并未完善(早期的版本中包含的audit plugin加载后,可控参数较少)

如果想尝试它,可以去下载5.5.28的商业版本(5.5.25a也可以),安装5.5.28的过程不表,安装audit功能有两种方法,一是编辑my.cnf的配置文件(举例的环境皆是linux_64),添加如下语句:

[mysqld]
plugin-load=audit_log.so
然后在启动MySQL时,在启动命令中加入选项’–plugin-load’,这种方法的缺点是每次DB启动时都要加上该选项。牵扯到DB start\stop\restart的安装方法都是浮云,所以这种方法不推荐。

二是直接使用install plugin语句register该插件:

mysql> INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;
该语句成功运行后,会在mysql.plugins表中看到该插件的记录:

audit.log文件格式有两种,OLD和NEW,5.6.14之后增加了新的日志格式,通过参数audit_log_format 来控制。更改日志格式需要以下三个步骤:
step1:关闭数据库
step2:重命名当前的audit.log文件
step3:更改audit_log_format参数,并重启mysql,重启后会自动生成一个新的audit.log文件
各标签元素解释
<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>。
Audit日志文件名称
可以通过参数audit_log_file来控制日志文件名称和存放路径,默认路径为mysql的data目录,默认名称为audit.log。
Audit日志审计策略
可以通过参数audit_log_strategy来控制日志审计策略,默认为ASYNCHRONOUS(异步),可选值为SYNCHRONOUS,SEMISYNCHRONOUS和PERFORMANCE。
ASYNCHRONOUS:先将日志写进buffer,buffer写满后才刷进磁盘。
SYNCHRONOUS:同步刷盘,每次事件都调用sync()
SEMISYNCHRONOUS:半同步方式刷盘,使用操作系统的缓存。
PERFORMANCE:buffer写满后会丢掉后面的事件,在高负载的机器上使用该参数会丢掉部分事件。
Audit日志存储空间管理
审计日志提供了3个系统参数来控制日志文件的大小,分别是。
audit_log_buffer_size:缓冲区大小,该缓冲区是一个单缓冲区,初始化时创建,程序结束时移除,该参数仅在audit_log_strategy为ASYNCHRONOUS(异步)模式下有效。
audit_log_rotate_on_size:日志文件增长到多大开始轮换,记写新的日志文件,该参数默认为0。该参数不为0时会,当文件增长到制定大小时便重命名为一个后缀带时间戳的文件,然后创建新的日志文件记录审计日志。
audit_log_flush:该参数仅在audit_log_rotate_on_size为0时有效,例如我们重命名了audit.log日志文件,该参数由OFF变为ON时,会产生一个新的audit.log日志文件。
日志过滤
我们可以过滤的事件包括用户账户以及状态。
对账户的过滤主要通过audit_log_include_accounts和audit_log_exclude_accounts,即记录列表包含用户的审计日志和不记录列表包含用户的审计日志。这两个参数默认都为NULL,且同时只能有一个生效。例如设置仅记录如下用户的审计日志:
SET GLOBAL audit_log_include_accounts = ‘user1@localhost,user2@localhost’;
状态过滤信息主要由3个参数来控制,分别是audit_log_policy,audit_log_connection_policy 及audit_log_statement_policy。

审计文件audit.log默认存放在mysql安装目录的data目录下,且没有加密,应指定一个对数据库和用户有合法权限的安全目录。
对存储过程和触发器不做审计。
对load data infile操作不做审计。



Copyright 2019. All rights reserved.

Posted 2016年5月15日 by ucjmh in category "mysql

Leave a Reply

Your email address will not be published. Required fields are marked *