No curso de aprendizado de máquina de Stanford, Andrew Ng mencionou a aplicação de ML em TI. Algum tempo depois, quando obtive DDoS de tamanho moderado (cerca de 20k bots) em nosso site, decidi lutar contra ele usando um classificador simples da Rede Neural.
Eu escrevi esse script python em cerca de 30 minutos:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Ele usa pyBrain e usa 3 logs nginx como entrada, dois deles para treinar a Rede Neural:
- Com boas consultas
- Com os maus
E um log para classificação
De consultas ruins ..
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/" "-"
...e bom...
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"
... constrói um dicionário:
['__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']
Cada entrada com a qual treinamos nossa rede / entrada que precisamos classificar ...
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)"
... é convertido em vetor de recurso:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Depois de tudo isso, existe um caminho padrão para dividir o conjunto de dados em conjuntos de treinamento e teste, treinando redes neurais e selecionando o melhor. Após esse processo (que pode demorar bastante, dependendo do tamanho do conjunto de dados), podemos finalmente classificar os logs usando uma rede treinada.
Mas aqui estão alguns problemas com essa abordagem:
- O aprendizado de máquina supervisionado é meio errado para esse tipo de problema, porque para detectar bots , primeiro preciso detectá-los e treinar a Rede Neural com esses dados.
- Não levo o comportamento do cliente para uma conta. É melhor considerar o gráfico das transições de página para página para cada usuário.
- Não levo a localidade dos clientes para uma conta. Se um computador na rede estiver infectado com algum vírus, há mais chances de que outros computadores nessa rede estejam infectados.
- Não levo dados de geolocalização para uma conta. Obviamente, se você estiver executando um site na Rússia, há pouca chance de clientes do Brasil.
- Não sei se foi a maneira correta de usar a rede neural e a classificação para resolver esse problema. Pode ser que eu estivesse melhor com algum sistema de detecção de anomalias.
- É melhor quando o método ML é "online" (ou o chamado "streaming") para que possa ser treinado em tempo real.
Então, aqui estão as perguntas:
O que você faria se tivesse o mesmo problema de se defender de um ataque DDoS, considerando apenas os logs atuais do servidor da web (que consiste em bons clientes e bots) e dados históricos (logs do dia / semana / mês anterior principalmente com bons clientes)?
Qual abordagem de Machine Learning você escolheria.
Quais algoritmos você usaria?