Agradecimientos A mis padres y a mi pareja. Simplemente gracias. 1 Índice Agradecimientos .............................................................................................. 1 Índice ................................................................................................................. 2 Índice de figuras ............................................................................................... 4 Índice de tablas ................................................................................................ 6 1. Introducción.................................................................................................. 7 2. Estado del arte.............................................................................................. 9 2.1. IDS ...................................................................................................... 9 2.1.1. Tipos de IDS ................................................................................. 9 2.1.2. Modo de detección ..................................................................... 10 2.1.3. Origen de los datos .................................................................... 12 2.1.4. Comportamiento ......................................................................... 14 2.1.5. IDS basados en red más usados. .............................................. 14 2.2. Deep learning aplicado en los IDS .................................................... 15 2.2.1. Historia de la inteligencia artificial .............................................. 15 2.2.2. Deep Learning ............................................................................ 17 2.2.3. Redes neuronales ...................................................................... 17 2.3. Redes Neuronales aplicadas a un IDS ............................................. 23 2.4. Datasets en la actualidad .................................................................. 24 3. Motivación y objetivos ............................................................................... 26 4. Metodología ................................................................................................ 27 4.1. Metodología de trabajo ..................................................................... 27 4.1.1. Desarrollo en cascada ................................................................ 27 4.1.2. Desarrollo iterativo ..................................................................... 27 5. Desarrollo del proyecto ............................................................................. 29 5.1. Entorno de trabajo y tecnologías a utilizar ........................................ 29 2 5.1.1. Software ..................................................................................... 29 5.1.2. Hardware .................................................................................... 32 5.2. Dataset.............................................................................................. 32 5.3. Pre-procesamiento del Dataset......................................................... 33 5.4. División del dataset y Métricas a utilizar ........................................... 38 5.5. Arquitectura de la red ........................................................................ 40 5.6. Resultados obtenidos ....................................................................... 42 5.6.1. Resultados obtenidos mediante Talos........................................ 42 5.6.2. Experimentación con los mejores modelos. ............................... 45 5.6.3. Análisis de los resultados obtenidos .......................................... 55 5.7. Experimentando en un entorno real .................................................. 65 5.7.1. SSH ............................................................................................ 67 5.7.2. FTP............................................................................................. 70 6. Conclusión .................................................................................................. 73 7. Posibles mejoras y trabajo futuro ............................................................. 74 8. Bibliografía y referencias........................................................................... 75 Anexo A ........................................................................................................... 79 Anexo B ........................................................................................................... 81 Anexo C ........................................................................................................... 83 3 Índice de figuras Ilustración 1: Defensa en profundidad ................................................................ 8 Ilustración 2: Tipos de IDS ............................................................................... 10 Ilustración 3: Logo Snort .................................................................................. 14 Ilustración 4: Logo Suricata .............................................................................. 15 Ilustración 5: Test de Turing ............................................................................. 16 Ilustración 6: Relación Inteligencia artificial, Machine learning y Deep Learning ......................................................................................................................... 17 Ilustración 7: Comparativa neurona biológica e artificial .................................. 19 Ilustración 8: Función de activación Sigmoid.................................................... 19 Ilustración 9: Función de activación Tanh ........................................................ 20 Ilustración 10: Función de activación ReLu ...................................................... 20 Ilustración 11: Red neuronal densa .................................................................. 20 Ilustración 12: Red neuronal convolucional ...................................................... 21 Ilustración 13: Red neuronal recurrente ........................................................... 22 Ilustración 14: Fórmula error cuadrático medio ................................................ 22 Ilustración 15: Fórmula entropía cruzada ......................................................... 22 Ilustración 16: Tablero Trello ............................................................................ 27 Ilustración 17: Logo TensorFlow ...................................................................... 29 Ilustración 18: Logo Keras ................................................................................ 30 Ilustración 19: Logo Scikit-Learn ...................................................................... 30 Ilustración 20: Logo Talos ................................................................................ 31 Ilustración 21: Logo Anaconda ......................................................................... 32 Ilustración 22: Información contenida en el fichero csv .................................... 34 Ilustración 23: Mezcla de datos ........................................................................ 35 Ilustración 24: Fórmula normalización de datos ............................................... 36 Ilustración 25: Código para la normalización .................................................... 36 Ilustración 26: Esquema red neuronal ejemplo ................................................ 38 Ilustración 27: Código para la codificación ....................................................... 38 Ilustración 28: Diccionario hiperparametros Talos I .......................................... 41 Ilustración 29: Modelo sin utilizar Talos ............................................................ 41 Ilustración 30: Modelo utilizando Talos ............................................................ 42 Ilustración 31:Gráfica de resultados generales ................................................ 43 4 Ilustración 32: Mejor arquitectura del modelo ................................................... 45 Ilustración 33: Gráfica tasa de acierto con 50 épocas ...................................... 46 Ilustración 34: Gráfica tasa de acierto con 50 épocas ampliada ...................... 46 Ilustración 35: Diccionario hiperparametros Talos II ......................................... 47 Ilustración 36: Comparativa funciones de activación ........................................ 49 Ilustración 37: Resultados funciones de activación entrenamiento I ................ 49 Ilustración 38: Resultados funciones de activación validación I ....................... 49 Ilustración 39: Resultados funciones de activación entrenamiento II ............... 50 Ilustración 40: Resultados funciones de activación validación II ...................... 50 Ilustración 41: Diccionario hiperparametros Talos ............................................ 51 Ilustración 42: Comparativa optimizadores ...................................................... 53 Ilustración 43: Resultados optimizadores entrenamiento I ............................... 53 Ilustración 44: Resultados optimizadores validación I ...................................... 54 Ilustración 45: Resultados optimizadores entrenamiento II .............................. 54 Ilustración 46: Resultados optimizadores validación II ..................................... 54 Ilustración 47: Comparativa matrizes de confusión .......................................... 57 Ilustración 48: Cálculos mediante matriz de confusión ..................................... 58 Ilustración 49: Código cálculos matriz de confusión ......................................... 58 Ilustración 50: Matriz de confisión Adam .......................................................... 65 Ilustración 51: Entorno virtual a utilizar ............................................................. 66 Ilustración 52: Escenario ataque servicio SSH ................................................. 67 Ilustración 53: Interfaz gráfica herramienta CICFlowMeter .............................. 68 Ilustración 54: Resultado del IDS ante un flujo maligno ................................... 68 Ilustración 55: Resultado función predict, sobre tráfico inyectado .................... 69 Ilustración 56: Resultados obtenidos ante tráfico maligno SSH ....................... 69 Ilustración 57: Comparación características tráfico inyectado y real ................ 70 Ilustración 58: Escenario ataque servicio FTP ................................................. 71 Ilustración 59: Flujo de tráfico FTP utilizando Wireshark.................................. 72 Ilustración 60: Flujo de tráfico FTP generado ................................................... 72 Ilustración 61: Flujo de tráfico FTP dado .......................................................... 72 5 Índice de tablas Tabla 1: Comparación IDS basados en firmas y anomalías ............................. 11 Tabla 2: Comparación IDS basados en host y red ........................................... 13 Tabla 3: Información ataques a la red .............................................................. 33 Tabla 4: Tráfico contenido en el fichero csv ..................................................... 34 Tabla 5: Ejemplo normalización ....................................................................... 36 Tabla 6: Datos sin codificar .............................................................................. 37 Tabla 7: Datos codificados mediante la codificación a entero .......................... 37 Tabla 8: Datos codificadoes mediante One-Hot ............................................... 37 Tabla 9: Matriz de confusión ............................................................................ 40 Tabla 10: Valores ordenados por val_accuracy de mejor a peor ..................... 43 Tabla 11: Valores obtenidos ordenados por accuracy de mejor a peor ........... 43 Tabla 12: Valores ordenados por val_accuracy de peor a mejor ..................... 44 Tabla 13: Valores obtenidos ordenados por la accuracy de peor a mejor ........ 44 Tabla 14: Resultados respecto a las funciones de activación .......................... 50 Tabla 15: Resultados respecto a los optimizadores ......................................... 55 Tabla 16: Valores dataset entrenamiento en función del tráfico benigno ......... 59 Tabla 17: Valores dataset entrenamiento en función del tráfico FTP ............... 59 Tabla 18: Valores dataset entrenamiento en función del tráfico SSH .............. 60 Tabla 19: Valores dataset validación en función del tráfico benigno ................ 60 Tabla 20: Valores dataset validación en función del tráfico FTP ...................... 60 Tabla 21: Valores dataset validación en función del tráfico SSH ..................... 61 Tabla 22: Valores dataset test en función del tráfico benigno .......................... 61 Tabla 23: Valores dataset test en función del tráfico FTP ................................ 61 Tabla 24: Valores dataset test en función del tráfico SSH ............................... 62 Tabla 25: Valores optimizador SGD ................................................................. 63 Tabla 26: Valores optimizadores Adadelta, Adagrad y RMSProp .................... 64 Tabla 27: Valores optimizadores Adam, Nadam, Adamax ............................... 64 6 1. Introducción En la actualidad, es indiscutible que las tecnologías de la información se han convertido en parte imprescindible de cualquier entorno, ya sea una empresa, una administración pública, una organización del sector social o incluso a título particular. Las empresas han tenido que asumir que, para mantener su posición estratégica, es imprescindible la utilización de tecnologías de la información en su cadena de generación de valor. Actualmente la tecnología no es una mera herramienta sin la cual las empresas reducirían sus márgenes de beneficios porque ciertos procesos serían más lentos, sino que son en realidad el corazón diferenciador y el motor económico de éstas. Sin embargo, no todas ellas son conscientes de las limitaciones y peligros que las tecnologías de la información pueden tener en la empresa. Es por ello, que paralelamente a la aparición de estas nuevas herramientas, aparece otro concepto el cual, cada día, toma más relevancia, la seguridad de estas tecnologías de la información. Podemos entender como seguridad una característica de cualquier sistema que nos indica que ese sistema está libre de todo peligro, daño o riesgo, y que es, en cierta manera, infalible. Pero como esta característica, es muy difícil de conseguir podemos suavizar esta definición de seguridad y hablar de fiabilidad, que sería la probabilidad de que un sistema se comporte tal y como se espera de él. A grandes rasgos para mantener un sistema seguro (o fiable) hablamos de garantizar tres aspectos básicos: 1. La confidencialidad exige que los objetos de un sistema han de ser accedidos únicamente por elementos autorizados a ello. 2. La disponibilidad indica que los objetos del sistema tienen que permanecer accesibles a elementos autorizados; es el contrario de la negación de servicio 3. La integridad significa que los objetos sólo pueden ser creados o modificados por elementos autorizados, y de una manera controlada y por tanto no han sido modificados por terceros no autorizados Junto con la fiabilidad o grado de seguridad de un sistema, entra, el concepto de defensa en profundidad el cual se basa en la premisa asumida anteriormente, de que todo componente de un sistema puede ser vulnerado, y por tanto no se debe delegar la seguridad de un sistema en un único método o componente de protección. Por tanto, la idea principal de la defensa en profundidad consiste en dividir la seguridad en diversas 7 capas, de forma que, para acceder a la última de estas, donde reside la información más importante de la empresa, por ejemplo, los datos, sea necesario previamente haber roto todas las capas previas. Ilustración 1: Defensa en profundidad Los elementos que componen un sistema de defensa en profundidad pueden variar según la necesidad y recursos de los que disponga una compañía, pero uno de los principales, y el que vamos a desarrollar en este proyecto, son los sistemas de detección de intrusos, también conocidos como IDS por sus siglas en inglés (Intrusion Detection System), los cuales serán colocados en la capa de red, para poder detectar un funcionamiento anómalo del sistema. 8 2. Estado del arte Para comprender de una forma más clara los conceptos a cubrir en este proyecto, vamos a ver por separado cada uno de los elementos sobre los que vamos a trabajar. 2.1. IDS A grandes rasgos, podríamos definir a un IDS [1] como un dispositivo o aplicación de software que monitoriza una red o sistemas en busca de actividad maliciosa o violaciones de políticas. Cualquier actividad de intrusión o violación generalmente se informa a un administrador o se recopila de forma centralizada utilizando un sistema de información de seguridad y gestión de eventos. Por tanto, es capaz de identificar posibles violaciones de seguridad que incluyen tanto intrusiones, (ataque desde fuera de la organización) como mal uso (ataque desde dentro de la organización). Es importante contextualizar un IDS dentro de un sistema de red, donde tenemos otros elementos que trabajan al mismo nivel realizando funciones similares. Uno de estos elementos son los firewalls, que realiza funciones de prevención, por tanto, aunque ambos se relacionan [2] con la seguridad de la red, un sistema de detección de intrusos (IDS) difiere de un firewall en que un IDS busca intrusiones para evitar que sucedan mientras que los firewalls limitan el acceso entre redes para evitar intrusiones sin poder identificar, por ejemplo, un ataque desde el interior de la red. Un IDS evalúa una posible intrusión una vez que ha tenido lugar y señala una alarma. Esto se logra tradicionalmente examinando las comunicaciones de red, identificando heurísticas y patrones (a menudo conocidos como firmas) de ataques informáticos comunes, y tomando medidas para alertar a los operadores. Por otra parte, un sistema que termina las conexiones se denomina sistema de prevención de intrusiones el cual analizaremos en los siguientes apartados. 2.1.1. Tipos de IDS En la actualidad existe una gran variedad de IDS según sus funciones como podemos ver en la siguiente imagen: 9 Ilustración 2: Tipos de IDS 2.1.2. Modo de detección • IDS basado en firmas Este tipo de IDS [3] se centra en la búsqueda de una "firma", patrones, o una identidad conocida, de una intrusión o evento de intrusión específico. Necesita actualizaciones periódicas de qué firmas o identidades son comunes en este momento para garantizar que su base de datos de intrusos esté actualizada. Se podría decir, por tanto, que los IDS basados en firmas son tan buenos como la actualización de su base de datos en un momento dado. Los atacantes pueden sortear los IDS basados en firmas cambiando frecuentemente pequeñas cosas sobre cómo se produce el ataque, por lo que las bases de datos no pueden seguir el ritmo. Además, significa que un tipo de ataque completamente nuevo puede no ser detectado en absoluto por IDS basados en firmas porque la firma no existe en la base de datos. Este podría ser el principal punto débil de este tipo de IDS que, sin embargo, un IDS basado en anomalías como el que vamos a desarrollar en este proyecto si podría detectar. Además, cuanto más grande sea la base de datos, mayor será la carga de procesamiento para que el sistema analice cada conexión y la compare con la base de datos. • IDS basados en anomalías 10 A diferencia de los IDS basados en firmas, como se ha mencionado anteriormente, los IDS basados en anomalías buscan los tipos de ataques desconocidos que los IDS basados en firmas encuentran difíciles de detectar. Debido al rápido crecimiento del malware y los tipos de ataque, los IDS basados en anomalías utilizan enfoques de aprendizaje automático para comparar modelos de comportamiento confiable con comportamiento nuevo. Como resultado, se marcarán anomalías o comportamientos de aspecto extraño o inusual. Sin embargo, el comportamiento previamente desconocido pero legítimo también puede marcarse accidentalmente, también conocido como falsos positivos, lo que puede causar algunos problemas, sobre todo a los administradores de sistemas al tener que estar revisando este tipo de alarmas. Por otro lado, uno de los puntos fuertes de los IDS basados en anomalías, es su capacidad para determinar cuándo alguien está sondeando o barriendo lo que suele preceder al ataque de una red. Las principales diferencias entre los dos modos las podemos ver en la siguiente tabla: Basados en firmas Basados en anomalías Rendimientos de Baja tasa de falsas alarmas; Alta Baja tasa de alarmas perdidas; detección tasa de alarmas perdidas Alta tasa de alarmas falsas. Eficiencia de Alto, disminuye con la escala de Depende de la complejidad del detección base de datos de firmas modelo. Dependencia del Casi todas las detecciones Bajo, solo el diseño de la dominio de dependen de característica conocimiento conocimiento del dominio depende del conocimiento del dominio Interpretación Diseño basado en dominio Solo emite resultados de conocimiento, fuerte detección, interpretativo habilidad interpretativa débil capacidad Detección de ataques Solo detecta ataques conocidos desconocidos Detecta ataques conocidos y desconocidos Tabla 1: Comparación IDS basados en firmas y anomalías 11 2.1.3. Origen de los datos • Sistema de detección de intrusos basado en host (HIDS) Consiste en un agente en un host que identifica intrusiones mediante el análisis de llamadas al sistema, registros de aplicaciones, modificaciones del sistema de archivos (binarios, archivos de contraseña, bases de datos, listas de control de acceso, etc.) y estados del host. En un HIDS, los sensores generalmente consisten en un agente de software. Algunos IDS basados en aplicaciones también forman parte de esta categoría. Los sistemas de detección de intrusos también pueden ser específicos del sistema utilizando herramientas personalizadas y honeypots[4]. En el caso de la seguridad física del edificio, IDS se define como un sistema de alarma diseñado para detectar la entrada no autorizada. • Sistema de detección de intrusos basado en red (NIDS) Es una plataforma independiente que identifica intrusiones al examinar el tráfico de red pudiendo monitorizar al mismo tiempo múltiples hosts. Los sistemas de detección de intrusos en red obtienen acceso al tráfico de la red conectándose a un concentrador de red, a un conmutador de red configurado para la duplicación de puertos o una toma de red. En un NIDS, los sensores se colocan en los puntos de estrangulamiento de la red para monitorizar, a menudo en la zona desmilitarizada (DMZ) o en los límites de la red. Los sensores capturan todo el tráfico y analizan el contenido de paquetes individuales para detectar tráfico malicioso. Un ejemplo de un NIDS como veremos es Snort. Finalmente, junto con lo visto en el apartado de IDS basado en anomalías, llegaríamos a la principal cuestión de los NIDS basados en anomalías, ¿Cómo podríamos distinguir un tráfico anómalo de uno benigno? debido a que la respuesta a esta pregunta depende de muchos parámetros, como, por ejemplo, la cantidad de tráfico a la que estamos habituados, porque para para lo que una empresa es una cantidad normal, para otra podría suponer una denegación de servicio. Sin embargo, alguno de los comportamientos que podríamos analizar son los siguientes [5]: - ¿Se completó el three-way handshake [6] entre dos anfitriones? Si fue así, esto significa que el servidor escucha en el puerto en el que el cliente solicitó y el servidor aceptó la conexión. Esto está bien si el comportamiento esperado es que el servidor escucha en el puerto solicitado. Sin embargo, ¿qué sucede si el puerto del servidor no es 12 el que espera escuchar? Esto podría indicar que se está ejecutando algún servicio, solo conocido por el administrador del sistema. Sin embargo, también podría significar que alguien instaló maliciosamente alguna aplicación de puerta trasera en el servidor sin ningún consentimiento. - ¿Se transmitieron los datos? Mediante herramientas de análisis de tráfico podemos ver, el número de bytes de datos que se enviaron en una conexión. Si vemos datos transmitidos, esto significa que los dos hosts están hablando entre sí. Cuando realizamos algún tipo de análisis retrospectivo de actividad inesperada entre dos hosts, observar la cantidad de bytes intercambiados puede ser útil para evaluar la gravedad de lo que podría haber ocurrido. Es posible que no podamos ver los bytes de datos reales o la carga útil, pero los números pueden ser reveladores. Los largos intercambios individuales y el número de intercambios en conjunto pueden indicar fácilmente un daño potencial por parte de un intruso. - ¿Quién comenzó y/o terminó la conexión? Al determinar qué host inició y finalizó la conexión, podemos tener una idea de quién tiene el control. Por lo general, el cliente solicita la conexión y el servidor responde. Cualquiera de los hosts puede finalizar la conversación, así que observaremos quien inicia la terminación con un RESET o FIN. Por último, en la siguiente tabla podemos ver las principales diferencias entre los IDS basados en host y los IDS basados en red: IDS basado en host Origen de los datos IDS basado en red Registros del sistema operativo o Tráfico de red programas de aplicación Despliegue En cada anfitrión; Depende del En los nodos de la red clave; Fácil sistema operativo; Difícil de de implementar implementar Eficiencia de Baja, debe procesar muchos logs detección Alta, puede detectar ataques en tiempo real Trazabilidad de la Rastree el proceso de intrusión intrusión de acuerdo con las rutas de intrusión de acuerdo con las llamadas del sistema Limitación No se puede Rastrea la posición y el tiempo de direcciones IP y marcas de tiempo analizar comportamiento de la red. el Monitoriza solo el tráfico que pasa en un segmento de red Tabla 2: Comparación IDS basados en host y red 13 2.1.4. Comportamiento Respecto al comportamiento tenemos dos tipos de sistemas de detección: • Pasivos Los sistemas de detección de intrusos pasivos son aquellos que no están diseñados para responder ante un ataque, simplemente lo detectan avisando de que alguna anomalía se ha producido • Activos Los sistemas de detección activos también conocidos como IPS por sus siglas en inglés (Intrusion Prevention System) combinan el funcionamiento de un IDS junto con una respuesta ante la detección de un ataque 2.1.5. IDS basados en red más usados. Debido a que en este proyecto vamos a desarrollar un IDS basado en red, vamos a ver resumidamente los NIDS más utilizados en la actualidad. • Snort Snort [7] es un sistema de prevención de intrusiones basado en red de código abierto, capaz de realizar análisis de tráfico en tiempo real y registro de paquetes en redes IP. Puede realizar análisis de protocolos, búsqueda o coincidencia de contenido, y puede usarse para detectar una variedad de ataques y sondeos, como por ejemplo desbordamientos de buffer, escaneos de puertos furtivos, o ataques CGI. Ilustración 3: Logo Snort • Suricata 14 Suricata [8] es un motor de detección de amenazas basado en red de código abierto. El motor Suricata es capaz de detección de intrusos en tiempo real (IDS), prevención de intrusos en línea (IPS), monitoreo de seguridad de red (NSM) y procesamiento pcap fuera de línea. Suricata utiliza un lenguaje de firma completo para determinar las amenazas conocidas y qué tipo de comportamiento es probable que provenga de un intruso. Una instancia de Suricata puede inspeccionar el tráfico de varios gigabits, y el motor se basa en una base de código moderna y escalable diseñada para funcionar a un alto nivel. Detecta automáticamente protocolos en cualquier puerto y puede aplicar la lógica de detección a cada paquete y protocolo a medida que pasa. Como parte de esto, puede registrar solicitudes HTTP, que pueden ayudar a detectar ataques de escaneo o inundación utilizando grandes cantidades de solicitudes de protocolo "normales" para abrumar una red. Ilustración 4: Logo Suricata 2.2. Deep learning aplicado en los IDS 2.2.1. Historia de la inteligencia artificial No hay duda de que, en la actualidad, la inteligencia artificial es uno de los campos con mayor inversión y visión de futuro que empieza a ser aplicada prácticamente en todos los campos de la informática, incluyendo el de la ciberseguridad. El origen de la inteligencia artificial empezó a formar sus bases en los 50 gracias a Alan Turing [9], el que es considerado por muchos el padre de la IA (Inteligencia artificial), por su publicación “Computing Machinery and Intelligence” [10], donde se 15 introdujeron los primeros conceptos sobre la inteligencia de las máquinas mediante el Test de Turing, el cual afirma que: «Una computadora puede ser llamada inteligente si logra engañar a una persona haciéndole creer que es un humano» - Alan Turing Ilustración 5: Test de Turing Desde entonces, la inteligencia artificial ha pasado por diferentes etapas de menos afluencia como el invierno de la IA [11], o de más afluencia como en el año 1996 cuando un ordenador llamado Deep Blue derrotó al mejor jugador de ajedrez por aquellos momentos Gary Kasparov [12], hasta encontrarse en el punto actual, donde dentro de la propia IA han aparecido otras ramas como son el aprendizaje automático (Machine learning) el cual desarrolla técnicas que permiten a las máquinas aprender por sí mismas mediante algoritmos a partir de datos suministrado y el aprendizaje profundo (Deep learning) la idea principal del cual es la resolución de problemas a partir de redes neuronales profundas que pretenden imitar la forma en la que nuestro cerebro toma decisiones. En la siguiente imagen, podemos ver a alto nivel a los principales componentes del mundo de la IA. 16 Ilustración 6: Relación Inteligencia artificial, Machine learning y Deep Learning 2.2.2. Deep Learning Podemos definir al aprendizaje profundo como una clase de algoritmos de aprendizaje automático que usa varias capas para extraer progresivamente características de nivel superior de la entrada sin formato. Por ejemplo, en el procesamiento de imágenes, las capas inferiores pueden identificar bordes, mientras que las capas superiores pueden identificar los conceptos relevantes para un ser humano, como dígitos, letras o caras. Debido a que vamos a utilizar el aprendizaje profundo empleando la arquitectura de redes neuronales artificiales para la implementación de nuestro IDS de red basado en anomalías, vamos a ver el funcionamiento de estas redes neuronales. 2.2.3. Redes neuronales Las redes neuronales artificiales (ANN) por sus siglas en ingles Artificial Neural Network, son sistemas informáticos vagamente inspirados en las redes neuronales biológicas que constituyen los cerebros de los animales. Dichos sistemas "aprenden" a realizar tareas considerando ejemplos, generalmente sin ser programados con reglas específicas de la tarea. Uno de los campos donde más son utilizadas las redes neuronales artificiales es en el reconocimiento de imágenes, debido a que pueden aprender a identificar imágenes que contienen, por ejemplo, gatos, analizando imágenes de ejemplo que se han etiquetado manualmente como "gato" o "no gato" y utilizando los resultados para identificar gatos en otras imágenes. Lo hacen sin ningún conocimiento previo, en 17 cambio, generan automáticamente características de identificación a partir de los ejemplos que procesan. Para entender con más detalle como las redes neuronales consiguen llevar a cabo la función para la cual son desarrolladas vamos a ver con más detalle los elementos por los cuales están formadas y diferentes parámetros y opciones que más tarde modificaremos para conseguir distinguir entre tráfico normal y el anómalo. • Neuronas artificiales Las neuronas artificiales son la base de las redes neuronales, ya que se basan en una colección de estas, las cuales pretenden modelar el funcionamiento de las neuronas en un cerebro biológico. La primera neurona artificial apareció en 1958 gracias al trabajo realizado por F. Rosenblatt [13] la cual denominó como perceptrón simple. Podemos ver las partes de una neurona artificial mediante la siguiente analogía respecto a una biológica. Dendritas: la cantidad de entradas que acepta la neurona o número de dimensiones de los datos de entrada. Sinapsis: pesos asociados con las dendritas. Estos son los valores que cambian durante la fase de entrenamiento. Baias o sesgo. Le permite aprender sobre un límite de decisión que no está centrado en el origen del espacio D-dimensional. Núcleo (célula del cuerpo): esta es una función que une los valores provenientes de las sinapsis, definiendo así el comportamiento de la neurona. Para simular la acción de la neurona biológica, es decir, disparando (activando) solo cuando hay ciertos estímulos en la entrada. El funcionamiento del núcleo viene dado por la siguiente función: Axón: este es el valor de salida de la neurona. Puede ser utilizado como entrada por otras neuronas. En la siguiente imagen podemos ver un resumen de los expuesto anteriormente: 18 Ilustración 7: Comparativa neurona biológica e artificial • Función de activación La función de activación [14] es importante para que una red neuronal aprenda. Su propósito principal es convertir una señal de entrada de un nodo en una señal de salida, la cual será usada como entrada a la siguiente capa en la pila. La función de activación decide, por tanto, si una neurona debe activarse o no mediante el cálculo de la suma ponderada y añadiéndole un sesgo adicional. El motivo es introducir la no linealidad en la salida de una neurona. Hay varios tipos de funciones de activación, pero las principales son: Sigmoid. Proporciona una salida en el rango [0,1] permitiendo interpretar la predicción como una probabilidad: Ilustración 8: Función de activación Sigmoid Tanh. Es similar a Sigmoid pero mejora el rendimiento. La función oscila entre (1,1). La principal ventaja de esta función es que las entradas negativas fuertes se asignarán a la salida negativa y solo las entradas de valor cero se asignarán a las salidas cercanas a cero. Por lo tanto, es menos probable que se bloqueen durante el entrenamiento. 19 Ilustración 9: Función de activación Tanh ReLu. Es la función de activación más utilizada y que varía de cero a infinito. [0, ∞) dando una salida de "x" si x es positivo y 0 en caso contrario. Ilustración 10: Función de activación ReLu • Tipo de capas Una vez hemos visto como está compuesta una única neurona o perceptrón, vamos a ver como estas pueden formar una red neuronal para así añadir un mayor grado de abstracción en función del tipo de capas que pueden formar, lo cual nos indica como se relacionan las neuronas de cada capa entre sí. Los principales tipos que podemos encontrar en la actualidad son los siguientes: Red neuronal densa: Es una topología de red particular en la que las neuronas entre dos capas adyacentes están completamente conectadas por pares, pero las neuronas dentro de una sola capa no comparten conexiones. En la siguiente imagen podemos ver un esquema de cuál sería su arquitectura: Ilustración 11: Red neuronal densa Como podemos ver, está formada por diversas capas, entre las que podemos distinguir la capa de entrada formada por las neuronas que introducen los valores a la red. 20 Las capas ocultas cuyo diseño no es tan simple como en la capa de entrada y de salida, por el simple hecho de que no hay reglas, es decir, modificando el número de capas ocultas y neuronas en cada una de ellas podremos modelar la realidad de una forma distinta. Y por último la capa de salida que realiza la clasificación y tiene tantas neuronas como posibles clases presente el problema. Este tipo de red será la que vamos a utilizar en este proyecto por las propiedades que nos ofrece, ya que como vamos a ver a continuación los otros dos tipos de redes neuronales son utilizadas en otro tipo de problemas. Red neuronal convolucional. La principal diferencia de la red neuronal convolucional con el modelo visto anteriormente es que cada neurona no se une con todas y cada una de las capas siguientes, sino que solo con un subgrupo de ellas para poder especializarse en una tarea en concreto, es por ello que son muy utilizadas en los campos de visión artificial. Ilustración 12: Red neuronal convolucional Red neuronal recurrente: Las redes neuronales recurrentes no tienen una estructura de capas, sino que permiten conexiones arbitrarias entre las neuronas, incluso pudiendo crear ciclos, con esto se consigue crear la temporalidad, permitiendo que la red tenga memoria, es por ello que son más utilizadas para trabajar con data sets con variables temporales. 21 Ilustración 13: Red neuronal recurrente • Funciones de coste Una vez tenemos claro los elementos que forman una red neuronal y como se conectan estos elementos entre sí, nos queda ver cómo funcionan o aprenden estas redes. Para ello deberemos definir la relación entre la salida del modelo y los datos reales. Para ello, definiremos una función de pérdida o coste. Esta función se utilizará para evaluar cómo debemos ajustar un modelo en función de la diferencia entre el valor real y el valor predicho. Las principales funciones de coste que tenemos son: Error cuadrático medio: Como bien indica su nombre, calcula el error de la red mediante la diferencia al cuadrado entre las predicciones y los resultados esperados. Su función de coste sería la siguiente: Ilustración 14: Fórmula error cuadrático medio Entropía cruzada [15]: Mide el rendimiento de un modelo de clasificación cuyo resultado es un valor de probabilidad entre 0 y 1. La pérdida de entropía cruzada aumenta a medida que la probabilidad pronosticada difiere de la etiqueta real. Por lo tanto, por ejemplo, predecir una probabilidad de 0.012 cuando la etiqueta de observación real es 1 sería malo y daría como resultado un alto valor de pérdida. Definimos la función de costo de entropía cruzada como: Ilustración 15: Fórmula entropía cruzada Donde n es el número total de elementos de datos de entrenamiento, la suma es sobre todas las entradas de entrenamiento, x, e y es el resultado deseado correspondiente. • Propagación hacia atrás. La propagación hacia atrás es un algoritmo que utiliza el error en la salida obtenido anteriormente para reducir el error y propagar ese error hacia las capas ocultas y de 22 entrada con el objetivo de que, en las siguientes iteraciones, la salida obtenida se aproxime a la salida esperada. El algoritmo busca el mínimo de la función de error y ajustará los pesos con respecto a ese error. Para ello se utilizan algoritmos como: El descenso del gradiente: Es un algoritmo de optimización utilizado para minimizar algunas funciones moviéndose iterativamente en la dirección del descenso más pronunciado según lo definido por el negativo del gradiente. Por tanto, utilizaremos el descenso de gradiente para actualizar los parámetros de nuestro modelo. El descenso del gradiente estocástico: [16] es una modificación del algoritmo del descenso del gradiente para mejorar algunas de las debilidades que este tiene, como su velocidad antes grandes cargas de datos, introduciendo el descenso del gradiente estocástico aleatoriedad al seleccionar los puntos de datos en cada paso para calcular las derivadas, por tanto este último elige aleatoriamente un punto de datos del conjunto de datos completo en cada iteración para reducir enormemente los cálculos. Por tanto, estos serían los elementos principales que necesitamos para crear una red neuronal artificial que, como veremos a lo largo del desarrollo del proyecto vamos a modelar según nuestras necesidades. 2.3. Redes Neuronales aplicadas a un IDS Una vez hemos definido los pilares básicos sobre los que se basa este proyecto, vamos a ver como relacionarlos, es decir, como se utiliza la inteligencia artificial para la detección de intrusos. Como hemos visto anteriormente existen dos tipos de IDS, los basados en host y los basados en red, pero en este proyecto nos vamos a centrar en los basados en red, por consiguiente, hemos visto los principales IDS basados en red que hay en la actualidad, Snort y Suricata. Sin embargo, respecto al modo de detección, ambos se basan en la detección mediante firmas, lo cual es una gran solución para detectar ataques conocidos, pero no lo es para detectar nuevos ataques o previamente no reconocidos. Es por ello, que en los últimos años se ha visto un aumento en el uso del aprendizaje automático para estas tareas. Muchas compañías están descubriendo los beneficios de incorporar el aprendizaje automático sobre sus productos o servicios. Por ejemplo, PayPal, utiliza aprendizaje profundo para reconocer patrones de fraude y Google usa 23 varias implementaciones de aprendizaje profundo para potenciar el reconocimiento visual o de voz [17]. El problema de algunas aplicaciones es que son demasiado difíciles de codificar con algoritmos para buscar patrones en enormes dimensiones. Dado que los NIDS basados en anomalías utilizan modelos de redes neuronales profundas, serán capaces de detectar ataques aunque estos no hayan sido previamente registrados por el hecho de analizar y abstraer un comportamiento, en vez de seguir un patrón en concreto, sin embargo, pese a esta gran ventaja respecto a los basados en firmas, el funcionamiento o la tasa de acierto queda limitada (como todas las aplicaciones de aprendizaje automático) por el conjunto de datos utilizado para entrenar al modelo como podremos comprobar al final de este proyecto. 2.4. Datasets en la actualidad Para que la red neuronal sea capaz de distinguir entre un tráfico correcto y uno anómalo le será necesario un conjunto de valores de entrada categorizados. Para ello se pueden utilizar dos métodos. Por una parte, podemos crear este dataset, a mano, es decir, para este caso en concreto tendríamos que recolectar nosotros mismos el tráfico benigno y maligno, para así pasárselo a la red neuronal como entrada, lo cual conlleva un gran esfuerzo, por lo que no suele ser un método recomendado a no ser que no exista ya un dataset creado. Por otra parte, podemos utilizar un dataset que ya ha sido creado y probado para la tarea que vayamos a realizar. Existen una gran variedad de estos entre los que destacan, por ejemplo, el dataset del MNIST con una base de datos de los números del cero al nueve escritos a mano[18], utilizada como ejemplo básico de introducción a las redes neuronales. Para este trabajo vamos a utilizar un dataset ya creado, entre los que podemos destacar. 1. DARPA1998 El conjunto de datos DARPA1998 [19] fue construido por el laboratorio Lincoln del MIT y es ampliamente utilizado en estudios IDS. Para compilarlo, los investigadores recolectaron tráfico de Internet en más de nueve semanas. El conjunto de datos contiene paquetes sin etiquetas y con etiquetas. Como los paquetes sin etiquetas no se pueden 24 aplicar directamente a modelos tradicionales de aprendizaje automático, el conjunto de datos KDD99 fue construido para superar este inconveniente 2. KDD99 El conjunto de datos KDD99 [20] es uno de los conjuntos de datos de referencia IDS más extendidos en la actualidad. Sus compiladores extrajeron características de 41 dimensiones de los datos en DARPA1998. Las etiquetas en KDD99 son las mismas que las DARPA1998. Hay cuatro tipos de características en KDD99, es decir, características básicas, características de contenido, basadas en host características estadísticas y características estadísticas basadas en el tiempo. Desafortunadamente, el conjunto de datos KDD99 incluye muchos defectos. Primero, los datos están gravemente desequilibrados, lo que hace que los resultados de la clasificación estén sesgados hacia clases mayoritarias, y, además, hay muchos registros duplicados y existen registros redundantes. Por último, pero no menos importante, los datos de KDD son demasiado antiguos para representar el entorno de red actual por lo que este Dataset tampoco será utilizado en este proyecto. 3. CSE-CIC-IDS2018 Este conjunto de datos [21] es el resultado de un proyecto colaborativo entre el Communications Security Establishment (CSE) y el Instituto Canadiense de Ciberseguridad (CIC) que utiliza la noción de perfiles para generar un conjunto de datos de ciberseguridad de manera sistemática. Incluye una descripción detallada de las intrusiones junto con modelos de distribución abstractos para aplicaciones, protocolos o entidades de red de nivel inferior. El conjunto de datos incluye siete escenarios de ataque diferentes, como son, fuerza bruta, Heartbleed, Botnet, DoS, DDoS, ataques web e infiltración de la red desde el interior. La infraestructura de ataque incluye 50 máquinas y la organización víctima tiene 5 departamentos que incluyen 420 ordenadores y 30 servidores. Este conjunto de datos incluye el tráfico de red y los archivos de registro de cada máquina desde el lado de la víctima, junto con 80 características de tráfico de red extraídas del tráfico capturado usando CICFlowMeter-V3. Debido a las características que nos ofrece este Dataset y al ser el más actual, vamos a utilizarlo como conjunto de datos de entrada para el entrenamiento. En el desarrollo del proyecto veremos con más detalle su estructura y que datos vamos o no a utilizar. 25 3. Motivación y objetivos La motivación para el desarrollo de este proyecto es por una parte el aprendizaje de uno de los principales campos de investigación actual, como es la inteligencia artificial, y su aplicabilidad en nuevos ámbitos de la ingeniería informática, como puede ser la ciberseguridad, y, por otra parte, como se mejora la seguridad de los servicios ofrecidos sobre internet, mediante herramientas especializadas para esta función como son los sistemas de detección de intrusos. Es por ello que, este proyecto me parecía ideal para juntar estas dos inquietudes y comprobar posteriormente si los resultados de este trabajo son en cierta medida aplicables a un entorno real. El principal objetivo de este proyecto de fin de master será el de analizar, diseñar, e implementar un sistema de detección de intrusos basado en la inteligencia artificial, debido a que los IDS existentes aún enfrentan desafíos en la mejora de la precisión de detección, principalmente en dos campos, el primero reduciendo la tasa de falsas alarmas y el segundo en detectar ataques desconocidos. Es por ello que están apareciendo los IDS que aprovechen los métodos de aprendizaje automático de modo que pueden descubrir automáticamente las diferencias esenciales entre datos normales y datos anormales con alta exactitud y en los cuales me gustaría indagar realizando para ello los siguientes objetivos: • Investigar y contextualizar los sistemas de detección de intrusos en la actualidad. • Investigar cómo podemos aplicar las diferentes técnicas de Deep Learning aplicadas a un sistema de detección de intrusos. • Experimentar con las diferentes opciones que nos ofrecen las redes neuronales para resolver de la forma más optima el problema. • Análisis, evaluación y conclusiones que podemos extraer de los resultados obtenidos. • Aplicar y analizar los resultados del modelo en un entorno real para su posible posterior usabilidad en este entorno. 26 4. Metodología 4.1. Metodología de trabajo Como metodología de trabajo para este proyecto hemos utilizado el desarrollo en cascada, durante los primeros pasos de investigación, y a la hora de desarrollar la red neuronal en sí hemos utilizado una metodología iterativa 4.1.1. Desarrollo en cascada Para el desarrollo del proyecto hemos utilizado una metodología en cascada, ya que, al inicio de este, hemos especificado unos procesos u objetivos que deberíamos ir consiguiendo, y a medida que tuviéramos los primeros terminados y bien definidos podríamos seguir con los siguientes. Para ello, tras un conjunto de objetivos realizado, ha sido necesaria una reunión, para ver si el desarrollo había sido el adecuado en cada proceso, y de esta forma poder seguir con el siguiente, o por el contrario modificarlo hasta que cumpliera con los requisitos establecidos. Para identificar los procesos de una forma clara y ordenada he utilizado la herramienta Trello. Un ejemplo de un tablero de Trello durante las primeras semanas de trabajo es el siguiente: Ilustración 16: Tablero Trello 4.1.2. Desarrollo iterativo Por otra parte, una vez tenemos una idea clara de que queremos hacer y cómo, empezamos con el desarrollo de la red neuronal de una forma iterativa, ya que primero cumplimos unos requisitos básicos como por ejemplo que aprendiera con cierto grado de 27 acierto, y posteriormente en cada ciclo hemos ido mejorando esta tasa de acierto ya se mediante, por ejemplo, el modelado de la arquitectura de la red, o mediante la modificación de alguno de los parámetros de entrada en el Dataset. 28 5. Desarrollo del proyecto 5.1. Entorno de trabajo y tecnologías a utilizar En este proyecto vamos a utilizar distintos entornos de trabajo y diferentes tecnologías las cuales vamos a analizar brevemente. 5.1.1. Software • Python Python [22] es un lenguaje de programación interpretado, multiplataforma y multiparadigma. Es de código abierto y de escritura rápida y robusta cuya filosofía hace hincapié en la legibilidad de su código. He elegido Python como lenguaje ya que este proporciona un entorno bien estructurado y probado para la implementación de algoritmos de inteligencia artificial. Para ello Python cuenta con numerosas librerías para trabajar con el análisis de datos que facilita el procesamiento de grandes volúmenes de datos. Algunas de las que vamos a utilizar son: • TensorFlow TensorFlow [23] es una biblioteca de código abierto para aprendizaje automático a través de un rango de tareas, y desarrollado por Google para satisfacer sus necesidades de sistemas capaces de construir y entrenar redes neuronales para detectar y descifrar patrones y correlaciones, análogos al aprendizaje y razonamiento usados por los humanos. Tensorflow trabaja a un nivel más bajo, por lo que para interactuar con esta biblioteca utilizaremos una API de alto nivel llamada Keras. Ilustración 17: Logo TensorFlow 29 • Keras Keras [24] es una API de redes neuronales de alto nivel, escrita en Python y capaz de ejecutarse sobre TensorFlow, CNTK o Theano. Las principales funciones que nos ofrece Keras son: -La facilidad de uso ya que Keras es una API diseñada para seres humanos, no para máquinas, ofreciendo una API consistente y simple, que minimiza la cantidad de acciones del usuario requeridas para casos de uso comunes. -Modularidad. Un modelo se entiende como una secuencia o un gráfico de módulos independientes totalmente configurables que se pueden conectar con la menor cantidad de restricciones posible. En particular, las capas neurales, las funciones de costo, los optimizadores, los esquemas de inicialización, las funciones de activación y los esquemas de regularización son módulos independientes que puede combinar para crear nuevos modelos. -Fácil extensibilidad. Los nuevos módulos son fáciles de agregar (como nuevas clases y funciones), y los módulos existentes proporcionan amplios ejemplos. Poder crear fácilmente nuevos módulos permite una expresividad total, lo que hace que Keras sea adecuado para la investigación avanzada. Ilustración 18: Logo Keras • Sklearn Scikit-learn [25] es una librería utilizada para el Machine Learning. Proporciona una gran variedad de algoritmos de aprendizaje tanto supervisados como no supervisados. Ilustración 19: Logo Scikit-Learn 30 • Pandas Pandas [26] es una biblioteca de software escrita para el lenguaje de programación Python para la manipulación y análisis de datos. En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series de tiempo. • Numpy Numpy [27] es una librería para el lenguaje de programación Python, que agrega soporte para matrices y matrices multidimensionales grandes, junto con una gran colección de funciones matemáticas de alto nivel para operar en estas matrices. • Pickle El módulo Python Pickle [28] se usa para serializar y deserializar una estructura de objeto Python. Mediante esta librería podremos almacenar e importar los Datasets de una forma más eficiente. • Talos Talos [29] es una librería que nos permite configurar, realizar y evaluar experimentos de optimización de hiperparámetros en una red neuronal de una forma más clara e intuitiva. Ilustración 20: Logo Talos • Matplotlib Matplotlib [30] es una librería para la generación de gráficos. • Anaconda Anaconda [31] es una distribución libre y abierta de los lenguajes Python y R, para trabajar en entornos de ciencia de datos, y aprendizaje automático. Esto incluye procesamiento de grandes volúmenes de información, análisis predictivo y cómputos 31 científicos. Está orientado a simplificar el despliegue y la administración de los paquetes de software Ilustración 21: Logo Anaconda • Jupyter JupyterLab [32] es un entorno de desarrollo interactivo basado en la web para código y datos. Jupyter nos permite configurar y organizar la interfaz de usuario para admitir una amplia gama de flujos de trabajo en ciencia de datos, y aprendizaje automático. Además, es extensible y modular, lo que nos permite escribir complementos que agreguen nuevos componentes y se integren con los existentes. 5.1.2. Hardware Como hardware utilizaré una máquina virtual proporcionada por la Escuela Politécnica Superior de la universidad con los siguientes recursos: -Procesador: AMD Opteron 63xx 3,72 GHz (2 procesadores) -Memoria RAM: 4 GB -Sistemas Operativo: Windows 10 (64 bits) Como podemos ver, los recursos de la máquina no son los idóneos para trabajar en un entorno de alto procesamiento, pero aprovecharemos el hecho de no ser una máquina de uso propio, para la ejecución continua del algoritmo de aprendizaje, sobre todo mediante la herramienta Talos como veremos en el próximo apartado. 5.2. Dataset. El dataset a utilizar será el creado por la Communications Security Establishment (CSE) y el Instituto Canadiense de Ciberseguridad (CIC) datado en el 2018. En los datasets proporcionados se recoge el tráfico generado durante varios días sobre el mismo escenario, pero con distintitos tipos de ataques, es por ello, que nos vamos a centrar en el 32 tráfico generado el día 14-02-2018 ya que este se corresponde con los ataques de fuerza bruta sobre los protocolos SSH y FTP. Ambos ataques de fuerza bruta son realizados sobre la misma máquina víctima, un Ubuntu 16.4 con IP 172.31.69.25. Por otra parte, el atacante utilizará dos máquinas con Kali Linux, como podemos ver en la siguiente tabla: Atacante Víctima Nombre del Fecha ataque Inicio Finalización del del ataque ataque IP privada: IP privada: Fuerza bruta 14-02- 172.31.70.4 172.31.69.25 sobre FTP 2018 IP pública: IP pública: 18.221.219.4 18.217.21.148 IP privada: IP privada: Fuerza bruta 14-02- 172.31.70.6 172.31.69.25 sobre SSH 2018 IP pública: IP pública: 18.219.211.138 18.217.21.148 10:32 12:09 14:01 15:31 Tabla 3: Información ataques a la red Para la realización del ataque se utiliza la herramienta Patator. Patator es [33] es una herramienta multihilo bastante completa y flexible para la realización de ataques de fuerza bruta escrita en Python. También puede guardar cada respuesta en un archivo de registro separado para su posterior revisión. Para el ataque se usan los módulos de FTP y SSH en la máquina Kali Linux atacante. Para obtener una lista de contraseñas, utilizan un diccionario que contiene 90 millones de palabras. 5.3. Pre-procesamiento del Dataset Para cada día, nos ofrecen la información de tres modos distintos, por una parte, tenemos los logs generados, un fichero pcap con todo el tráfico procesado y por último un fichero csv con toda la información extraída por la herramienta CICFlowMeter [34]. Como dataset utilizaremos el fichero csv, ya que la herramienta CICFlowMeter ya nos ha extraído del fichero pcap toda la información que necesitaremos en 79 características, como pueden ser puertos, longitud de los paquetes etc. 33 El conjunto de datos en el fichero csv, contiene tráfico normal (benigno) y maligno compuesto en este caso por los dos tipos de ataques que vamos a distinguir. Para que el dataset puede ser utilizado por el algoritmo de entrenamiento, previamente tendremos que realizar unas tareas de procesamiento de los datos: 1. Limpieza de filas El primer problema con el que nos encontramos en el dataset, es la aparición de valores no numéricos, los cuales no podrán ser procesados por la red neuronal. Estos valores que hemos podido encontrar son “Nan” e “Infinity” como podemos ver en la siguiente captura del fichero csv: Ilustración 22: Información contenida en el fichero csv Por tanto, el primer paso a realizar, será generar un nuevo csv, que como datos de entrenamiento solo contenga valores numéricos, eliminando, por tanto, todas aquellas filas que no cumplan este requisito, obteniendo en el nuevo fichero la siguiente división del tráfico: Tipo de tráfico Número de filas Porcentaje del total limpio Total 1048550 Filas eliminadas 3799 Total limpio 1044751 100% FTP Fuerza bruta 193354 18,52% SSH Fuerza bruta 187589 17,95% Benigno 663808 63,53% Tabla 4: Tráfico contenido en el fichero csv Por último, como podemos ver en los porcentajes, el tráfico Benigno triplica al de FTP o SSH, por lo que reduciremos este para que su porcentaje sea más o menos el mismo que par los otros dos tipos de tráfico. 2. Extracción de columnas no necesarias Como se ha mencionado anteriormente, la herramienta CICFlowMeter nos ha extraído toda la información en 79 características distintas, pero algunas de estas no nos 34 serán útiles, o no pueden ser entendidas por la red neuronal para el aprendizaje, como puede ser por ejemplo la columna del Timestamp ya que, al no utilizar una red neuronal recurrente, este valor más tarde será normalizado y no tendrá sentido para la red. El resto de características o columnas si serán utilizadas para entrenar a la red. 3. Mezcla de datos Los datos en el csv, vienen ordenados como se produjeron, es decir, primero tenemos un pequeño bloque de tráfico benigno, a continuación, el bloque del ataque de fuerza bruta sobre FTP, luego tráfico benigno, después el otro bloque de ataque de fuerza bruta sobre SSH y finalmente otro bloque de tráfico benigno. Esto supone un problema para el aprendizaje de la red neuronal, ya que, al principio, al recibir un bloque de 193354 filas de ataque por fuerza bruta sobre FTP, la red se especializará en detectar solamente este tipo de entrada, lo que producirá que más tarde, al recibir todo el tráfico benigno siempre se equivoque prediciendo ataques sobre FTP. Para evitar este problema utilizaré la función shuffle sobre todo el conjunto de entrada: Ilustración 23: Mezcla de datos 4. Normalización En el dataset que vamos a utilizar, dependiendo del tipo de característica, los valores que esta tiene varían respecto a los valores de otra, por ejemplo, los valores de la característica Flow IAT MAX siempre serán mayores que los valores en Flow IAT MIN, entonces, estas dos características están en rangos muy diferentes. Es por ello que estas dos entradas afectaran de forma distinta a la red si no se normalizan, ya que, el ingreso o peso atribuido influirá intrínsecamente en el resultado debido a su mayor valor sin esto significar necesariamente que sea más importante como predictor. Es por ello, que sobre todos los valores de entrada aplicaré la normalización cuyo objetivo es cambiar los valores de las columnas numéricas en el conjunto de datos a una escala común, sin distorsionar las diferencias en los rangos de valores. 35 Para la normalización utilizaré la estrategia min-max normalization, donde para cada característica, el valor mínimo de esa característica se transforma en un 0, el valor máximo se transforma en un 1 y cualquier otro valor se transforma en un decimal entre 0 y 1. Para ello utilizaré la siguiente fórmula: Ilustración 24: Fórmula normalización de datos Donde 𝑥 = (𝑥1 , … 𝑥𝑛 ) y 𝑧𝑖 es su 𝑖 𝑡ℎ información normalizada. Para ver este de una forma más clara, podemos ver un pequeño ejemplo de cómo quedarían unos valores de entrada tras su normalización: Dato1 Dato2 Dato3 Dato1 Dato2 Dato3 10 2 748 0 0 1 12 13 234 0.4 1 0 15 2 543 1 0 0.60 12 2 347 0.4 0 0.22 Tabla 5: Ejemplo normalización Para ello utilizaré el método fit_transform que nos ofrece la clase MinMaxScaler[35] correspondiente a la librería Sklearn Ilustración 25: Código para la normalización 5. Codificación En el dataset con el que vamos a trabajar, tenemos tres tipos de tráfico, FTP Fuerza bruta, SSH Fuerza bruta, Benigno, es decir, se trata de datos categóricos ya que contienen etiquetas en vez de valores numéricos, lo cual no puede ser interpretado por nuestra red neuronal. Para solventar este problema utilizaremos la codificación One-Hot, mediante la cual estas variables categóricas se convierten en valores numéricos. Vamos a ver esto en un ejemplo aplicado a nuestro dataset. Supongamos que tenemos la siguiente entrada: Flow Duration Tot Fwd Pkts Tot Bwd Pkts Label 25 12 3 Benign 36 754 3 4 FTP-BruteForce 432 2 0 SSH-BruteForce 434 5 0 Benign 3254 12 4 Benign Tabla 6: Datos sin codificar Donde las tres primeras columnas son los valores de entrada a la red (la X) y la última se corresponde con el tipo de tráfico (lo que tiene que predecir el algoritmo). Primero realizaremos lo que se conoce como codificación a entero: Flow Duration Tot Fwd Pkts Tot Bwd Pkts Label 25 12 3 0 754 3 4 1 432 2 0 2 434 5 0 0 3254 12 4 0 Tabla 7: Datos codificados mediante la codificación a entero Para finalmente aplicar la codificación One-Hot: Flow Duration Tot Fwd Pkts Tot Bwd Pkts Label 25 12 3 1, 0, 0 754 3 4 0, 1, 0 432 2 0 0, 0, 1 434 5 0 1, 0, 0 3254 12 4 1, 0, 0 Tabla 8: Datos codificadoes mediante One-Hot De este modo, mediante esta codificación, podemos representar la salida que una red neuronal produce, activando la neurona correspondiente dependiendo del tipo de tráfico que supone que recibe como entrada: 37 Ilustración 26: Esquema red neuronal ejemplo Para ello utilizaré los métodos fit y transform [36] que nos ofrece la librería Sklearn y el método to_categorical [37] correspondiente con Keras: Ilustración 27: Código para la codificación Todos los pasos realizados anteriormente se ejecutarán en un programa previo al de la red neuronal que podemos encontrar en el Apéndice A. 5.4. División del dataset y Métricas a utilizar Para la evaluación del algoritmo dividiremos el dataset en tres partes: • Set de entrenamiento: El conjunto de datos real que utilizamos para entrenar el modelo (pesos y sesgos en este caso). El modelo ve y aprende de estos datos. Para este set vamos a utilizar un 81% de los datos totales. • Set de validación: Es el conjunto de datos utilizado para proporcionar una evaluación imparcial de un modelo ajustado en el conjunto de datos de entrenamiento mientras se ajustan los hiperparámetros del modelo. Para este set vamos a utilizar un 10% de los datos totales. • Set de test: Es el conjunto de datos utilizado para proporcionar una evaluación imparcial de un modelo final ajustado en el conjunto de datos de entrenamiento. Para este set vamos a utilizar un 9% de los datos totales. 38 Para evaluar el funcionamiento de la red neuronal utilizaré las siguientes métricas: • Precisión. La precisión se define como la proporción de muestras clasificadas correctamente con respecto a las muestras totales. La precisión es una métrica adecuada cuando el conjunto de datos está equilibrado. En entornos de red reales; sin embargo, las muestras normales son mucho más abundantes que las muestras anormales; por lo tanto, la precisión no suele ser una métrica adecuada. 𝑃𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 = • 𝑉𝑃 + 𝑉𝑁 𝑉𝑃 + 𝐹𝑃 + 𝐹𝑁 + 𝑉𝑁 Tasa verdaderos negativos (TVN). Esta tasa nos indica la tasa de verdaderos negativos que son correctamente clasificados. 𝑇𝑉𝑁 = • 𝑉𝑁 𝑉𝑁 + 𝐹𝑃 Tasa verdaderos positivos (TVP): También conocida como recall. Se define como la proporción de muestras positivas verdaderas respecto al número de muestras positivas totales. La tasa de detección refleja la capacidad del modelo para reconocer ataques, que es una métrica importante en los IDS. TVP = • 𝑉𝑃 𝑉𝑃 + 𝐹𝑁 La tasa de falsos negativos (TFN) se define como la relación de muestras falsas negativas respecto al total de muestras positivas. En la detección de ataques, el TFN también se denomina tasa de alarma perdida. 𝑇𝐹𝑁 = • 𝐹𝑁 𝑉𝑃 + 𝐹𝑁 La tasa de falsos positivos (TFP) se define como la proporción de muestras negativas clasificadas incorrectamente como positivas. En la detección de ataques, el TFP también se denomina tasa de falsas alarmas, y se calcula del siguiente modo: 𝑇𝐹𝑃 = 39 𝐹𝑃 𝑉𝑁 + 𝐹𝑃 • Matriz de confusión [38]. Es una herramienta que nos permitirá la visualización del desempeño de nuestro algoritmo. Cada columna de la matriz representa el número de predicciones de cada clase, mientras que cada fila representa a las instancias en la clase real. En la siguiente tabla podemos ver un simple ejemplo de una matriz de confusión Valor Predicho Valor Real Gato Perro Conejo Gato 5 3 0 Perro 2 3 2 Conejo 0 2 11 Tabla 9: Matriz de confusión 5.5. Arquitectura de la red Uno de los puntos más difíciles a la hora de implementar una red neuronal, es sin duda, la arquitectura que esta debe tener, tanto a nivel de capas ocultas y neuronas por cada una de estas capas, como funciones de activación, funciones de coste, sobre entrenamiento etc. Esto es debido, como explica Elie Burzstein [39] en una de sus conferencias [40], a la dificultad de poder modelar el problema que estamos abordando mediante redes neuronales, ya que no existe ninguna regla ni protocolo que ante tal tipo de problema al que nos enfrentemos, nos indique que hiperparámetros debemos utilizar para conseguir un resultado óptimo, además de la gran variedad de opciones entre las que podemos elegir, es por ello, que como nos comenta Elie Burzstein, el mejor método para esta tarea, se trata simplemente de la prueba y error, es decir, ir modificando los parámetros de la red, según veamos que mejora o no la tasa de acierto. Dado que este es un problema ya conocido, en la actualidad existen una gran variedad de herramientas para agilizar este proceso [41]. En mi caso voy a utilizar la herramienta Talos. Para ello primero en un diccionario de Python, declararé los hiperparámetros y los límites que deseo comprobar: 40 Ilustración 28: Diccionario hiperparametros Talos I Como podemos ver, los parámetros los cuales irán variando sus valores son el número de neuronas de entrada (input_neuron), número de capas ocultas(hidden_layers) número de neuronas en las capas ocultas(first_neuron), si utilizaremos dropout o no(dropout), tamaño del lote(batch_size) y, por último, los optimizadores(optimizer). Una vez tenemos los hiperparametros definidos, prepararemos el modelo Keras. Para ello, simplemente remplazaré los parámetros que vamos a probar, por referencias al diccionario de parámetros. En la siguiente imagen podemos ver el cambio del modelo tradicional utilizando Keras que hemos desarrollado en este proyecto, sin hiperparametos frente al modelo con hiperparametros: Ilustración 29: Modelo sin utilizar Talos 41 Ilustración 30: Modelo utilizando Talos Como modelo de optimización utilizaré grid search mediante el cual se procesarán todas las permutaciones de hiperparámetros en el límite de parámetros dado, lo que producirá 384 modelos distintos. Por tanto, una vez tenemos el modelo creado podemos ejecutarlo, en este caso en la máquina virtual proporcionada, debido al tiempo necesario para que Talos, realice todas las permutaciones posibles. En el apéndice B, podemos encontrar el modelo creado mediante Talos. 5.6. Resultados obtenidos 5.6.1. Resultados obtenidos mediante Talos. Una vez Talos ha concluido su ejecución obtenemos 384 valores distintos de precisión tanto para el subset de entrenamiento como para el de validación. La herramienta ha guardado estos resultados tanto en gráficas mediante TensorBoard como en un fichero csv. Como podemos ver en la siguiente imagen, al obtener unas tasas de acierto tan parecidas y con tantos datos, mediante las gráficas nos será imposible obtener los mejores modelos: 42 Ilustración 31:Gráfica de resultados generales Es por ello que utilizaremos el fichero csv para extraer información que nos pueda ser útil. Primero ordenaremos todos los valores en función de la mejor tasa de acierto en la validación y entrenamiento. Tabla 10: Valores ordenados por val_accuracy de mejor a peor Tabla 11: Valores obtenidos ordenados por accuracy de mejor a peor Mediante los valores obtenidos podemos extraer las siguientes conclusiones: 1. El modelo funciona mejor con una sola capa oculta. 43 2. No es necesario aplicar dropout. 3. La mejor cantidad de neuronas en las capas ocultas es de 256 neuronas. 4. Ambos optimizadores obtienen unos resultados similares. 5. El número de neuronas en la capa de entrada parece indiferente Ahora ordenaremos estos valores en función de las peores tasas de acierto obtenidas: Tabla 12: Valores ordenados por val_accuracy de peor a mejor Tabla 13: Valores obtenidos ordenados por la accuracy de peor a mejor Mediante los valores obtenidos podemos extraer las siguientes conclusiones: 1. Los peores resultados se obtienen con 2 o 3 capas ocultas 44 2. Los peores resultados se obtienen con dropout 3. El optimizador nadam en este caso tiene peores resultados 4. El número de neuronas parece equitativo entre los peores resultados Por tanto, a partir de los peores y mejores resultados, el modelo que mejor resuelve este problema sería el siguiente. Ilustración 32: Mejor arquitectura del modelo 5.6.2. Experimentación con los mejores modelos. Mediante las pruebas anteriores hemos podido detectar que arquitectura, sobre todo a nivel de neuronas y capas se adapta mejor al modelo, en este apartado, a partir del mejor modelo obtenido anteriormente vamos a profundizar un poco más en otros parámetros y así ver qué resultados obtenemos. Primero vamos a ver el número de épocas o iteraciones necesarias para nuestra red neuronal. Para ello vamos a ejecutar la red con un número elevado de épocas y mediante unas gráficas ver cómo se comporta. Los resultados obtenidos son los siguientes: 45 Ilustración 33: Gráfica tasa de acierto con 50 épocas Como podemos ver, a partir de las primeras iteraciones el comportamiento ya es lineal, es decir, que ya no mejora, por lo que no sería necesario pasarle al algoritmo un número tan elevado de iteraciones. Para ver exactamente cuantas son necesarias, vamos a crear otro gráfico para ver esto con más detalle: Ilustración 34: Gráfica tasa de acierto con 50 épocas ampliada En este caso hemos ampliado la gráfica entre las iteraciones cero y ocho donde podemos comprobar que, a partir de la iteración cuarta, el algoritmo ya ha alcanzado su tasa máxima de acierto. Una vez hemos visto el número de épocas óptimo para la resolución del problema, vamos a realizar una serie de pruebas sobre los dos parámetros que menos hemos probado 46 durante la ejecución de Talos, las funciones de activación, donde solo hemos probado con relu y los diferentes optimizadores disponibles, ya que solo hemos probado con adam y nadam. En ambos casos vamos a utilizar la mejor arquitectura de red que hemos obtenido. • Funciones de activación [42]: Para ver cómo funciona nuestro algoritmo en función de la función de activación utilizada voy a utilizar Talos para las pruebas y TensorBoard para la visualización de los gráficos. Para ello utilizaré el siguiente diccionario: Ilustración 35: Diccionario hiperparametros Talos II Los valores obtenidos por cada uno de las funciones son los siguientes: Tasa de acierto entrenamiento Tasa de acierto validación Función de activación ReLu Función de activación Sigmoid 47 Función de activación Tanh Función de activación Elu Función de activación Selu 48 Función de activación Linear Ilustración 36: Comparativa funciones de activación Debido a que las tasas de acierto son muy similares entre todas las funciones, vamos a ver los resultados mediante una misma gráfica y unas tablas para comparar los resultados. Ilustración 37: Resultados funciones de activación entrenamiento I Ilustración 38: Resultados funciones de activación validación I 49 Ilustración 39: Resultados funciones de activación entrenamiento II Ilustración 40: Resultados funciones de activación validación II Tabla 14: Resultados respecto a las funciones de activación Por tanto, las funciones de activación que mejores resultados nos han dado son ReLu y Elu, con un porcentaje de 99,9942% y 99,9923% de acierto respectivamente en el dataset de validación, mientras que los peores resultados los hemos obtenido mediante Sigmoid con un 99,9789%, y Tanh con una tasa del 99,9722%. • Optimizadores [43]: 50 Al igual que en las funciones de activación voy a utilizar Talos para las pruebas y TensorBoard para la visualización de los gráficos. Para ello utilizaré el siguiente diccionario: Ilustración 41: Diccionario hiperparametros Talos Los valores obtenidos por cada uno de los optimizadores son los siguientes: Tasa de acierto entrenamiento Tasa de acierto validación Optimizador Adam Optimizador Nadam 51 Optimizador SGD Optimizador RMSProp Optimizador Adagrad 52 Optimizador Adadelta Optimizador Adamax Ilustración 42: Comparativa optimizadores Debido a que las tasas de acierto son muy similares entre todos los optimizadores, vamos a ver los resultados mediante una misma gráfica y unas tablas para comparar los resultados. Ilustración 43: Resultados optimizadores entrenamiento I 53 Ilustración 44: Resultados optimizadores validación I Ilustración 45: Resultados optimizadores entrenamiento II Ilustración 46: Resultados optimizadores validación II Finalmente, como los valores de precisión obtenidos entre los distintos optimizadores, son muy similares, vamos a ver mediante la siguiente tabla el orden de mejor optimizador a peor respecto a la precisión en la val_accuracy 54 Tabla 15: Resultados respecto a los optimizadores Los optimizadores que mejores resultados nos han dado son Adam y Nadam, con un porcentaje de 99,9952% y 99,9942% de acierto respectivamente en el dataset de validación, mientras que los peores resultados los hemos obtenido mediante Adagrad con un 99,9741%, pero sobre todo con SGD con un 99,8755%. 5.6.3. Análisis de los resultados obtenidos Mediante las pruebas realizadas anteriormente solamente obtenemos la precisión de nuestro modelo, pero esto, como hemos visto en el apartado de métricas puede que no sea suficiente, por tanto, mediante la matriz de confusión de cada métrica, vamos a ver con más detalle como clasifica nuestro modelo en función del optimizador utilizado. Para ello vamos a utilizar los tres datasets disponibles, el de entrenamiento, el de validación y el de test, con una distribución equitativa, de los tres tipos de tráfico a analizar. Matriz de confusión Matriz de confusión Matriz de confusión test entrenamiento 487993 validación 60247 muestras 54222 muestras muestras Optimizador Adam 55 Optimizador Nadam Optimizador SGD Optimizador RMSProp Optimizador Adagrad 56 Optimizador Adadelta Optimizador Adamax Ilustración 47: Comparativa matrizes de confusión Los valores obtenidos por las matrices de confusión los utilizaré para calcular la tasa de verdades positivos (TVP), la tasa de verdaderos negativos (TVN), la tasa de falsos positivos (TFP) y por último la tasa de falsos negativos (TFN). Este tipo de métricas se suelen utilizar en variables binarias, es decir, que sean de un tipo o de otro, por ejemplo, tráfico benigno o maligno. Dado que, en este proyecto, dentro del tráfico maligno, estamos diferenciando dos tipos de ataques un sobre SSH y el otro sobre FTP, a estas métricas se les tendrá que añadir en función de que variable se están calculando, por ejemplo, TVPFTP, se referirá a la tasa de verdaderos positivos en función de ataques sobre FTP. Por tanto, para calcular estos valores, me basaré en la matriz de confusión como podemos ver en la siguiente imagen: 57 Ilustración 48: Cálculos mediante matriz de confusión Siendo la implementación de la imagen anterior la siguiente: Ilustración 49: Código cálculos matriz de confusión • Los resultados obtenidos con el subset de entrenamiento son: 58 Benigno Entrenamiento Optimizador TVPB TVNB TFPB TFNB Adam 0.999983 0.999994 0.000006 0.000017 Nadam 0.999972 0.999994 0.000006 0.000028 SGD 0.997838 0.999987 0.000013 0.002162 RMSProp 0.999861 0.999984 0.000016 0.000139 Adagrad 0.999733 0.999984 0.000016 0.000267 Adadelta 0.999883 0.999971 0.000029 0.000117 Adamax 0.999966 0.999983 0.000016 0.000033 Tabla 16: Valores dataset entrenamiento en función del tráfico benigno FTP Entrenamiento Optimizador TVPFTP TVNFTP TFPFTP TFNFTP Adam 1 0.999922 0.000078 0 Nadam 1 0.999922 0.000078 0 SGD 1 0.999484 0.000516 0 RMSProp 1 0.999882 0.000118 0 Adagrad 1 0.999882 0.000118 0 Adadelta 1 0.999894 0.000106 0 Adamax 1 0.9999185 0.000082 0 Tabla 17: Valores dataset entrenamiento en función del tráfico FTP SSH Entrenamiento Optimizador TVPSSH TVNSSH TFPSSH TFNSSH Adam 0.999816 0.999991 0.000009 0.000184 Nadam 0.999816 0.999985 0.000015 0.000184 SGD 0.999802 0.999277 0.000723 0.000198 RMSProp 0.999796 0.999964 0.000036 0.000204 Adagrad 0.999796 0.999896 0.000104 0.000204 Adadelta 0.999769 0.999964 0.000036 0.000231 59 Adamax 0.999795 0.999985 0.000015 0.000204 Tabla 18: Valores dataset entrenamiento en función del tráfico SSH • Los resultados obtenidos con el sub set de validación son: Benigno Validación Optimizador TVPB TVNB TFPB TFNB Adam 0.999865 1 0 0.000135 Nadam 0.999865 1 0 0.000135 SGD 0.998112 0.999974 0.000026 0.001888 RMSProp 0.999820 0.999974 0.000026 0.000180 Adagrad 0.999506 0.999974 0.000026 0.000494 Adadelta 0.999775 0.999974 0.000026 0.000225 Adamax 0.999865 0.999974 0.000026 0.000135 Tabla 19: Valores dataset validación en función del tráfico benigno FTP Validación Optimizador TVPFTP TVNFTP TFPFTP TFNFTP Adam 1 0.999927 0.000073 0 Nadam 1 0.999927 0.000073 0 SGD 1 0.999732 0.000268 0 RMSProp 1 0.999927 0.000073 0 Adagrad 1 0.999902 0.000098 0 Adadelta 1 0.999902 0.000098 0 Adamax 1 0.999927 0.000073 0 Tabla 20: Valores dataset validación en función del tráfico FTP SSH Validación Optimizador TVPSSH TVNSSH TFPSSH TFNSSH Adam 0.999947 0.999976 0.000024 0.000053 Nadam 0.999947 0.999976 0.000024 0.000053 60 SGD 0.999893 0.999229 0.000771 0.000107 RMSProp 0.999893 0.999952 0.000048 0.000107 Adagrad 0.999893 0.999807 0.000193 0.000107 Adadelta 0.999893 0.999952 0.000048 0.000107 Adamax 0.999893 0.999976 0.000024 0.000107 Tabla 21: Valores dataset validación en función del tráfico SSH • Los resultados obtenidos con el sub set de test son: Benigno Test Optimizador TVPB TVNB TFPB TFNB Adam 0.999950 1 0 0.000050 Nadam 0.999950 1 0 0.000050 SGD 0.997980 1 0 0.002020 RMSProp 0.999697 1 0 0.000303 Adagrad 0.999748 1 0 0.000252 Adadelta 0.999950 0.999971 0.000029 0.000050 Adamax 1 1 0 0 Tabla 22: Valores dataset test en función del tráfico benigno FTP Test Optimizador TVPFTP TVNFTP TFPFTP TFNFTP Adam 1 0.999919 0.000081 0 Nadam 1 0.999919 0.000081 0 SGD 1 0.999566 0.000434 0 RMSProp 1 0.999783 0.000217 0 Adagrad 1 0.999919 0.000081 0 Adadelta 1 0.999919 0.000081 0 Adamax 1 0.999919 0.000081 0 Tabla 23: Valores dataset test en función del tráfico FTP SSH Test Optimizador TVPSSH TVNSSH 61 TFPSSH TFNSSH Adam 0.999824 0.999973 0.000027 0.000176 Nadam 0.999824 0.999973 0.000027 0.000176 SGD 0.999824 0.999274 0.000726 0.000176 RMSProp 0.999824 0.999973 0.000027 0.000176 Adagrad 0.999824 0.999866 0.000134 0.000176 Adadelta 0.999765 0.999973 0.000027 0.000235 Adamax 0.999824 1 0 0.000176 Tabla 24: Valores dataset test en función del tráfico SSH Como podemos ver en los resultados obtenidos, podemos sacar algunas conclusiones de los resultados en general independientemente del optimizador utilizado: 1. No se ha equivocado nunca, en los tres subconjuntos utilizados, a la hora de clasificar el tráfico de ataque sobre FTP, es decir, siempre que el modelo ha recibido una muestra de ataque FTP ha predicho que efectivamente se correspondía con una ataque sobre FTP de ahí que la tasa de verdadero positivos sobre FTP es uno, mientras que, siempre que ha recibido un ataque FTP, nunca ha predicho que se tratara otro tipo de tráfico, por eso la tasa de falsos negativos es cero. 2. Como podemos observar, en los tres subconjuntos generados, siempre hay cierto tipo de tráfico exacto, que se corresponde con un ataque SSH, pero que el modelo, interpreta como ataque FTP, sin importar el optimizador a utilizar. Es por ello que en el dataset de entrenamiento siempre vemos que se ha equivocado 26 veces, en la validación una y en el test tres. 3. Como vemos en las matrices de confusión, exceptuando el caso del optimizador SGD, el modelo se equivoca más en dos casos concretos. Cuando recibe tráfico maligno sobre SSH, a veces predice que es tráfico maligno FTP, como hemos visto en el punto anterior, y cuando recibe tráfico benigno, que a veces predice que se trata de tráfico maligno SSH Por tanto, como visión general de todos los optimizadores, el algoritmo clasifica perfectamente el tráfico maligno FTP, el tráfico Benigno lo confunde más con ataques sobre SSH que sobre TFP, y por último el tráfico maligno SSH, lo confunde más con FTP que con el tipo Benigno. 62 Respecto a los optimizadores de forma individual obtenemos las siguientes conclusiones. 1. Como hemos visto anteriormente, todos tienen unos patrones de comportamiento similares, excepto el optimizador SGD. Como podemos ver en las tablas de las métricas, sus valores son más o menos iguales que el resto, pero la tasa de falsos negativos respecto al tráfico real Benigno, es muy elevada en comparación con los otros optimizadores, por lo que SGD, ante un tráfico Benigno real, predecirá con más frecuencia que se trata de tráfico tanto maligno SSH como FTP que los otros optimizadores. Entrenamiento Validación Test Tabla 25: Valores optimizador SGD 2. Adadelta, Adagrad y RMSProp se comportan de forma muy parecida. Respecto a la tasa de verdaderos positivos, que es la métrica más importante en un sistema de detección de intrusos, estos tres optimizadores, obtienen una clasificación perfecta del tráfico maligno FTP, pero oscilan en el mismo porcentaje de acierto en los otros dos tipos de tráfico, entre un 99,973% de mínimo y un 99,988% de máximo, sin haber, por tanto, notables diferencias entre el acierto en el tráfico benigno y el maligno SSH. 63 Tasa de verdaderos positivos Tasa benignos de verdaderos positivos malignos SSH Tabla 26: Valores optimizadores Adadelta, Adagrad y RMSProp 3. Por otra parte, Adam, Nadam, y Adamax, como podemos ver en la siguiente comparativa, obtienen un porcentaje de tasa de verdaderos positivos respecto al tráfico maligno SSH muy similar, a los tres optimizadores vistos en el punto anterior, ya que ahora las tasas de acierto oscilan entre el 99,979% y el 99, 981% y antes entre el 99,976% y el 99,979%, sin embargo, donde estos tres optimizadores si se diferencian de los anteriores es en la tasa de acierto de tráfico benigno, donde las tasas oscilan entre el 99,996% y el 99,998% mientras que anteriormente, la tasa máxima 99,986% no alcanzaba ni la mínima actual. Tasa de verdaderos positivos Tasa benignos de verdaderos positivos malignos SSH Tabla 27: Valores optimizadores Adam, Nadam, Adamax 4. Por tanto, de estos tres últimos optimizadores, el que mejor tasa de acierto tiene es Adam, con un 100% sobre ataques FTP, un 99,998% sobre tráfico benigno y un 99,981% sobre ataques SSH. Finalmente, en este sistema de detección de intrusos, hemos tratado de separar dos tipos de ataques y ver si también los podía distinguir, lo cual ha realizado con una tasa de acierto muy elevada, pero la función principal de un IDS es la de detectar amenazas, es decir, si una muestra es benigna o maligna, lo cual en nuestro mejor modelo obtenido se realiza de una manera prácticamente perfecta, como podemos ver en la siguiente imagen: 64 Ilustración 50: Matriz de confisión Adam Donde sobre, 602.462, solamente no ha sabido predecir que la muestra recibida era un ataque, en 2 ocasiones. 5.7. Experimentando en un entorno real Por último, como hemos analizado en los resultados obtenidos, la tasa de acierto del mejor modelo obtenido es prácticamente del 100%, por lo que vamos a experimentar con este modelo, en un entorno distinto del que ha aprendido a clasificar el tráfico, para de este modo, poder comprobar si el IDS obtenido podría ser utilizado para la detección de ataques de fuerza bruta en un entorno “real”. Para la puesta en marcha del entorno de pruebas, utilizaré tres máquinas virtuales distintas, dos de ellas serán los servidores, una para el servicio SSH, y la otra para FTP, mientras que la última será la maquina atacante. Los sistemas operativos y herramientas a utilizar serán los mismos que en el entorno de pruebas del dataset. En la siguiente imagen, podemos ver el entorno utilizado: 65 Ilustración 51: Entorno virtual a utilizar Antes de realizar las pruebas pertinentes, debemos tener en cuenta que el aprendizaje de la red neuronal está basado en datos, donde la comprensión de estos es el primero paso. Pero estos datos pueden ser presentados de distintas formas, lo cual puede reflejar de distinto modo un ataque. Por ejemplo, podemos diseñar un IDS basado en paquetes, ya que estos son las unidades básicas de comunicación de red, representando los detalles de cada comunicación. Para ello necesitaríamos primero analizar, por ejemplo, su encabezado donde se especifica de forma estructurada las direcciones IP, puertos y otros campos específicos para varios protocolos, o la porción de datos de la aplicación donde se contiene la carga útil de los protocolos de la capa de aplicación. Este sistema permite que los paquetes pueden procesarse instantáneamente sin almacenamiento en caché; por lo tanto, la detección puede ocurrir en tiempo real. Sin embargo, los paquetes individuales no reflejan el estado de comunicación completo ni el contexto información de cada paquete, por lo que es difícil detectar algunos ataques, como DDOS. Es por ello que en este trabajo utilizamos como datos de entrada los flujos de una comunicación, extraídos mediante la herramienta CICFlowMeter. Los datos de flujo 66 contienen paquetes agrupados en un período, que es la fuente de datos más extendida para IDS. Las principales ventajas de este modo son: 1. El flujo representa todo el entorno de red, pudiendo detectar la mayoría de los ataques, especialmente DOS y fuerza bruta. 2. Sin análisis de paquetes o reestructuración de sesión, el preprocesamiento del flujo es simple. Sin embargo, el flujo ignora el contenido de los paquetes; por lo tanto, su efecto de detección para U2R y R2L es insuficiente. A demás, al extraer características de flujo, los paquetes deben ser cacheados, lo cual puede complicar su análisis en tiempo real. Otro problema que podemos encontrar es, la fuerte heterogeneidad del flujo lo que puede causar efectos de detección deficientes. En este caso la herramienta CICFlowMeter terminará los flujos TCP con la desconexión de la conexión (por paquete FIN) mientras que los flujos UDP terminarán con un tiempo de espera de flujo. 5.7.1. SSH Para comprobar su funcionamiento sobre SSH, lanzaremos el servicio OpenSSHServer [44] en la máquina víctima junto con un sniffer de tráfico como es Wireshark [45], mientras que en la maquina atacante lanzaremos la herramienta Patator con el módulo de ssh_login. Ilustración 52: Escenario ataque servicio SSH 67 Una vez tenemos el tráfico capturado, utilizaremos CICFlowMeter para extraer los flujos de comunicación y el programa import.py para el preprocesamiento de este dataset a evaluar. Ilustración 53: Interfaz gráfica herramienta CICFlowMeter Con el dataset listo mediante la función predict[47] y utilizando el modelo generado evaluaremos el tráfico generado. Los resultados obtenidos a diferencia de lo que podíamos esperar, es que todo el tráfico generado es benigno, es decir, no ha sido capaz de detectar el ataque por fuerza bruta. Por tanto, para intentar detectar porque se ha comportado de ese modo, vamos a extraer un flujo de tráfico maligno del propio dataset de entrenamiento para inyectarlo en el dataset generado en nuestro propio entorno de pruebas, para ver si en este caso si lo detecta. Pero obtenemos el siguiente resultado. Ilustración 54: Resultado del IDS ante un flujo maligno Como podemos ver el resultado sigue sin ser el esperado ya que la salida [1. 0. 0.] se corresponde con el tráfico benigno (esta salida nos está indicando que la neurona de la 68 capa de salida de la red activada es la primera. En este caso aún no hemos aplicado la función softmax, que devolvería la neurona con el valor más alto, un 0). El error del modelo, se debe al modo de procesar los datos de entrada, más concretamente a la normalización utilizada, ya que, en el entorno de pruebas, el número de flujos ha sido de 140, mientras que en el entrenamiento teníamos 487993 flujos, por lo cual los valores máximos y mínimos de cada propiedad son muy distintos. Para solventar este problema, vamos a utilizar la normalización L2, que no se ve afectada por este factor, y que nos produce un modelo con una tasa de acierto cerca del 100% al igual que nos ocurría con la normalización min-max. En este caso al ejecutar la función predict sobre el tráfico maligno inyectado del dataset de entrenamiento si obtenemos el resultado esperado: Ilustración 55: Resultado función predict, sobre tráfico inyectado Ahora al aplicar softmax sobre ese resultado nos devolvería un 2, correspondiente con el tráfico maligno sobre SSH. Sin embargo, nuestro IDS, sigue sin detectar los ataques que hemos realizado en el entorno de prueba, al utilizar la función predict: Ilustración 56: Resultados obtenidos ante tráfico maligno SSH Esto es debido a que los valores extraídos difieren bastante de los valores del ataque sobre el que ha aprendido en el entrenamiento, es decir, las características del flujo de comunicación del entorno de prueba, no han sido las mismas que en el dataset de entrenamiento, como podemos ver en la siguiente imagen, y, por tanto, el modelo no es capaz de detectar ataques de fuerza bruta sobre SSH.: 69 Ilustración 57: Comparación características tráfico inyectado y real 5.7.2. FTP Para comprobar su funcionamiento sobre FTP, lanzaremos el servicio Vsftpd en la segunda máquina víctima junto con el sniffer de tráfico Wireshark, mientras que en la maquina atacante lanzaremos la herramienta Patator con el módulo de ftp_login. 70 Ilustración 58: Escenario ataque servicio FTP Los resultados obtenidos son exactamente los mismo que en el caso anterior, para que detecte los ataques del dataset de entrenamiento hemos tenido que utilizar de nuevo la normalización L2, pero los ataques que hemos generado nosotros mismos, no son detectados por el modelo. En este caso, vamos a analizar las características de cada flujo, mediante los ficheros csv generado por CICFlowMeter en ambos casos y la captura obtenida mediante Wireshark. En la siguiente imagen podemos ver el flujo de datos obtenido mediante Wireshark: 71 Ilustración 59: Flujo de tráfico FTP utilizando Wireshark Donde podemos observar que realizamos un intento de conexión incorrecto, donde el cliente envía un total de 4 paquetes FTP al servidor, el servidor responde con un total de 5 paquetes, y 8 paquetes más para el establecimiento, mantenimiento y cierre de sesión, lo que hace un total de 17 paquetes intercambiados con 192 bytes de información, que como podemos observar en la siguiente imagen se corresponde con lo extraído mediante el CICFlowMeter: Ilustración 60: Flujo de tráfico FTP generado Sin embargo, y es por ello que los resultados no sean los esperados, en el dataset de entrenamiento, estos valores no son parecidos: Ilustración 61: Flujo de tráfico FTP dado Lo cual nos hace entender, porque el modelo generado, no ha sido capaz de detectar los ataques FTP ya que al igual que en estas columnas que son las más sencilla de entender y visualizar mediante Wireshark, ocurre con el resto, donde los valores son muy distintos. 72 6. Conclusión Respecto a las conclusiones extraídas mediante este trabajo podemos dividirlas en dos campos. Por una parte, el modelo que hemos construido a partir del dataset ofrecido por el CSE y el CIC, se comporta de una manera excelente, donde hemos podido concluir que el mejor modelo estará compuesto por una única capa oculta de 256 neuronas, junto con una capa de entrada con 32 neuronas. Respecto a las funciones de optimización los resultados son muy similares entre las distintas opciones ofrecidas, destacando entre todas ellas la función ReLu. En cuanto a los optimizadores, también nos ofrecen unos resultados muy similares, donde destaca Adam, con un 100% de acierto sobre ataques FTP, un 99,998% sobre tráfico benigno y un 99,981% sobre ataques SSH. Por tanto, los resultados obtenidos mediante el IDS utilizando algoritmos de inteligencia artificial han sido excelentes. Por otra parte, al aplicar el modelo obtenido mediante el dataset que nos ha sido dado, al tráfico generado por nosotros mismos simulando los mismos ataques que estaban presentes en el dataset, el modelo no ha sido capaz de reconocer el tipo de tráfico que recibía, debido a las características de los flujos de comunicación que no eran las mismas que en el caso dado, lo cual nos lleva a concluir que el modelo implementado es muy bueno respecto al dataset mediante el cual entrena, pero no puede generalizar de un forma correcta para enfrentare a ataques en un entorno real. Por tanto, los resultados obtenidos mediante el IDS en un entorno diferente al de entrenamiento no han sido los esperados. Por último, respecto a los objetivos del trabajo, han sido todos realizados con éxito a pesar, de que como se ha comentado antes, los resultados obtenidos en el entorno real no han sido los deseados. 73 7. Posibles mejoras y trabajo futuro Vistos los resultados que hemos obtenido las principales mejoras y posibles trabajos futuros se podrían centrar en la mejora de la tasa de acierto en un entorno diferente al de entrenamiento, ya sea mediante el uso de otro dataset ya existente, o mediante la creación de uno mismo, el cual se acerque más al entorno real donde lo queramos aplicar. Una posible mejora respecto a IDS, hubiera sido el uso de más tipos de datos de entrada, para así conseguir una red neuronal más inteligente, que supiera distinguir no solo entre un ataque de fuerza bruta al protocolo SSH o FTP y tráfico benigno, sino que también fuera capaz de detectar otro tipo de ataques, y no solo en los protocolos que hemos analizado. Esto podría ser posible, ya que junto al dataset que hemos utilizado, se encontraban otros tipos de dataset los cuales contenían información sobre diferentes ataques. También sería interesante probar con otro tipo de red neuronal. Como hemos visto en el estado del arte, existen otros tipos de redes neuronales a parte de la red neuronal densa utilizada en este proyecto. Para el problema al que nos enfrentamos, en un principio utilizar una red convolucional no sería la mejor opción debido a que el ámbito en el que esta se aplica es muy distinto al nuestro, sin embargo, puede que el uso de una red neuronal recurrente si sea una buena opción, ya que una de las variables de todos los paquetes intercambiados en una red es el tiempo y este tipo de redes, es la que mejor trabaja con esta variable. 74 8. Bibliografía y referencias [1] Wikipedia (2020). Intrusion detection system. [En línea]. Disponible en https://en.wikipedia.org/wiki/Intrusion_detection_system [2] Dnsstuff (2018) What Is an Intrusion Detection System? Latest Types and Tools. [En línea]. Disponible en https://www.dnsstuff.com/intrusion-detection-system#scanningattacks [3] Ajay Yadav (2018) Network Design: Firewall, IDS/IPS. [En línea]. Disponible en https://resources.infosecinstitute.com/network-design-firewall-idsips/#gref [4] Wikipedia (2019). Honeypot. [En línea]. Disponible en https://es.wikipedia.org/wiki/Honeypot [5] Judy Novak; Stephen Northcutt (2002) Network Intrusion Detection, Third Edition (p. 44) [6] Geeksforgeeks (2019) TCP 3-Way Handshake Process. [En línea]. Disponible en https://www.geeksforgeeks.org/tcp-3-way-handshake-process/ [7] Snort (2020) Snort [En línea]. Disponible en https://www.snort.org/faq/what-is-snort [8] Suricata (2020) Suricata [En línea]. Disponible en: https://suricata-ids.org/ [9] Wikipedia (2020). Alan Turing. [En línea]. Disponible en https://es.wikipedia.org/wiki/Alan_Turing [10] A. M. Turing (1950) Computing Machinery and Intelligence. [En línea]. Disponible en: https://phil415.pbworks.com/f/TuringComputing.pdf [11] Wikipedia (2020). AI winter. [En línea]. Disponible en https://en.wikipedia.org/wiki/AI_winter [12] Wikipedia (2020).Deep Blue versus Gary Kasparov. [En línea]. Disponible en https://es.wikipedia.org/wiki/Deep_Blue_versus_Gary_Kasparov [13] Fran Ramírez (2018) Historia de la IA. [En línea]. https://empresas.blogthinkbig.com/historia-de-la-ia-frank-rosenblatt-y-e/ 75 Disponible: [14] Aurélien Géron (2018) Neural networks and deep learning (c. Introduction to Artificial Neural Networks) [15] Michael Nielsen (2019) Improving the way neural networks learn. [En línea]. Disponible en http://neuralnetworksanddeeplearning.com/chap3.html [16] Aishwarya V Srinivasan (2019) Stochastic Gradient Descent — Clearly Explained [En línea]. Disponible https://towardsdatascience.com/stochastic-gradient-descent- clearly-explained-53d239905d31 [17] Tensorflow. (2019) All case studies and mentions [En línea]. Disponible en: https://www.tensorflow.org/about/case-studies [18] Yann LeCun; Corinna Cortes, Christopher J.C. Burges (2019) THE MNIST DATABASE of handwritten digits [En línea]. Disponible en: http://yann.lecun.com/exdb/mnist/ [19] Lincoln Laboratory (1998)1998 DARPA INTRUSION DETECTION EVALUATION DATASET. [En línea]. Disponible en: https://www.ll.mit.edu/rd/datasets/1998-darpa-intrusion-detection-evaluation-dataset [20] University of California, Irvine (1999) KDD99 Dataset. 1999. [En línea]. Disponible en: http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html [21] Canadian Institute for Cybersecurity (2019) CSE-CIC-IDS2018 on AWS. [En línea]. Disponible en https://www.unb.ca/cic/datasets/ids-2018.html [22] Python (2020) Python. [En línea]. Disponible en: https://www.python.org/ [23] Tensorflow (2020) Tensorflow. [En línea]. Disponible en: https://www.tensorflow.org/ [24] Keras (2020) Keras. [En línea]. Disponible en: https://keras.io [25] Scikit-Learn. (2020) Scikit-Learn [En línea]. Disponible en: https://scikitlearn.org/stable/ [26] Pandas (2020) Pandas. [En línea]. Disponible en: https://pandas.pydata.org/ [27] NumPy developers (2020) Numpy. [En línea]. Disponible en: https://numpy.org/ 76 [28] Pickle. (2020) Pickle [En línea]. Disponible en: Disponible en: https://docs.python.org/3/library/pickle.html#module-pickle [29] Autonomio (2020) Talos. [En línea]. https://github.com/autonomio/talos [30] Matplotlib (2020) Matplotlib. [En línea]. Disponible en: https://matplotlib.org/ [31] Anaconda (2020). Anaconda. [En línea]. Disponible en: https://www.anaconda.com/ [32] Jupyter (2020). Jupyter. Disponible en: https://jupyter.org/ [33] Lanjelot. (2020) Patator. [En línea]. Disponible en https://github.com/lanjelot/patator [34] Canadian Institute for Cybersecurity (2019) CICFlowMeter. [En línea]. Diponible en http://www.netflowmeter.ca/netflowmeter.html [35] Scikit-learn. (2019). sklearn.preprocessing.MinMaxScaler. [En línea]. Disponible en https://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html [36] Scikit-learn. (2019). sklearn.preprocessing.LabelEncoder. [En línea]. Disponible en: https://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html [37] Keras (2020) Keras utils. [En línea]. Disponible en https://keras.io/utils/ [38] Wikipedia (2019). Matriz de confusión. [En línea]. Disponible en https://es.wikipedia.org/wiki/Matriz_de_confusi%C3%B3n [39] Wikipedia (2020). Elie Bursztein. [En línea]. Disponible en https://en.wikipedia.org/wiki/Elie_Bursztein [40] Youtube (2019) Cutting Edge TensorFlow: New Techniques (Google I/O'19). [En línea]. Disponible en: https://www.youtube.com/watch?v=Un0JDL3i5Hg [41] Mikko (2018) A Comprehensive List of Hyperparameter Optimization & Tuning Solutions. [En línea]. Disponible en https://medium.com/@mikkokotila/a- comprehensive-list-of-hyperparameter-optimization-tuning-solutions-88e067f19d9 [42] Keras (2020) Keras activations. [En línea]. Disponible en https://keras.io/activations/ 77 [43] Keras (2020) Keras optimizers. [En línea]. Disponible en: https://keras.io/optimizers/ [44] OpenSSH (2020) OpenSSH. [En línea]. Disponible en: https://www.openssh.com/ [45] Wireshark (2020) Wireshark. [En línea]. Disponible en: https://www.wireshark.org/ 78 Anexo A Import.py 79 80 Anexo B KerasTuner.py 81 82 Anexo C bestIDS.py 83 84