目的
为了便于开发人员和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_ALL |
(~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-<VERSION>.tar.gz |
2)拷贝插件到源码
cp -rf mysql-audit/ Percona-Server-<VERSION>/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’; |
安装完成后,会在指定审计文件夹下,生成<FILENAME>.<DATE>文件或<DATE>/<FILENAME>.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%’中动态显示当前参数状态。