目的
为了便于开发人员和DBA安装和使用MySQL审计插件,并对审计的使用和审计粒度有更全面的理解。本文对审计插件的设计思想、审计粒度、审计配置说明、安装使用、其他内容进行详细的描述。一方面便于后续的维护和开发,另一方面对于使用提供便利的查询。
设计思想
MySQL的审计接口为开发审计插件提供了有利的条件,基于MySQL审计接口,参考General log设计思想,将审计插件的审计类型定义了:FILE和TABLE两种类型,用于将审计的内容分别写入日志文件或数据库表。此外,对审计的粒度进行划分,不仅根据操作命令的类型进行划分,并对Query命令类型进行进一步的细化分,将DDL、DML、DCL三种类型不同SQL语句类型进行划分;对特定的用户进行审计,仅对指定的用户审计,结合审计的粒度实现对用户行为的审计;对特定的对象(数据库、数据表)进行审计,目前仅给出配置,源码中暂时没有实现。
此外,审计的粒度采用按位标示,并通过按位覆盖可以进行自定义的审计粒度。
审计粒度
审计插件将审计的粒度细化到具体的SQL语句,主要包括:create、drop、alter、ddl(包括create、drop、alter)、insert、delete、update、modify(包括insert、delete、update、replace)、select、dml(包括insert、delete、update、select)、grant、revoke、dcl(包括grant、revoke)、set、cmd(包括ddl、dml、dcl、set)、connect、quit、connection(包括connect、quit)、server(包括修改server相关的命令操作,如init db、sleep等操作)、full(包括以上所有操作)、all(包括所有操作,包括预留的所有的审计粒度的扩展)、none(不进行审计),这些粒度在配置文件中的以audit_为前缀,值为1/0(或on/off)。为了更精确的控制某些命令,提供audit_ops参数,该参数的值是整数,通过整数的二进制位来控制具体的审计粒度。
具体的审计粒度对应整数的二进制位如下所示:
粒度
位值
(~AUDIT_NONE)
AUDIT_NONE
(ulonglong)0
AUDIT_CREATE
(ulonglong)1
AUDIT_ALTER
(AUDIT_CREATE <<
1)
AUDIT_DROP
(AUDIT_CREATE <<
2)
AUDIT_DDL
(AUDIT_CREATE | AUDIT_ALTER
| AUDIT_DROP)
AUDIT_INSERT
(AUDIT_CREATE <<
3)
AUDIT_UPDATE
(AUDIT_CREATE <<
4)
AUDIT_REPLACE
(AUDIT_CREATE <<
5)
AUDIT_DELETE
(AUDIT_CREATE <<
6)
AUDIT_MODIFY
(AUDIT_INSERT | AUDIT_UPDATE
| AUDIT_DELETE | AUDIT_REPLACE)
AUDIT_SELECT
(AUDIT_CREATE <<
7)
AUDIT_DML
(AUDIT_MODIFY | AUDIT_SELECT)
AUDIT_GRANT
(AUDIT_CREATE <<
8)
AUDIT_REVOKE
(AUDIT_CREATE <<
9)
AUDIT_DCL
(AUDIT_GRANT | AUDIT_REVOKE)
AUDIT_SET
(AUDIT_CREATE <<
10)
AUDIT_CMD
(AUDIT_DDL | AUDIT_DML
| AUDIT_DCL | AUDIT_SET)
AUDIT_CONNECT
(AUDIT_CREATE <<
11)
AUDIT_QUIT
(AUDIT_CREATE <<
12)
AUDIT_CHANGE_USER
(AUDIT_CREATE <<
13)
AUDIT_CONNECTION
(AUDIT_CONNECT |
AUDIT_QUIT | AUDIT_CHANGE_USER)
AUDIT_FULL
(AUDIT_CMD | AUDIT_CONNECTION)
AUDIT_SLEEP
(AUDIT_CREATE <<
16)
AUDIT_INIT_DB
(AUDIT_CREATE <<
17)
AUDIT_FIELD_LIST
(AUDIT_CREATE <<
18)
AUDIT_REFRESH
(AUDIT_CREATE <<
19)
AUDIT_SHUTDOWN
(AUDIT_CREATE <<
20)
AUDIT_STATISTICS
(AUDIT_CREATE <<
21)
AUDIT_PROCESSLIST
(AUDIT_CREATE <<
22)
AUDIT_KILL
(AUDIT_CREATE <<
23)
AUDIT_DEBUG
(AUDIT_CREATE <<
24)
AUDIT_PING
(AUDIT_CREATE <<
25)
AUDIT_TIME
(AUDIT_CREATE <<
26)
AUDIT_DELAY_INSERT
(AUDIT_CREATE <<
27)
AUDIT_BINLOG_DUMP
(AUDIT_CREATE <<
28)
AUDIT_TABLE_DUMP
(AUDIT_CREATE <<
29)
AUDIT_CONNECT_OUT
(AUDIT_CREATE <<
30)
AUDIT_REGISTER_SLAVE
(AUDIT_CREATE <<
31)
AUDIT_PREPARE
(AUDIT_CREATE <<
32)
AUDIT_EXECUTE
(AUDIT_CREATE <<
33)
AUDIT_LONG_DATA
(AUDIT_CREATE <<
34)
AUDIT_CLOSE_STMT
(AUDIT_CREATE <<
35)
AUDIT_RESET_STMT
(AUDIT_CREATE <<
36)
AUDIT_SET_OPTION
(AUDIT_CREATE <<
37)
AUDIT_FETCH
(AUDIT_CREATE <<
38)
AUDIT_DAEMON
(AUDIT_CREATE <<
39)
AUDIT_ERROR
(AUDIT_CREATE <<
40)
AUDIT_SERVER
(~AUDIT_FULL)
以上定义中,预留了很多位,用于粒度的深化。audit_ops的指定有一定的风险,需要进行计算,不建议直接控制。
审计配置说明
为了审计插件的独立性,对审计进行单独配置文件的控制,从而不影响数据库server的配置。此外,审计的配置与审计粒度、审计用户、审计文件地址、审计文件名、审计文件大小、审计类型有关。
审计用户格式为“,”分割的用户名列表;审计文件地址在linux下必须为mysql用户名和用户组,且mysql至少有W访问权限,如果指定审计文件大小,则需要有X权限;
审计文件名默认为mysql-audit,并且根据是否设置审计文件大小来创建文件。如果设置审计文件的大小,那么审计文件以日期为文件夹,以文件编号为后缀,且文件达到指定文件大小后,重新创建文件且文件编号递增。如:2012-6-20/mysql-audit.000000,如果未设置文件大小,则文件名以当前日期为后缀,如:mysql-audit. 2012-6-20;
审计文件大小格式为整数,或者整数加上单位,单位包括K、M、G。为了便于查看,不建议将该值设置的过大;
审计类型包括FILE、TABLE两种。目前仅FILE有效。
此外,配置文件支持动态修改并生效的功能。审计配置文件修改后,将会重新加载配置选项。但鉴于性能问题,不建议频繁对配置文件进行修改。
安装使用
1源码安装
针对不同的MySQL源码和不同操作系统,建议使用源码进行编译安装。该插件基于Linux 64位操作系统、MySQL 5.5.15/5.5.20源码进行编译和测试通过,并提供二进制动态库供二进制安装,具体二进制安装见下一节内容。
1.1源码获取
1)审计插件源码
审计插件源码可以通过github获取最新版本。
github地址为:https://github.com/HengWang/mysql-audit。
github clone https://github.com/HengWang/mysql-audit
2)MySQL源码
MySQL源码可以从官网下载,本文推荐使用Percona Server 5.5版本。推荐理由是Percona Server针对MySQL源码基础之上,进行了改进,尤其是性能方面和参数选项方面。
1.2拷贝插件源码
1)解压数据库源码
tar -xzf Percona-Server-.tar.gz
2)拷贝插件到源码
cp -rf mysql-audit/
Percona-Server-/plugin/
将插件源码拷贝到mysql数据库源码的plugin文件夹下。
1.3、编译数据库源码
根据编译参数,对数据库源码进行编译,并安装。
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
make
make install
安装完成后,在MYSQL_HOME(安装路径,文中设置为/usr/local/mysql)的lib/plugin/下面,会有audit.so和audit.cnf文件。
1.4设置审计参数
根据审计需求,修改审计配置文件audit.cnf,对审计的选项参数、审计粒度进行设置。配置文件中对各个审计参数的功能进行了描述,可根据具体的需求设置。
1.5创建审计路径
根据配置文件中设置的audit_dir的路径,创建审计文件夹。审计文件夹必须是mysql可操作的文件夹,如果指定了审计文件大小,指定的审计文件夹对mysql必须有xw权限。
1.6创建审计数据表
启动MySQL数据库,使用mysql客户端登陆数据库,执行sql脚本audit.sql,创建mysql.audit表,用于存储审计内容。
1.7安装审计插件
启动MySQL数据库,使用mysql客户端登陆数据库后,执行安装插件命令。如下所示:
install plugin audit soname ‘audit.so’;
安装完成后,会在指定审计文件夹下,生成.文件或/.000000。如果文件不存在,表示安装失败。
2二进制安装
二进制动态库目前仅提供基于Linux
64位操作系统、MySQL 5.5.15/5.5.20源码进行编译的审计插件动态库。
在mysql-audit/script文件夹下,有对应的二进制库;mysql-audit/etc文件夹下,有配置文件。配置文件audit.cnf拷贝到MYSQL_HOME/lib/plugin/下,二进制库拷贝到MySQL Server的plugin_dir指定的地址。
接下来的操作与源码安装一致,从步骤1.4开始进行下面操作即可。
3自动化安装部署
自动化安装部署,主要针对二进制文件的安装,通过执行脚本即可实现整个安装部署过程。因此,使用自动化脚本的前提是提供的二进制文件符合应用需求。具体如下:
执行脚本的前提是已经获取mysql-audit。在此情况下,执行自动化脚本,可以安装部署成功。
具体脚本操作,可以通过执行:audit_build.sh
-h查看输入参数。举例如下:
./audit_build.sh --mysqldir=/usr/local/mysql
--auditdir=/home/mysql/audit --user=root --password=”” --host=localhost
--port=3306 --socket=/tmp/mysql.sock --version=5.5.20 --type=release
4插件卸载
为了保证数据库的性能,可以卸载审计插件。使用mysql登陆数据库服务器,执行以下命令:
uninstall plugin audit;
文件输出格式
文件格式分为两种,分别为连接审计和操作审计。
1、连接审计
连接相关的审计日志信息的格式如下所示。
具体的:
[2012-06-20 15:40:39]:审计的时间。
[CONNECT]:为连接的类型;
status:为连接成功(0)或者失败(错误号)的状态;
user:为连接的用户名;
external-user:为外部连接的用户,在使用中间件或者代理服务的时候有效;
proxy-user:为代理服务的用户名;
host:表示连接的主机名;
ip:连接的ip地址;
database:表示连接的数据库名。
[2012-06-20 15:40:39] [CONNECT] status: # ;
thread_id: # ; user: XXX ; external-user: XXX ; proxy-user: XXX ; host: XXX ;
ip: ###.###.###.### ; database: XXX
2、操作审计
操作相关的审计日志信息的格式如下所示。操作相关的命令包括CREATE、DROP、ALTER、INSERT、UPDATE、DELETE、GRANT、REVOKE等对数据或数据库有影响的操作。以下以CREATE为例,进行详细说明。
具体的:
[2012-06-20 15:40:39]:审计的时间。
[CREATE]为操作的类型;
error_code:为操作的错误码,操作成功为0;
thread_id:执行操作的线程id;
user:执行操作的用户名;
command:操作命令的类型,是数据库内部的定义,数据相关操作一般为Query;
query:操作的查询语句。
charset:操作的字符集类型;
time:执行操作的时间点,该值为从1970年以来的长整数。
rows:执行操作影响数据的行数。
[2012-06-20 15:40:39] [CREATE] error_code: # ;
thread_id: # ; user: XXX ; command: XXX ; query: XXX ; charset: XXX ; time: ###
; rows: #
数据表定义
CREATE TABLE mysql.audit (
`audit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`command`
varchar(20) NOT NULL DEFAULT 'NULL',
`status`
int(11) NOT NULL DEFAULT '0',
`thread_id` bigint(32) unsigned NOT NULL DEFAULT '0',
`user`
varchar(20) NOT NULL DEFAULT 'NULL',
`external_user`
varchar(20) NOT NULL DEFAULT 'NULL',
`proxy_user` varchar(20) NOT NULL DEFAULT 'NULL',
`host`
varchar(20) NOT NULL DEFAULT 'NULL',
`ip`
varchar(20) NOT NULL DEFAULT 'NULL',
`query`
varchar(255) NOT NULL DEFAULT 'NULL',
`charset`
varchar(20) NOT NULL DEFAULT 'NULL',
`event_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`rows`
bigint(32) NOT NULL DEFAULT '0'
) ENGINE=CSV DEFAULT CHARSET=utf8 ;
常见错误
1、无法识别的audit.so。
解决:查看plugin_dir路径,在该路径下查看audit.so是否存在。
2、没有审计内容。
解决:首先确认指定的审计文件夹的权限是否符合,审计文件夹必须是mysql用户可以操作的目录,如果指定了审计文件大小,指定的审计文件夹必须有xw权限。
进一步工作
1、添加审计数据对象(数据库、数据表)功能。
2、完善查看审计参数状态,show
status like ‘audit%’中动态显示当前参数状态。