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:
- Con buenas consultas
- 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:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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?