阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736
分类: Mysql/postgreSQL
2012-07-30 15:38:57
目的
基于之前设计开发的mysql审计插件,以及《MySQL审计插件安装使用说明文档》的内容介绍,对完善后的mysql审计插件进行补充和说明。主要对新增内容进行详细说明,进一步完善审计插件的功能。
新增内容
针对之前版本中存在的不足,功能不够完善的问题,对MySQL审计插件进行进一步的开发和完善。新增内容主要有:
1、增加审计数据库、数据表功能。
之前版本中没有实现该功能,在当前版本中,将审计选项中audit_dbs、audit_tables的处理实现。可以审计某些数据库,或者某些数据表,有利于针对不同应用系统的特殊应用。从而配合审计粒度,对审计内容进行进一步的细化和定制。
2、增加忽略审计的用户、数据库、数据表功能。
鉴于审计应用的特殊性,添加忽略的审计用户、数据库、数据表功能。可以实现忽略某个或某些用户的操作记录;忽略某个或某些数据库的操作记录;忽略某个表的操作记录。这样可以使得当审计的内容较多,而审计中需要剔除某些不必要的审计内容的情况下,这些参数可以有效简化审计的选项配置。
增加的配置文件的选项:
选项 |
功能 |
ignore_users |
忽略的用户 |
ignore_dbs |
忽略的数据库 |
ignore_tables |
忽略的数据表 |
选项的设置格式在配置文件中给出了具体的说明,类似audit_users、audit_dbs、audit_tables选项。
在添加忽略的审计用户、数据库、数据表与审计对象发生冲突时,将按照忽略优先的原则进行。例如:audit_dbs = important、audit_tables = test.test、ignore_dbs = test,ignore_tables = important.test,那么审计的内容会首先忽略important.test表的所有操作,而审计test.test数据表的所有操作,然后忽略test数据库的所有操作,审计important数据看的操作。
3、增加审计操作的数据库信息。
由于操作的sql语句中几乎不会直接写操作的数据库,而仅靠sql语句不能有效的辨识操作的数据库。在存在不同数据库中有相同数据表的情况下,数据库审计不能有效的跟踪审计内容。增加数据库信息,可以有效的提高sql审核的内容。
文件输出格式
文件格式分为两种,分别为连接审计和操作审计。
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;
databases:SQL语句涉及到的所有数据库。
query:操作的SQL语句。
charset:操作的字符集类型;
time:执行操作的时间点,该值为从1970年以来的长整数。
rows:执行操作影响数据的行数。
[2012-06-20 15:40:39] [CREATE] error_code:X # thread_id:X # user:X # command:X # databases:X # query:X # charset:X # time:X # rows:X |
数据表定义
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', `databases` varchar(255) 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、完善查看审计参数状态,show status like ‘audit%’中动态显示当前参数状态。