Metron 简介

HCP框架

Hortonworks CyberSecurity Package (HCP) is a cybersecurity platform. 其主要包含了三个组件:
  • Real-time Processing Security Engine
  • Telemerty Data Collectors
  • Data Services and Integration Layer

HCP 框架图如下:
image

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。
其代码结构如下图所示:
image

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)格式。其处理的主要流程如下:image

上述的流程主要是关于原始日志的处理,从中可以看到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查看内容如下:
image
从解析的内容看,是标准的pcap格式,其他文件也可以解析。

posted @ 2018-04-04 14:19  angelxp  阅读(860)  评论(0编辑  收藏  举报