OSSIM中的分布式消息队列应用程序
1。消息队列处理
企业日志数量呈指数级增长,日志数据海量、多样、异构。传统的基于单节点混合安装的OSSIM平台(OSSIM4.4及以下)无法满足海量日志分析的要求。OSSIM4.4之后,系统中加入了中间件RabbitMQ,可以对系统中的组件进行解耦,避免系统中正在运行的模块的影响(例如MySQL的写 *** 作等。).该设计能够满足分布式日志分析平台的要求。
在OSSIM中使用RabbitMQ后,认证模块可以通过消息队列耦合,即OSSIM中的各种复杂应用可以通过消息队列连接。就像电脑主板上的总线。OSSIM中的消息代理服务器是用Erlang语言编写的,它提供了一种开源的消息队列方案。不用学Erlang语言,自己搭建消息队列服务器。OSSIM完全负责这些过程。
举下面这个例子。在网络故障之前或期间,各种设备和服务器会向日志服务器发送大量日志。在最初的设计中,这样的日志会直接写入数据库或/var/log中的一个文件。在故障状态下高并发的情况下,会对数据库服务器造成很大的压力。这是因为日志查询 *** 作过程中相应的延迟会加重,很容易超过系统的最大负载。
图1-42显示了早期日志收集的方案。在图中,PHP脚本从数据库读取数据的典型过程包括:打开数据库连接,运行任意SQL和语句,读取SQL语句找到的结果,关闭数据库连接,最后在HTML页面上向用户显示内容。
上面的例子,每一步都有瓶颈,数据库可能没有调整到最佳运行状态,SQL语句使用的数据表可能没有优化,还有很多地方需要管理员注意。如果没有缓存,用户每次请求PHP脚本都会遇到问题,导致每次性能下降。如果使用缓存来存储SQL语句的结果,这种性能损失将不复存在。
如何解决这个问题?在OSSIM中,采用异步 *** 作,其核心思想是消息队列(在OSSIM系统中,消息是通信双方需要传输的日志消息)。通过消息队列,将短时间内生成的高并发的日志消息存储在消息队列中,从而平滑高峰期的并发事务。这样可以有效抵御日志的涌入和对单机数据库系统的冲击,从而提高数据库系统的性能。
OSSIM中的SIEM事件存储用来说明这个问题。设备将日志发送到传感器,标准化后发送到OSSIM服务器。关联引擎继续处理它,并同时将几个任务收集事件写入数据库。所以数据库写的很多,并发 *** 作在同时查询的时候会严重占用有限的I/O通道。
因为关联引擎的业务逻辑处理比较复杂,而MySQL数据库的写 *** 作往往比较大,所以在OSSIM4.0之前,当系统没有使用消息队列时,系统在重负载下的响应往往比较慢。
但OSSIM4.4采用消息队列的思想,对系统进行重构后,加入了消息队列服务器,结构如图1-43所示。
消息队列服务器中有一个单独处理消息队列的进程。首先,它判断消息队列中是否有要处理的消息,如果有,就取出来进行相应的处理。消息队列处理流程如图1-44所示。这样高并发的用户请求通过消息队列异步 *** 作,然后在消息队列中逐个出队同步,也避免了并发控制的问题。
消息队列只是解决并发问题的方法之一。在OSSIM中,往往需要结合各种技术方法共同解决,如负载均衡、反向代理等方案。这里虽然以异常日志为例,“麻雀虽小,五脏俱全”,但是写日志文件的高并发 *** 作同样适用于数据库的高并发,所以研究这个案例有一定的指导意义。
2RabbitMQ
RabbitMQ是一种实现AMQP(高级消息队列协议)的消息中间件。它是消息中间件的开发标准,独立于平台。现在在OSSIM分布式系统中用来存储和转发消息,其工作原理如图1-45所示。
为什么要用RabbitMQ?在高并发的情况下,RabbitMQ在处理发送和接收请求时响应速度非常快,性能调优后系统的响应速度也会得到提升。RabbitMQ使用Erlang写的AMQP服务器,AMQP基于客户端/代理模式。
在大数据日志分析的应用中,我们经常把OSSIM做成集群模式,因为它可以使用RabbitMQ的集群功能。此外,RabbitMQ中的集群有两种节点,内存节点和磁盘区。对于每个Rabbitmq节点,根据日志类型建立相应的队列,根据日志类型的名称建立exchange的键值,后面会讲到。RabbitMQ通信端口为5672。
在OSSIM中,我们通过下面的命令检查它。
RabbitMQ环境变量的配置文件位于/etc/rabbitMQ/rabbitMQ-env.conf中,使用时需要查询rabbitmqstatus命令。方法如下:
此时,可以显示rabbitmq的端口、节点名和主目录(/var/lib/rabbitmq)。
千万不要用kill命令直接停止RabbitMQ服务器。相反,您应该使用rabbitmqctl命令(它可以同步地将数据保存到磁盘,然后关闭服务):
3选择要存储的键/值
在OSSIM的早期版本中,仍然使用Mysql+memcache架构来存储数据。由于性能和一致性问题,在OSSIM4.4后续版本中引入Redis作为队列处理服务器,有些读者会问为什么选择键/值存储?从SIEM收集业务的角度来看,日志和安全事件都属于非结构化数据。在日志相关性分析过程中,非结构化数据的量会大大超过结构化数据,这些数据之间存在相关性。如果这些数据直接存储在数据库中,访问数据库的频率会增加。随着单个表的行数急剧增加,访问该表的行数也会成比例增加,多个表之间的数据调用会产生大量的计算,这将使任何数据分析系统不堪重负。
在对Ossim系统的各种集成开源工具的分析中发现,该系统并不具有持久性。如果RabbitMQ服务器重启,消息会丢失,所以采用Redis服务器来解决这些问题。Redis是一个键/值NoSQL数据库,作为缓存服务器,数据存储在内存中,所以比MySQL快很多。尤其是在OSSIM的WebUI中,很多排名应用,TOP10的抓取 *** 作,包括各种仪表盘、计算器应用,SIEM控制台的Uniq *** 作,获取某段时间内所有数据的列表,抓取最新的TOPN *** 作,包括分布式日志收集系统中消息队列的处理,都需要Redis服务。
关于OSSIM的更多信息,请参考开源安全运营平台-OSSIM最佳实践[/s2/]这本书。
注:以上内容为样章,最终效果以书中文字为准。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)