Aplicando o aprendizado de máquina à filtragem DDoS

12

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:

  1. Com boas consultas
  2. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. É 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?

SaveTheRbtz
fonte

Respostas:

11

E os algoritmos de detecção de anomalias? Como você mencionou a classe de Andrew Ng, provavelmente viu a seção "XV. DETECÇÃO DE ANOMALIA" no ml-class.org , mas de qualquer maneira.

A detecção de anomalias será superior a uma classificação supervisionada em cenários semelhantes aos seus, porque:

  • normalmente você tem muito poucas anomalias (por exemplo, poucos exemplos "positivos")
  • normalmente você tem tipos muito diferentes de anomalias
  • anomalias futuras podem se parecer com as que você já teve até agora

É um ponto importante na detecção de anomalias, quais recursos escolher. Dois conselhos comuns aqui são escolher recursos com

  • Distribuição gaussiana (ou distorça-a para ser assim)

  • probabilidade p (anomalia) ser incomparável a p (normal) - digamos, valores anômalos sendo muito grandes, enquanto valores normais são muito pequenos (ou vice-versa).

Não tenho certeza se a geolocalização ajudaria no seu cenário, mas o comportamento do cliente definitivamente importaria - embora provavelmente seja diferente de aplicativo para aplicativo. Você pode achar que uma proporção de GETs / POSTs é importante. Ou uma proporção do tamanho da resposta para a contagem de solicitações. Ou número de ocorrências de página única. Se você tiver essas informações nos logs - definitivamente você pode usar os dados para análise retrospectiva, seguido pela lista negra de IP :)

andreister
fonte
+1 para detecção de anomalias. Eu também adicionaria "número de tentativas de logins nos últimos 5 minutos" e "número de tentativas de logon do ip X nos últimos 5 minutos".
neurónio
O principal problema com a detecção de anomalias (como foi dada na classe ML) é que você não pode usá-lo para uma enorme quantidade de recursos com relações complexas entre eles - é muito caro computacionalmente. No meu exemplo, eu tenho 23 recursos em 2 (!!) consultas, mesmo sem gráfico de chamadas, localização geográfica e nginxvariáveis adicionais no log. E não posso usar o PCA porque os atacantes podem alterar o comportamento dos bots.
SaveTheRbtz
@SaveTheRbtz re "computacionalmente caro" - IIRC, a detecção de anomalias, como apresentada na classe ml, era apenas uma estimativa de densidade; portanto, basta multiplicar as probabilidades de seus recursos como em p (x1) * .. * p (xN) que, I acredite, O (n) é assim que você está procurando O (logn) ou algo assim? Mas de qualquer maneira, é uma pergunta justa e isso me fez pensar sobre a seleção recurso automático - assim fez uma pergunta em machinelearning.stackexchange.com/questions/184
andreister
Só para ser mais preciso - estou falando de até 100.000 recursos por 1Mb de arquivo de log. PS. Boa pergunta!
SaveTheRbtz
1

Este é um problema difícil, aqui estão algumas observações:

  • Este papel pode ser de alguma ajuda para você - ele se baseia nas técnicas de aprendizado supervisionado (no contexto da classificação de várias classes) para detectar anúncios adversos. Como as estratégias contraditórias evoluem, os autores precisam contar com especialistas humanos que anotam "anomalias" raras. Eles usam técnicas de classificação baseadas em SVM, entre outras.
  • Conforme observado por outras pessoas, você pode tentar detectar anomalias / outlier com base no aprendizado não supervisionado, mas isso exigiria muito ajuste para obter o equilíbrio entre falsos positivos e falsos negativos.
  • Ter um bom conjunto de recursos é muito importante - a escolha da metodologia é secundária (ou seja, uma técnica simples como Naive Bayes ou regressão logística é muitas vezes suficiente, dado um bom conjunto de recursos)
Yevgeny
fonte