在斯坦福大学的机器学习课程中, Andrew Ng提到了将ML应用于IT。一段时间后,当我在站点上获得中等大小的DDoS(大约2万个bot)时,我决定使用简单的神经网络分类器与之抗衡。
我已经在大约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方法是“在线”(或所谓的“流”)时,效果更好,因此可以随时进行训练。
因此,这里有个问题:
如果仅在当前Web服务器日志(由良好的客户端和机器人组成)和历史数据(前一天/周/月的日志)下遇到相同的防御DDoS攻击的问题,该怎么办?大部分都是好的客户)?
您将选择哪种机器学习方法。
您将使用哪种算法?