Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1356049
  • 博文数量: 107
  • 博客积分: 1715
  • 博客等级: 上尉
  • 技术积分: 3168
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-18 18:42
个人简介

阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736

文章分类

全部博文(107)

文章存档

2014年(2)

2013年(38)

2012年(67)

分类: Mysql/postgreSQL

2012-07-23 15:52:31


目的

为了便于开发人员和DBA安装和使用MySQL审计插件,并对审计的使用和审计粒度有更全面的理解。本文对审计插件的设计思想、审计粒度、审计配置说明、安装使用、其他内容进行详细的描述。一方面便于后续的维护和开发,另一方面对于使用提供便利的查询。

设计思想

         MySQL的审计接口为开发审计插件提供了有利的条件,基于MySQL审计接口,参考General log设计思想,将审计插件的审计类型定义了:FILETABLE两种类型,用于将审计的内容分别写入日志文件或数据库表。此外,对审计的粒度进行划分,不仅根据操作命令的类型进行划分,并对Query命令类型进行进一步的细化分,将DDLDMLDCL三种类型不同SQL语句类型进行划分;对特定的用户进行审计,仅对指定的用户审计,结合审计的粒度实现对用户行为的审计;对特定的对象(数据库、数据表)进行审计,目前仅给出配置,源码中暂时没有实现。

         此外,审计的粒度采用按位标示,并通过按位覆盖可以进行自定义的审计粒度。

审计粒度

         审计插件将审计的粒度细化到具体的SQL语句,主要包括:createdropalterddl(包括createdropalter)、insertdeleteupdatemodify(包括insertdeleteupdatereplace)、selectdml(包括insertdeleteupdateselect)、grantrevokedcl(包括grantrevoke)、setcmd(包括ddldmldclset)、connectquitconnection(包括connectquit)、server(包括修改server相关的命令操作,如init dbsleep等操作)、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

审计文件大小格式为整数,或者整数加上单位,单位包括KMG。为了便于查看,不建议将该值设置的过大;

审计类型包括FILETABLE两种。目前仅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

2MySQL源码

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.soaudit.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 Serverplugin_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、操作审计

操作相关的审计日志信息的格式如下所示。操作相关的命令包括CREATEDROPALTERINSERTUPDATEDELETEGRANTREVOKE等对数据或数据库有影响的操作。以下以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%’中动态显示当前参数状态。

 

阅读(3227) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~