Metron 模块功能介绍
HCP框架
Hortonworks CyberSecurity Package (HCP) is a cybersecurity platform. 其主要包含了三个组件:
- Real-time Processing Security Engine
- Telemerty Data Collectors
- Data Services and Integration Layer
HCP 框架图如下:
HCP 框架最核心的其实是Metron 的实时安全处理引擎。该引擎主要处理的数据host logs,firwwall logs,emails 以及网络数据。
从框架图中可以看到,当数据从Kafka读取的时候,数据需要转化为json的格式。
Telemetry Data Collectors
Telemetry data collectors 采集相关的数据源到Metron中。对于大容量如网络数据,HCP提供一个高性能网络探针。对于威胁情报信息,HCP支持流和批的处理。在框架图中可以看到其可获取多个数据源(IDS,防火墙的日志等都可以)
Real-time Processing Security Engine
该组件提供了一个缓冲器来捕获原始事件。同时,
实时处理原始事件,用相关的上下文丰富相关的事件,利用威胁情报丰富上下文并应用到相关的模型中。分析完毕以后,将相关的时间写入到ES或者HDFS中。
Data Service and Integration Layer
数据服务整合层根据不同的需求,整合不同的数据提供给不同的层次数据给响应的功能模块使用。
Metron 模块介绍
Metron 主要包含以下几个模块:metron-analytics(分析模块)、metron-contrib(任务管理模块)、metron-deployment(发布模块)、metron-sensors(采集汇总模块)、metron-stellar。
其代码结构如下图所示:
metron-deployment
metron-deployment 模块主要包好编译,打包、部署metron几个功能。
metron-sensors
metron-sensors 模块类似于一个采集器。其实际上应该是有3个模块部分组成:metron-bro-plugin-kafka,fastcapa,pycapa3个部分。其主要支持4中格式的数据(https://cwiki.apache.org/confluence/display/METRON/Sensors):DPDK-PCAP(原始包格式)、bro json(插件定义的格式)、IPIFX(主要是netflow)格式。其处理的主要流程如下:
上述的流程主要是关于原始日志的处理,从中可以看到metron最终处理的日志都是规整的json日志,所以之前会有一个bolt来处理从Kafka传的原始的日志。
metron-bro-plugin-kafka
提供bro和kafka整合联系的一个插件。使得bro 将日志记录到Kafka中,从而使得其他分析部分可以处理利用这部分数据。该插件目前不在metron源码中,单独成了一个项目(https://github.com/apache/metron-bro-plugin-kafka)。该模块是针对bro 专用的一个模块,其传送的格式较为
fastcapa
fastpcap 使用到了DPDK的采集技术,从内核层进行的网络数据采集,并且将数据发送到Kafka,但需要注意的使用它必须要DPDK的相关支持才可以。
其发送到kafa部分的代码如下:
Worker.c
这里没有详细看,worker的逻辑,根据DPDK的理论这里好像不再是因为网卡的中断导致的worker流程,而是其处理以后导致的work队列处理线程,每一个线程实际上还是对应的一个数据包
static int transmit_worker(tx_worker_params *params)
{
unsigned i, nb_in, nb_out;
const unsigned int tx_burst_size = params->tx_burst_size;
struct rte_ring *ring = params->input_ring;
const int kafka_id = params->kafka_id;
LOG_INFO(USER1, "Transmit worker started; core=%u, socket=%u \n", rte_lcore_id(), rte_socket_id());
while (!quit_signal) {
// dequeue packets from the ring
# 这个采用的就是ring 的方式解析,内存指针传递过去地址,减少了拷贝
struct rte_mbuf* pkts[params->tx_ring_size];
nb_in = rte_ring_dequeue_burst(ring, (void*) pkts, tx_burst_size, NULL);
if(likely(nb_in > 0)) {
params->stats.in += nb_in;
待发送的数据
// prepare the packets to be sent to kafka
nb_out = kaf_send(pkts, nb_in, kafka_id);
params->stats.out += nb_out;
// clean-up the packet buffer
for (i = 0; i < nb_in; i++) {
rte_pktmbuf_free(pkts[i]);
}
}
}
LOG_INFO(USER1, "Transmit worker finished; core=%u, socket=%u \n", rte_lcore_id(), rte_socket_id());
return 0;
}
pycapa
pycapa与fastpcap相比要传统的多,本质上就是利用libpcapy 来解决,只是换成了python 的应用层版(如下面代码所示),由于要到用户态所以效率上要低一些。其往Kafka输出pcap的格式数据。
producer.py
86行代码
# initialize packet capture
logging.info("Starting packet capture")
#实时采集
capture = pcapy.open_live(args.interface, args.snaplen, sniff_promisc, sniff_timeout_ms)
pkts_in = 0
但上面的3种和传统的嗅探的项目相比,都集成了到kafka的部分功能。其实现主要代码如下:
producer.py
try:
while not finished.is_set() and (args.max_packets <= 0 or pkts_in < args.max_packets):
# capture a packet
(pkt_hdr, pkt_raw) = capture.next()
if pkt_hdr is not None:
logging.debug("Packet received: pkts_in=%d, pkt_len=%s", pkts_in, pkt_hdr.getlen())
pkts_in += 1
pkt_ts = timestamp(pkt_hdr)
#生产数据
kafka_producer.produce(args.kafka_topic, key=pack_ts(pkt_ts), value=pkt_raw, callback=delivery_callback)
# pretty print, if needed
if args.pretty_print > 0 and pkts_in % args.pretty_print == 0:
print 'Packet received[%s]' % (pkts_in)
# serve the callback queue
kafka_producer.poll(0)
finally:
# flush all messages
logging.info("Waiting for '%d' message(s) to flush", len(kafka_producer))
#发送数据出去
kafka_producer.flush()
该模块比较简单,可以单独使用。根据官方的说明,可以自发自收查看,如下所示:
发送生产采集
[root@localhost pycapa]# pycapa --producer --interface ens32 --kafka-broker 172.31.6.243:6667 --kafka-topic test --max-packet 15
INFO:root:Connecting to Kafka; {'bootstrap.servers': '172.31.6.243:6667', 'group.id': 'JGNBTFGDHOVN'}
INFO:root:Starting packet capture
INFO:root:Waiting for '15' message(s) to flush
INFO:root:'15' packet(s) in, '15' packet(s) out
消费Kafka数据
[root@localhost pycapa]# pycapa --consumer --kafka-broker 172.31.6.243:6667 --kafka-topic test --max-packets 10 >abc001.pcap
[root@localhost pycapa]# ll
total 52
-rw-r--r--. 1 root root 0 Mar 23 08:40 200.pcap
-rw-r--r--. 1 root root 4119 Mar 23 08:46 abc001.pcap
下载消费的文件用wirshark查看内容如下:
从解析的内容看,是标准的pcap格式,其他文件也可以解析。