Aplicación de machine learning para el filtrado DDoS

12

En el curso de aprendizaje automático de Stanford, Andrew Ng mencionó la aplicación de ML en TI. Algún tiempo después, cuando obtuve DDoS de tamaño moderado (alrededor de 20k bots) en nuestro sitio, decidí luchar contra él usando un simple clasificador de red neuronal.

Escribí este script de Python en aproximadamente 30 minutos:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos

Utiliza pyBrain y toma 3 registros nginx como entrada, dos de ellos para entrenar la red neuronal:

  1. Con buenas consultas
  2. Con los malos

Y un registro para clasificación

De malas consultas ..

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/" "-"

...y bueno...

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"

... construye un diccionario:

['__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 con la que entrenamos nuestra red / entrada que necesitamos clasificar ...

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)"

... se convierte en vector de características:

[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]

Después de todo esto, hay una ruta estándar para dividir el conjunto de datos en conjuntos de entrenamiento y prueba, entrenar redes neuronales y seleccionar el mejor. Después de este proceso (que puede llevar bastante tiempo dependiendo del tamaño del conjunto de datos), finalmente podemos clasificar los registros utilizando una red capacitada.

Pero aquí hay varios problemas con ese enfoque:

  1. El aprendizaje automático supervisado es un poco incorrecto para ese tipo de problema, porque para detectar bots primero necesito detectar bots y entrenar a Neural Network con esos datos.
  2. No tomo el comportamiento del cliente en una cuenta. Es mejor considerar el gráfico de las transiciones de página a página para cada usuario.
  3. No tomo la localidad de los clientes en una cuenta. Si una computadora en la red está infectada con algún virus, entonces hay más posibilidades de que otras computadoras en esa red estén infectadas.
  4. No tomo datos de geolocalización en una cuenta. Por supuesto, si está ejecutando un sitio en Rusia, hay pocas posibilidades de que los clientes de Brasil.
  5. No sé si era la forma correcta de usar la red neuronal y la clasificación para resolver ese problema. Tal vez estaba mejor con algún sistema de detección de anomalías.
  6. Es mejor cuando el método ML está "en línea" (o el llamado "streaming") para que pueda entrenarse sobre la marcha.

Así que aquí están las preguntas:
¿Qué haría si se enfrentara con el mismo problema de defenderse de un ataque DDoS dado solo los registros actuales del servidor web (que consiste en buenos clientes y bots) y datos históricos (registros del día / semana / mes anterior con la mayoría de los buenos clientes)?
¿Qué enfoque de aprendizaje automático elegirías?
¿Qué algoritmos usarías?

SaveTheRbtz
fuente

Respuestas:

11

¿Qué hay de los algoritmos de detección de anomalías? Al mencionar la clase de Andrew Ng, probablemente haya visto la sección "XV. DETECCIÓN DE ANOMALÍAS" en ml-class.org , pero de todos modos.

La detección de anomalías será superior a una clasificación supervisada en escenarios similares al suyo porque:

  • normalmente tiene muy pocas anomalías (es decir, muy pocos ejemplos "positivos")
  • normalmente tiene tipos muy diferentes de anomalías
  • futuras anomalías pueden no parecerse a las que ha tenido hasta ahora

El punto importante en la detección de anomalías es qué características elegir. Dos consejos comunes aquí son elegir características con

  • Distribución gaussiana (o distorsionarlos para que sean así)

  • probabilidad p (anomalía) sea ​​incomparable con p (normal) , por ejemplo, los valores anómalos son muy grandes mientras que los normales son muy pequeños (o viceversa).

No estoy seguro de si la geolocalización ayudaría a su escenario, pero el comportamiento del cliente definitivamente importaría, aunque probablemente diferiría de una aplicación a otra. Puede encontrar que una proporción de GET / POST es importante. O una relación del tamaño de respuesta al recuento de solicitudes. O número de visitas a una sola página. Si tiene dicha información en los registros, definitivamente puede usar los datos para el análisis retrospectivo, seguido de la lista negra de IP :)

andreister
fuente
+1 para detección de anomalías. También agregaría "número de intentos de inicio de sesión de los últimos 5 minutos" y "número de intentos de inicio de sesión de ip X de los últimos 5 minutos".
neurona
El principal problema con la detección de anomalías (como se dio en la clase ML) es que no se puede usar para una gran cantidad de características con relaciones complejas entre ellas: es demasiado costoso computacionalmente. En mi ejemplo, tengo 23 funciones de 2 (!!) consultas incluso sin gráfico de llamada, geolocalización y nginxvariables adicionales en el registro. Y no puedo usar PCA porque los atacantes pueden cambiar el comportamiento de los bots.
SaveTheRbtz
@SaveTheRbtz re "computacionalmente costoso" - IIRC, la detección de anomalías tal como se presenta en la clase ml era solo una estimación de densidad, por lo que simplemente multiplicaría las probabilidades de sus características como en p (x1) * .. * p (xN) que, I cree, es O (n), entonces, ¿está buscando O (logn) o algo así? Pero de todos modos, es una pregunta justa y me hizo pensar en la selección automática de funciones, así que hice una pregunta en machinelearning.stackexchange.com/questions/184
registré
Para ser más precisos, estoy hablando de hasta 100,000 características por 1Mb de archivo de registro. PD. ¡Buena pregunta!
SaveTheRbtz
1

Este es un problema difícil, aquí hay algunas observaciones:

  • Este documento puede ser de alguna ayuda para usted: se basa en las técnicas de aprendizaje supervisado (en el contexto de la clasificación de varias clases) para detectar anuncios adversos. Dado que las estrategias de confrontación evolucionan, los autores deben confiar en expertos humanos que anotan "anomalías" raras. Utilizan técnicas de clasificación basadas en SVM, entre otras.
  • Como lo han señalado otros, podría probar la detección de anomalías / valores atípicos basados ​​en el aprendizaje no supervisado, pero eso requeriría una gran cantidad de ajustes para obtener el equilibrio correcto de falsos positivos y falsos negativos.
  • Tener un buen conjunto de características es muy importante: la elección de la metodología es secundaria (es decir, una técnica simple como Naive Bayes o regresión logística a menudo es suficiente dado un buen conjunto de características)
Yevgeny
fuente