专栏首页FreeBuf基于大数据和机器学习的Web异常参数检测系统Demo实现

基于大数据和机器学习的Web异常参数检测系统Demo实现

前 言

如何在网络安全领域利用数据科学解决安全问题一直是一个火热的话题,讨论算法和实现的文章也不少。前段时间看到楚安的文章《数据科学在Web威胁感知中的应用》,其中提到如何用隐马尔可夫模型(HMM)建立web参数模型,检测注入类的web攻击。获益匪浅,遂尝试用python实现该算法,并尝试在大数据环境下的部署应用。

算法一般过程

隐马尔可夫模型是一个统计模型,可以利用这个模型解决三类基本问题:

学习问题:给定观察序列,学习出模型参数 评估问题:已知模型参数,评估出观察序列出现在这个模型下的概率 解码问题:已知模型参数和给出的观察序列,求出可能性最大的隐藏状态序列

这里我们是要解决前两类问题,使用白样本数据学习出模型和参数基线,计算检测数据在该模型下出现的可能性,如果得分低于基线就可以认为这个参数异常,产出告警。算法可分为训练过程和检测过程,算法本身我这里不在细说,这里重点讲一下参数的抽取和泛化。

参数的抽取

对http请求数据进行拆解,提取如下参数,这部分的难点在于如何正确的识别编码方式并解码:

GET、POST、Cookie请求参数 GET、POST、Cookie参数名本身 请求的URL路径 http请求头,如Content_type、Content-Length(对应strust2-045)

参数泛化

需要将参数值泛化为规律性的观测经验,并取字符的unicode数值作为观察序列,泛化的方法如下:

大小写英文字母泛化为”A”,对应的unicode数值为65 数字泛化为”N”,对应的unicode数值为78 中文或中文字符泛化为“C”,对应的unicode数值为67 特殊字符和其他字符集的编码不作泛化,直接取unicode数值 参数值为空的取0

系统架构

在训练过程中要使用尽可能多的历史数据进行训练,这显然是一个批(batch)计算过程;在检测过程中我们希望能够实时的检测数据,及时的发现攻击,这是一个流(streaming)计算过程。典型的批+流式框架如Cisco的Opensoc使用开源大数据架构,kafka作为消息总线,Storm进行实时计算,Hadoop存储数据和批量计算。但是这样的架构有一个缺点,我们需要维护Storm和MapReduce两套不同的代码。考虑到学习成本,使用Spark作为统一的数据处理引擎,即可以实现批处理,也可以使用spark streaming实现近实时的计算。

系统架构如上图,需要在spark上运行三个任务,sparkstreaming将kafka中的数据实时的存入hdfs;训练算法定期加载批量数据进行模型训练,并将模型参数保存到Hdfs;检测算法加载模型,检测实时数据,并将告警保存到ES。

Spark简介

Apache Spark是一个快速通用的大数据计算框架,由Scala语言实现,同时提供Java、python、R语言的API接口。相比于Hadoop的Mapreduce,Spark可以实现在内存中计算,具有更高的计算速度,并且spark streaming提供流数据计算框架,以类似批处理的方式处理流数据。

RDD

RDD是Spark中抽象的数据结构类型,是一个弹性分布式数据集,数据在Spark中被表示为RDD。RDD提供丰富的API接口,实现对数据的操作,如map、flatmap、reduce、filter、groupby等等。

DStream

DStream(离散数据流)是Spark Streaming中的数据结构类型,它是由特定时间间隔内的数据RDD构成,可以实现与RDD的互操作,Dstream也提供与RDD类似的API接口。

DataFrame

DataFrame是spark中结构化的数据集,类似于数据库的表,可以理解为内存中的分布式表,提供了丰富的类SQL操作接口。

数据采集与存储

获取http请求数据通常有两种方式,第一种从web应用中采集日志,使用logstash从日志文件中提取日志并泛化,写入Kafka(可参见兜哥文章);第二种可以从网络流量中抓包提取http信息。我这里使用第二种,用python结合Tcpflow采集http数据,在数据量不大的情况下可稳定运行。

数据采集

