CERT NetSA Security Suite遇见 Spark:网络流量分析新操作

网络流量分析,广泛运用于流量监控、网络安全检测、用户行为分析、计费管理或其他网络活动中。说起网络流量分析工具,很多人会想到Tcpdump和Wireshark。Tcpdump是很好用的抓包工具,Wireshark用户界面也十分友好,但是面对大规模网络环境,它们都显得很无力。

那么,大规模网络环境下,网络流量分析问题怎么破?

我们可以借助CERT NetSA开发的工具和Spark来轻松实现较大规模网络分析。

CERT NetSA工具简介

CERT NetSA Security Suite是由美国卡内基梅隆大学的网络应急响应组(CERT)开发的一套网络流量分析工具套件,用于分析大规模网络流量。我们主要讨论的是套件中的YAF和super_mediator。

SiLK工具套件支持网络流数据的高效收集、存储和分析,使网络安全分析人员能够快速查询大型历史流量集。SiLK非常适用于分析大型分布式企业的网络流量,以及中型ISP的骨干网络或边界流量。SiLK工具分为两种类型:包装系统和分析套件。包装系统中的rwflowpack,用来收集IPFIX、NetFlow v9或NetFlow v5等的流量,并将数据转换为一种节约存储空间的格式,然后记录到特定的SiLK文件中。分析套件可以读取SiLK格式文件,并执行各种查询、统计和过滤操作。

YAF工具可以处理tcpdump产出的pcap格式文件,将其打包成yaf格式文件,也可以实时捕获一个网卡的流量,将其转化为双向流,然后输出给IPFIX收集程序或基于IPFIX格式的文件。YAF的输出可以直接用SiLK的分析套件来进行分析。YAF还有深度包解析的插件,支持主流的应用层协议。

super_mediator是一个中间件,用于将YAF的输出转换为csv和json格式文件,或者存储到mysql中。

CERT NetSA工具安装与配置

以下介绍ubuntu环境下,以服务的方式安装配置相关工具,搭建一个流量采集节点。

安装依赖的库

NetSA的工具依赖glib2-dev和libpcap,直接apt-get安装:

sudo apt-get -y install libglib2.0-dev

sudo apt-get -y install libpcap-dev

libfixbuf是我们依赖的,按照以下流程安装:

wget http://tools.netsa.cert.org/releases/libfixbuf-1.7.1.tar.gz

tar -zxvf libfixbuf-1.7.1.tar.gz

cd libfixbuf-1.7.1

./configure && make

sudo make install

安装并配置YAF

YAF不需要修改过多繁杂的配置文件,直接从官方下载最新版的YAF码源,按照如下流程编译安装,注意编译配置时要添加applabel 和plugins配置项:

wget https://tools.netsa.cert.org/releases/yaf-2.8.4.tar.gz

tar -xvzf yaf-2.8.0.tar.gz

cd yaf-2.8.0

./configure –enable-applabel –enable-plugins

make

make install

然后新建日志文件路径,并将YAF安装目录下可执行文件以及配置文件拷贝至系统目录下,并修改可执行文件权限:

mkdir /var/log/yaf

cp etc/init.d/yaf /etc/init.d/

cp etc/yaf.conf /usr/local/etc/

chmod +x /etc/init.d/yaf

修改YAF配置文件如下:

#/usr/local/etc/yaf.conf

ENABLED=1

YAF_CAP_TYPE=pcap

YAF_CAP_IF=eth0

YAF_IPFIX_PROTO=tcp

YAF_IPFIX_HOST=localhost

YAF_IPFIX_PORT=18000

YAF_STATEDIR=/var/log/yaf

YAF_EXTRAFLAGS=”—silk –applabel –max-payload=2048 –plugin-name=/usr/local/lib/yaf/dpacketplugin.la”

然后我们就可以以服务的方式启动YAF了。

安装并配置super_mediator

同样从官网下载后编译安装:

wget https://tools.netsa.cert.org/releases/super_mediator-1.5.2.tar.gz

cd super_mediator-1.5.2

./configure && make

make install

修改super_mediator的默认配置文件:

#/usr/local/etc/super_mediator.conf

COLLECTOR TCP

PORT 18000

COLLECTOR END

rwflowpack

EXPORTER TCP “silk”

PORT 18001

HOST localhost

FLOW_ONLY

EXPORTER END

EXPORTER TEXT “flow”

PATH “/data/flow/flow.json”

JSON

EXPORTER END

DEDUP_CONFIG “flow”

PREFIX “useragent” [111]

PREFIX “server” DIP [110, 171]

PREFIX “host” [117]

PREFIX “dns” [179]

MAX_HIT_COUNT 10000

FLUSH_TIMEOUT 600

DEDUP_CONFIG END

LOGLEVEL DEBUG

LOG “/var/log/super_mediator.log”

PIDFILE “/data/super_mediator.pid”

以后台运行方式启动super_mediator,启动后super_mediator会监听18000端口:

super_mediator -c /usr/local/etc/super_mediator.conf –daemonize

