将机器学习应用于DDoS过滤


12

斯坦福大学的机器学习课程中, Andrew Ng提到了将ML应用于IT。一段时间后,当我在站点上获得中等大小的DDoS(大约2万个bot)时,我决定使用简单的神经网络分类器与之抗衡。

我已经在大约30分钟的时间内编写了这个python脚本:https :
//github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos

它采用pyBrain,并采取3个nginx的日志作为输入,其中两个来训练神经网络:

  1. 很好的查询
  2. 与坏人

和一个日志进行分类

来自错误的查询

0.0.0.0 - - [20/Dec/2011:20:00:08 +0400] "POST /forum/index.php HTTP/1.1" 503 107 "http://www.mozilla-europe.org/" "-"

...好的...

0.0.0.0 - - [20/Dec/2011:15:00:03 +0400] "GET /forum/rss.php?topic=347425 HTTP/1.0" 200 1685 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0"

...它构造了一个字典:

['__UA___OS_U', '__UA_EMPTY', '__REQ___METHOD_POST', '__REQ___HTTP_VER_HTTP/1.0', 
'__REQ___URL___NETLOC_', '__REQ___URL___PATH_/forum/rss.php', '__REQ___URL___PATH_/forum/index.php',
'__REQ___URL___SCHEME_', '__REQ___HTTP_VER_HTTP/1.1', '__UA___VER_Firefox/3.0',
'__REFER___NETLOC_www.mozilla-europe.org', '__UA___OS_Windows', '__UA___BASE_Mozilla/5.0',
'__CODE_503', '__UA___OS_pl', '__REFER___PATH_/', '__REFER___SCHEME_http', '__NO_REFER__',
'__REQ___METHOD_GET', '__UA___OS_Windows NT 5.1', '__UA___OS_rv:1.9',
'__REQ___URL___QS_topic', '__UA___VER_Gecko/2008052906']

我们使用分类所需的 / 训练网络的每个条目 ...

0.0.0.0 - - [20/Dec/2011:20:00:01 +0400] "GET /forum/viewtopic.php?t=425550 HTTP/1.1" 502 107 "-" "BTWebClient/3000(25824)"

...被转换为特征向量:

[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]

完成所有这些操作之后,便有了将数据集分为训练集和测试集,训练神经网络并选择最佳集合的标准途径。经过此过程(可能需要很长时间,具体取决于数据集的大小),我们最终可以使用经过培训的网络对日志进行分类。

但是,这种方法有很多问题:

  1. 对于这种类型的问题,监督式机器学习有点不对劲,因为要检测到机器人,我首先需要检测到机器人,并用该数据训练神经网络。
  2. 我不考虑客户的行为。最好考虑每个用户的页面到页面过渡图。
  3. 我不考虑客户所在地。如果网络中的一台计算机感染了某种病毒,则该网络中的其他计算机更有可能被感染。
  4. 我不会将地理位置数据存入帐户。当然,如果您在俄罗斯运营网站,那么来自巴西的客户就很少。
  5. 我不知道使用神经网络和分类来解决这种问题是否正确。也许我最好使用一些异常检测系统。
  6. ML方法是“在线”(或所谓的“流”)时,效果更好,因此可以随时进行训练。

因此,这里有个问题:
如果仅在当前Web服务器日志(由良好的客户端和机器人组成)和历史数据(前一天/周/月的日志)下遇到相同的防御DDoS攻击的问题,怎么办?大部分都是好的客户)?
您将选择哪种机器学习方法。
您将使用哪种算法?

Answers:


11

异常检测算法如何?当您提到Andrew Ng的课程时,您可能会在ml-class.org上看到“ XV。异常检测”部分,但是无论如何。

在与您类似的情况下,异常检测将优于监督分类,因为:

  • 通常情况下,异常现象很少(例如,“阳性”实例太少)
  • 通常您有非常不同类型的异常
  • 未来的异常可能看起来与您迄今为止遇到的异常不同

异常检测的重点是选择哪个功能。这里的两个常见建议是选择带有

  • 高斯分布(或扭曲成这样)

  • 概率p(异常)p(正常)无可比拟-也就是说,异常值非常大,而正常值很小(反之亦然)。

我不确定地理位置是否对您的情况有所帮助,但是客户端的行为肯定很重要-尽管不同的应用程序可能有所不同。您可能会发现GET / POST的比例很重要。或响应大小与请求计数的比率。或单页点击数。如果您在日志中有此类信息-可以明确地将数据用于追溯分析,然后再进行IP黑名单:)


+1用于异常检测。我还要添加“最近5分钟尝试登录的次数”和“最近5分钟来自ip X的尝试登录的次数”。
神经元2012年

异常检测的主要问题(如ML-Class所述)是您不能将其用于大量功能之间具有复杂关系的功能-这在计算上过于昂贵。在我的示例中,即使没有调用图,地理位置和nginx日志中的其他变量,我在2(!!)个查询中也有23个功能。而且我不能使用PCA,因为攻击者可以更改机器人的行为。
SaveTheRbtz

@SaveTheRbtz是“计算上昂贵的”-IIRC,ml级中显示的异常检测只是密度估计,因此您只需将特征的概率乘以p(x1)* .. * p(xN)即可,相信,是O(n),所以您要寻找O(logn)还是其他东西?但无论如何,这是一个公平的问题,它让我想到自动特征选择-所以在问一个问题machinelearning.stackexchange.com/questions/184
andreister

准确地说,我正在谈论的是每1Mb日志文件最多100,000个功能。PS。好问题!
SaveTheRbtz 2012年

1

这是一个棘手的问题,这里有一些观察结果:

  • 本文可能对您有所帮助-它依靠监督学习技术(在多类别分类的情况下)来检测对抗性广告。随着对抗策略的发展,作者不得不依靠对稀有“异常”进行注释的人类专家。他们使用基于SVM的排名技术。
  • 正如其他人所指出的那样,您可以尝试基于非监督学习的异常/异常检测,但是这需要大量调整才能正确地平衡假阳性和假阴性。
  • 拥有一套好的功能非常重要-方法的选择是次要的(即,简单的技术(如朴素贝叶斯(Naive Bayes)或逻辑回归)通常足以满足一套好的功能)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.