与Tcpdump以包单位保存数据不同,Tcpflow是以流为单位保存数据内容,分析http数据使用tcpflow会更便捷。Tcpflow在linux下可以监控网卡流量,将tcp流保存到文件中,因此可以用python的pyinotify模块监控流文件,当流文件写入结束后提取http数据,写入Kafka,Python实现的过程如下图。

核心代码:

数据存储

开启一个SparkStreaming任务,从kafka消费数据写入Hdfs,Dstream的python API没有好的入库接口,需要将Dstream的RDD转成DataFrame进行保存,保存为json文件。

核心代码:

算法实现

抽取器(Extractor)

抽取器实现原始数据的参数提取和数据泛化,传入一条json格式的http请求数据,可以返回所有参数的id、参数类型、参数名、参数的观察状态序列。

代码示例:

训练器(Trainer)

训练器完成对参数的训练,传入参数的所有观察序列,返回训练好的模型和profile,HMM模型使用python下的hmmlearn模块,profile取观察序列的最小得分。

核心代码:

训练任务

Spark训练任务抽取所有http请求数据的参数,并按照参数ID分组,分别进行训练,将训练模型保存到Hdfs。

核心代码:

检测任务

Spark Streaming检测任务实时获取kafka流数据,抽取出数据的参数,如果参数有训练模型,就计算参数得分,小于基线输出告警到Elasticsearch。

核心代码:

总 结

所有的机器学习算法都大致可分为训练、检测阶段,基于HMM的web参数异常检测是其中的典型代表,本文尝试将机器学习算法在大数据环境下使用,所有用到的代码都会在Github上公开(其实数据抽取部分并不完美,欢迎提出好的建议)。

代码地址:https://github.com/SparkSharly/Sharly

本文分享自微信公众号 - FreeBuf(freebuf),作者:foxscheduler

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何建立有效的安全运维体系

    随着互联网行业的蓬勃发展,国内的黑客产业链早已达数十亿级别。除了各类网络攻击之外,一些黑客入侵情况也并不鲜见。这种事件相对于网络攻击有着更大的破坏力,系统被入侵...

    FB客服
  • Facebook丑闻反思 | 大数据环境下的隐形黑手

    互联网圈内圈外的人,几乎都在说着大数据。而对于普通用户来说,大数据是什么?大数据有什么用?大数据在很多方面都能够发挥巨大价值,但这次Facebook风波则让更多...

    FB客服
  • 以UPX漏洞为例介绍整数溢出(基础篇)

    *本文原创作者:tocttou,本文属FreeBuf原创奖励计划,未经许可禁止转载

    FB客服
  • HTML5新特性

    HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。

    帅的一麻皮
  • 实用工具特别推荐 Robocopy GUI

    Windows下快速复制文件工具Robocopy介绍, Robocopy 支持更多重要的文件复制任务,从而能够真正简化您的工作。我想您将发现最大的好处是,可以创...

    张善友
  • 你应该知道的折叠屏手机适配

    从目前推出的这几款折叠手机可以看出:折叠手机从折叠到展开,屏幕的变化类似于 iphone 到 ipad。

    WecTeam
  • 2019年全国31省份高考分数线已全部公布,看看你家乡分数线

    凯哥Java
  • Red Team 工具集之信息收集

    上图是一个 Red Team 攻击的生命周期,整个生命周期包括:信息收集、攻击尝试获得权限、持久性控制、权限提升、网络信息收集、横向移动、数据分析(在这个基础上...

    信安之路
  • TensorFlow 入门(2):使用DNN分类器对数据进行分类

    本文作者通过分析《高级API入门教程》这篇文章中的实例:教我们如何使用DNN(深度神经网络)分类器实现对鸢尾花的分类,并对其提出举一反三的案例,提升学习效果,并...

    谭正中
  • 可以收藏的JMeter分布式踩坑大全

    关于jmeter分布式压测如何搭建网上的文章很多,搭建过程本文不再赘述,主要讨论可能的报错以及解决方案,下面的内容可能查阅的频率很高,强烈建议收藏。

    cctester

扫码关注云+社区

领取腾讯云代金券