Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260272
  • 博文数量: 56
  • 博客积分: 1190
  • 博客等级: 少尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-21 17:05
文章分类

全部博文(56)

文章存档

2014年(2)

2013年(4)

2012年(46)

2011年(4)

我的朋友

分类: LINUX

2012-03-30 12:09:35


September 25th, 2011

背景:

1. 库升级时,监测最近有哪些活跃用户访问此库

2. 某些场合下需要记录用户的对库表的修改

3. 需要对用户的特殊行为事后监控,出问题可查

4. 对需求3的实行监测控制,杜绝非规则之内SQL行为

 

解决方案:

1. init_connect属性

目前线上运行的主流版本  MySQL-5.1.48在安全审计方面支持性较差,而在MySQL-5.5版本中得到很好改善。在老版本中有个init_connect属性,在用户连 接时执行init_connect的内容。为支持用户行为监控,在init_connect内赋值MySQL内部API获取的值,典型的是 IP/USER,自动地写入到临时表中。优点就是方便,即配即用,缺点是很难监测到用户干了些什么。

 

这个属性粒度太粗,线上应用于白名单监测。

 

2. binlog扩展

在MySQL-5.1.48中扩展binlog是init_connect的升级版,即在binlog中记录用户的行为。大家可能会想,为何不把 slow_query设置到毫秒级,让slow_query记录详细信息。抛弃这种想法的理由是,slow_query会记录大量的信息,耗IO和 DISK,完全没有必要。扩展binlog的思想很简单,就是修改binlog的存储协议格式,在头部加入IP/USER,额外空间是 4+6(IP+USER),对性能没有影响。不幸的是,目前binlog的协议头早已被用完,扩展性大大打折扣。修改后意味着生成的binlog不能被别 的按原生态MySQL binlog协议解析的MySQL或工具所读取,修改后的MySQL不能读取之前生成的MySQL binlog。

 

binlog扩展应SQA环境下的部分业务。

 

3. audit_plugin

在MySQL-5.5版本中,插件得到很好的支持,灵活的动态加载、卸载审计插件。API中可以得到THD指针,权利变得可以无限想象。如何做到对用户配置的规则灵活的支持,才是可用性的关键。

 

1)  用户规则静态配置

典型的用户对库表的操作DDL,或是无条件的DELETE。

另外,基于安全方面需求的各种意想不到的的规则加入,例如SQL注入的预防。

 

为此基于my.cnf中加入audit栏支持用户初始化的配置,在MySQL启动时读取。

 

2)  用户规则的动态可配

用户的规则设置必须支持动态可配,可以有两种方法:

* 通过扩展变量来设置,例如set rule=”add|del $rule”。

这样做的坏处就是必须重在MySQL层hook部分代码新解析对应的handler

* 通过修改my.cnf中audit栏,每次动态的读取,更新内存中历史规则。

每次判断文件修改时间,与上次读取时保存的时间不一样则读取。

 

3)  审计handler

审计插件被触发时产生的事件(mysql_event_general)中记录了与SQL相关的非常丰富的信息,事件被传递到audit插件的notify函数参数中:

static void audit_null_notify(MYSQL_THD thd,  unsigned int event_class, const void *event)

我们可以对event类型进行强制转换为mysql_event_genereal:

if (event_class == MYSQL_AUDIT_GENERAL_CLASS) { pEvent = (const struct mysql_event_general *) event;

在头文件plugin_audit.h中,定义了该事件类型的结构体:

struct mysql_event_general { unsigned int event_subclass; int general_error_code; unsigned long general_thread_id; const char *general_user; unsigned int general_user_length; const char *general_command; unsigned int general_command_length; const char *general_query; unsigned int general_query_length; struct charset_info_st *general_charset; unsigned long long general_time; unsigned long long general_rows; };

从结构体中,我们可以看出事件中记录了包括用户名,线程id,执行的sql等信息,另外结合THD,还可以得到用户的主机名以及操作的数据库名,这些信息足以满足我们审计的需求。

对规则应用时重点是如何对众多的规则进行判断,即要考虑性能。目前的优化留给用户处理,即在配置文件中将粒度粗的,出现概率大的写在前。

扩展后的audit插件目前主要应用于安全需求方面。

 

通过安全审计,做到事前监测触发,防患于未然。



%E5%9C%A8%E6%B7%98%E5%AE%9D%E7%9A%84%E5%BA%94%E7%94%A8.html

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