测试各工具是否能正常工作

使用ifconfig查看本地网卡信息,确定要抓取的网卡。

启动YAF,实时抓取网卡em1流量,并通过18001端口传输到rwflowpack,让SiLK输出处理后的流量文件。每60秒传输一次,并加上DPI解析插件,启动命令如下:

sudo yaf –in em1 –live pcap \

–ipfix tcp –out localhost\

–log /var/log/yaf/yaf.log \

–verbose –silk –verbose –ipfix-port=18001 \

–applabel –max-payload 2048 \

–applabel-rules=/usr/local/etc/yafApplabelRules.conf \

–plugin-name=/usr/local/lib/yaf/dpacketplugin.so –rotate=60

接下来将YAF抓到的流量包通过18000端口传输给super_mediator,然后super_mediator会将流量包数据转换为本地JSON文件,启动命令如下:

sudo yaf –in em1 –live pcap \

–ipfix tcp –out localhost\

–log /var/log/yaf/yaf.log \

–verbose –silk –verbose –ipfix-port=18000 \

–applabel –max-payload 2048 \

–applabel-rules=/usr/local/etc/yafApplabelRules.conf \

–plugin-name=/usr/local/lib/yaf/dpacketplugin.so –rotate=60

Super_mediator输出的json示例如下图:

CERT NetSA工具配合Spark

上文已经提到,super_mediate可以将YAF的输出转换为本地的json文件。我们可以使用flume对super_mediator输出的json文件进行监控,并将文件变化实时传输到HDFS上,整体流程如下图。

首先下载flume到本地,然后在flume文件路径的下conf目录下添加一个配置文件,这里将这个文件命名为flume_flow.conf,具体内容如下:

#example.conf: A single-node Flume configuration

# Name the components on this agent

a1.sources = r1

a1.sinks = hdfs-sink

a1.channels = c3

# Describe/configure the source

a1.sources.r1.type = exec

a1.sources.r1.command = tail -F /data/flow/flow.json

a1.sources.r1.shell = /bin/bash -c

a1.sources.r1.restart = true

a1.sources.r1.restartThrottle=1000

# Use a channel which buffers events in memory

a1.channels.c3.type = file

a1.channels.c3.checkpointDir = ~/.flume/checkpoint/c3

a1.channels.c3.dataDirs = ~/.flume/data/c3

a1.sinks.hdfs-sink.type = hdfs

a1.sinks.hdfs-sink.channel = c3

a1.sinks.hdfs-sink.hdfs.path = hdfs://192.168.*.*:9000/flume/%y-%m-%d/

a1.sinks.hdfs-sink.hdfs.useLocalTimeStamp = true

a1.sinks.hdfs-sink.hdfs.filePrefix = flow

a1.sinks.hdfs-sink.hdfs.round = true

a1.sinks.hdfs-sink.hdfs.roundValue = 10

a1.sinks.hdfs-sink.hdfs.roundUnit = minute

a1.sinks.hdfs-sink.hdfs.writeFormat = Text

a1.sinks.hdfs-sink.hdfs.rollSize = 0

a1.sinks.hdfs-sink.hdfs.rollInterval = 60

a1.sinks.hdfs-sink.hdfs.rollCount = 0

a1.sinks.hdfs-sink.hdfs.batchSize = 10

a1.sinks.hdfs-sink.hdfs.fileSuffix = .json

a1.sinks.hdfs-sink.hdfs.fileType = DataStream

需要注意的是flume向hdfs发送数据依赖Hadoop相应的jar包。可以下载一个完成的Hadoop安装文件,然后按Hadoop的安装流程配置好环境变量。

在YAF和super_mediator成功运行的情况下,使用刚写好的flume配置文件运行flume,命令如下:

cd apache-flume-1.7.0-bin/bin/

./flume-ng agent -n a1 -c conf -f ../conf/flume-flow.conf -Dflume.root.logger=DEBUG,console

成功运行后会打印出HDFS文件写入日志。

通过Hadoop的web管理界面查看数据,可以看到flume实时传过来的数据。

数据到了HDFS,我们就可以用Spark分析flume发过来的json数据,还可以用zeppelin展现。

对于近期发生的xshell的DNS后门事件,我们可以借助DPI解析出来的DNS记录来定位内网中受影响的主机,示例如下:

总结

YAF配合super_mediator可以方便的将流量数据实时的转化为Spark可读的json数据。在规模环境下,只需将配置好YAF和super_mediator的流量采集节点机器部署到网络主要出口的交换机旁路上,然后接入交换机流量镜像,在通过flume将数据传给Spark,即可通过Spark对网络流量数据进行分析,做到较大规模网络环境下近乎实时的网络流量分析。

参考文献

[1]https://tools.netsa.cert.org/index.html

[2]http://tools.netsa.cert.org/yaf/libyaf/yaf_silk.html#install

[3]https://tools.netsa.cert.org/super_mediator/super_mediator.html

[4]http://flume.apache.org/documentation.html

发表评论