在斯坦福大学的机器学习课程中, Andrew Ng 提到在 IT 中应用机器学习。一段时间后,当我在我们的网站上遇到中等规模(大约 20k 机器人)的 DDoS 时,我决定使用简单的神经网络分类器来对抗它。
我在大约 30 分钟内编写了这个 python 脚本:
https ://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
它使用pyBrain并以 3 个nginx日志作为输入,其中两个用于训练神经网络:
- 有很好的查询
- 与坏人
和一个分类日志
从不好的查询..
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]
毕竟,有标准的路径将数据集分成训练集和测试集,训练神经网络并选择最好的一个。在这个过程之后(这可能需要很长时间,具体取决于数据集的大小),我们最终可以使用经过训练的网络对日志进行分类。
但这里有一些与这种方法有关的问题:
- 对于这类问题,监督机器学习有点错误,因为要检测机器人,我首先需要检测机器人并用这些数据训练神经网络。
- 我不考虑客户的行为。最好考虑每个用户的页面到页面转换图。
- 我不考虑客户的位置。如果网络中的一台计算机感染了某种病毒,那么该网络中的其他计算机被感染的可能性就更大。
- 我不考虑地理位置数据。当然,如果您在俄罗斯经营网站,那么来自巴西的客户机会就很小。
- 我不知道使用神经网络和分类来解决此类问题是否是正确的方法。可能是我使用一些异常检测系统会更好。
- 当 ML 方法是“在线”(或所谓的“流式”)时会更好,这样它就可以在运行中进行训练。
那么问题来了:
如果您面临同样的防御 DDoS 攻击的问题,只考虑当前的网络服务器日志(由良好的客户端和机器人组成)和历史数据(前一天/周/月的日志主要是好客户)?
您会选择哪种机器学习方法。
你会使用哪些算法?