CERT NetSA Security Suite遇见 Spark:网络流量分析新操作
网络流量分析,广泛运用于流量监控、网络安全检测、用户行为分析、计费管理或其他网络活动中。说起网络流量分析工具,很多人会想到Tcpdump和Wireshark。Tcpdump是很好用的抓包工具,Wireshark用户界面也十分友好,但是面对大规模网络环境,它们都显得很无力。 那么,大规模网络环境下,网络流量分析问题怎么破? 我们可以借助CERT NetSA开发的工具和Spark来轻松实现较大规模网络分析。
CERT NetSA工具简介
CERT NetSA Security Suite是由美国卡内基梅隆大学的网络应急响应组(CERT)开发的一套网络流量分析工具套件,用于分析大规模网络流量。我们主要讨论的是套件中的YAF和super_mediator。CERT NetSA工具安装与配置
以下介绍ubuntu环境下,以服务的方式安装配置相关工具,搭建一个流量采集节点。安装依赖的库
NetSA的工具依赖glib2-dev和libpcap,直接apt-get安装:sudo apt-get -y install libglib2.0-dev sudo apt-get -y install libpcap-devlibfixbuf是我们依赖的,按照以下流程安装:
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查看本地网卡信息,确定要抓取的网卡。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=60Super_mediator输出的json示例如下图:
CERT NetSA工具配合Spark
上文已经提到,super_mediate可以将YAF的输出转换为本地的json文件。我们可以使用flume对super_mediator输出的json文件进行监控,并将文件变化实时传输到HDFS上,整体流程如下图。#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文件写入日志。
总结
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查看原文:http://blog.nsfocus.net/cert-netsa-security-suite/