作为我本科项目的一部分,我已经完成了我的 IDS 的第一个版本。它被实现为 MySQL 的插件。
我将在下面列出我理解 MySQL 内部结构的主要来源。然后我简要描述了我在 IDS 中使用的方法。
MySQL 文档文本
- 我发现Charles Bell的Expert MySQL和Sasha Pachev的Understanding MySQL Internals (正如 user3822447 所写)是理解 MySQL 内部的很好的切入点。
- Andrew Hutchings 和 Sergei Golubchik的MySQL 5.1 Plugin Development也非常有用。
- MySQL Internals Manual还包含一些很好的基本信息。
- 在阅读完所有内容后,我做了一些调试(使用 VS)并发现了查询树结构的样子。
我的 IDS 解决方案
我的解决方案的源代码可以在sourceforge找到。我打算在它的 wiki 中记录更多内容。
主要入口点audit_ids_notify()
是audit_ids.cc
. 该插件采用内部 MySQL 解析器生成的查询树,使其简化版本(以节省内存)。然后它进行异常检测——它有一个已知查询树结构的列表,并保留有关每个查询树结构的每个参数化部分的一些统计信息。输出被写入 MySQL 数据目录中的特殊日志文件。
我试图使解决方案模块化和可扩展。初始版本是一种演示,性能没有优化,特别是在 SQL 存储模块中。
MySQL 插件类型
我确定了两种可能的方法并使用了第一种。
- 审计插件
- 我的解决方案插件中的包装器类型是audit plugin。
- 尽管用于报告服务器操作(例如记录查询或错误),但我还是使用了这种类型的插件。
- 我之所以选择这种类型的插件,是因为我发现这是唯一一个本机支持的插件,当查询树在完成(即解析)之后和从内存中释放之前(对于 MySQL 5.6.17)被调用。
- 缺点:在 MySQL 的未来版本中不能完全保证上述内容,但在我看来,这在不久的将来应该不会改变。
- 优点:MySQL不需要重新编译。构建和安装插件就足够了。
- 查询重写插件
- 还有一种替代方法是使用非本地插件类型query-rewrite来做到这一点。它提供了用于修改查询的插件 API,因此也用于读取它。
- 缺点:要支持这个插件 API,MySQL 服务器必须使用 API 重新编译。我认为可能会成为 MySQL 生产发行版的一部分。
- 优点:设计用于读取/重写内部查询树的插件类型。
如果有一些与此主题相关的问题/问题,我可以随时回答;)