将机器学习应用于 DDoS 过滤

机器算法验证 分类 神经网络 无监督学习
2022-03-08 05:49:46

斯坦福大学的机器学习课程中, Andrew Ng 提到在 IT 中应用机器学习。一段时间后,当我在我们的网站上遇到中等规模(大约 20k 机器人)的 DDoS 时,我决定使用简单的神经网络分类器来对抗它。

我在大约 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 方法是“在线”(或所谓的“流式”)时会更好,这样它就可以在运行中进行训练。

那么问题来了:
如果您面临同样的防御 DDoS 攻击的问题,只考虑当前的网络服务器日志(由良好的客户端和机器人组成)和历史数据(前一天/周/月的日志主要是好客户)?
您会选择哪种机器学习方法。
你会使用哪些算法?

2个回答

异常检测算法怎么样?当您提到 Andrew Ng 的课程时,您可能已经在 ml-class.org 上看到了“XV. ANOMALY DETECTION”部分,但无论如何。

在与您类似的场景中,异常检测将优于监督分类,因为:

  • 通常你有很少的异常(即,太少的“正面”例子)
  • 通常你有非常不同类型的异常
  • 未来的异常可能看起来与您迄今为止所遇到的完全不同

异常检测的重点是选择哪些特征。这里有两个常见的建议是选择具有

  • 高斯分布(或将它们扭曲成那样)

  • 概率p(anomaly)与p(normal)无法比较- 比如说,异常值非常大,而正常值非常小(反之亦然)。

我不确定地理位置是否对您的方案有帮助,但客户端行为肯定很重要——尽管它可能因应用程序而异。您可能会发现 GET/POST 的比率很重要。或响应大小与请求计数的比率。或单页点击数。如果您在日志中有此类信息 - 绝对可以使用这些数据进行回顾性分析,然后是 IP 黑名单 :)

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

  • 本文可能对您有所帮助 - 它依赖于监督学习技术(在多类分类的背景下)来检测对抗性广告。由于对抗性策略不断发展,作者不得不依靠人类专家来注释罕见的“异常”。他们使用基于 SVM 的排名技术。
  • 正如其他人所指出的,您可以尝试基于非监督学习的异常/异常值检测,但这需要大量调整才能正确平衡误报和误报。
  • 拥有一组好的特征是非常重要的——方法的选择是次要的(即,简单的技术,如朴素贝叶斯或逻辑回归通常足以给定好的特征集)