scieee AI-readable full text Open interactive document viewer

Detección de anomalías en los registros de tráfico ofrecidos por IPFIX

Lara Romero, Agustín Walabonso

Abstract

El de la ciberseguridad es un campo que siempre está evolucionando. Esto hace que sea uno de los escenarios más complejos, pues los enfoques y paradigmas cambian continuamente. Cada año se encuentran un gran número de vulnerabilidades nuevas en los diferentes sistemas, y es por ello por lo que constantemente se desarrollan técnicas y software que eliminan, bloquean o identifican estas vulnerabilidades. El objetivo de este documento es la investigación y desarrollo de técnicas de detección de comportamientos anómalos en el tráfico de red, así como la realización de pruebas que permitan valorar el funcionamiento de los mismos.

Full text

Equation Chapter 1 Section 1 Proyecto Fin de Carrera Ingeniería de Telecomunicación Detección de anomalías en los registros de tráfico ofrecidos por IPFIX Autor: Agustín Walabonso Lara Romero Tutor: Rafael Estepa Alonso Dpto. de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Proyecto Fin de Carrera Ingeniería de Telecomunicación Detección de anomalías en los registros de tráfico ofrecidos por IPFIX Autor: Agustín Walabonso Lara Romero Tutor: Rafael Estepa Alonso Profesor titular Dpto. de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Trabajo Fin de Grado: Detección de anomalías en los registros de tráfico ofrecidos por IPFIX Autor: Agustín Walabonso Lara Romero Tutor: Rafael Estepa Alonso El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2019 El Secretario del Tribunal A mi familia A mis profesores A mis amigos Agradecimientos En primer lugar, quiero agradecer a mis padres, Agustín y María Victoria por haberme permitido realizar mis estudios, formarme como persona y apoyarme en todo lo que me he propuesto. En segundo lugar, agradecer a todas las personas con las que paso mucho tiempo y siempre están conmigo, Manuel Ferrera, Andrés, Ismael, Juan, Curro, Juan Ángel, Francisco, Lourdes, Ana. En definitiva, a todos mis compañeros de clase por haber estado tan unidos, siempre disponibles para ayudar al que lo necesitaba. En tercer lugar, agradecer a toda mi familia, con especial cariño a mi abuela, por todo el gran apoyo que me han brindado. Gracias también a Mónica Pérez por estar todos los días ayudándome en todo, dándome un gran apoyo y saber que siempre estás ahí para todo. Gracias a todos mis profesores por toda la formación y conocimiento proporcionado a lo largo de mi etapa de estudiante. No se me olvida agradecer a mis compañeros de Everis el haberme permitido trabajar con ellos y enseñarme tanto en mis prácticas de empresa ¡Espero que podamos volver a trabajar juntos! También agradecer a mis grandes compañeros de Hapkido que somos una gran familia. Por último y no menos importante, agradecer al departamento de telemática por haber conseguido motivarme y querer trabajar en el mundo de la telemática. En especial, agradecer a mi tutor de proyecto, Rafael Estepa, por ayudarme y permitirme llevar a cabo este proyecto, así como motivarme en el mundo de la ciberseguridad. Gracias por su asesoramiento y corrección. Agustín Walabonso Lara Romero Sevilla, 2019 ÍNDICE DE TABLAS Tabla 1 Comparativa de diferentes DPI. 15 Tabla 2 Comparativa de los diferentes cortafuegos. 16 Tabla 3 Comparativa de diferentes IDS. 16 Tabla 4 Campos exportados con nProbe. 25 Tabla 5 Descripción de las opciones usadas en nProbe. 25 Tabla 6 Librerías utilizadas. 26 Tabla 7 Parámetros del fichero de configuración. 29 Tabla 8 Tratamiento de las direcciones IP del tráfico. 29 Tabla 9 Diferentes indicadores. 30 Tabla 10 Indicador de aplicaciones. 36 Tabla 11 Indicador de ICMP. 36 Tabla 12 Indicador Puertos destino. 37 Tabla 13 Indicador Puertos destino. 37 Tabla 14 Indicador relación de las diferentes ip. 38 Tabla 15 Número total de ip destinos. 38 Tabla 16 Número total de las diferentes aplicaciones. 39 Tabla 17 Tabla principal de indicadores. 40 Tabla 18 Logs. 41 Tabla 19 Máquina virtualizaada con vmware. 43 Tabla 20 Resumen de los datos obtenidos por el sistema 58 Tabla 21 Fiabilidad de los indicadores 58 ÍNDICE DE FIGURAS Figura 1-1 Supervisión de matrices de tráficos ofrecidos en las redes. 1 Figura 1-2 Funcionamiento de Netflow 2 Figura 1-3 Ubicación en el modelo de capas OSI. 3 Figura 1-4 Panel de waffle.io 3 Figura 2-1 Definición de riesgo en los sistemas de información.[1] 7 Figura 2-2 Ataque Man In The Middle 8 Figura 2-3 Ataque de denegación de Servicios 9 Figura 2-4 Ramsonware 10 Figura 2-5 Modelo de red neuronal 11 Figura 2-6 Diferentes etapas de procesamiento de un paquete en la librería R&S®PACE 2 [9]. 11 Figura 2-7 Concepto de Firewall de aplicación. 12 Figura 2-8 Arquitectura de IDS según la metodología. 13 Figura 2-9 Logo de Snort 13 Figura 2-10 Gráfico de las vulnerabilidades en los últimos 5 años. 14 Figura 2-11 Vulnerabilidades por tipo [16]. 15 Figura 2-12 Información exportada a través de Netflow.[21] 17 Figura 2-13 Tráfico tunelado. 17 Figura 2-14 Identificación de patrones usando DPI. 18 Figura 2-15 Añadir protocolos en nDPI. 18 Figura 2-16 Ejemplo de algoritmo Aho-Corasick. [27] 19 Figura 2-17 Logo de wireshark. 19 Figura 2-18 Captura de paquetes con wireshark y nDPI. 20 Figura 2-19 certificados SSL. 20 Figura 2-20 Uso de nProbe. 21 Figura 3-1 Esquema general del sistema. 23 Figura 3-2 Ejemplo de exportación con nProbe. 24 Figura 3-3 Ejecución nProbe. 25 Figura 3-4 Logo de Python [34]. 26 Figura 3-5 Diseño del sistema. 27 Figura 3-6 Media móvil. 31 Figura 3-7 Forma de media exponencial móvil. 32 Figura 3-8 Diagrama funcional de la base de datos. 34 Figura 3-9 Tablas que componen la base de datos. 35 Figura 4-1 Ejecución nprobe para la prueba. 44 Figura 4-2 Carpeta con los ficheros de flujos IP. 45 Figura 4-3 Configuración inicial. 46 Figura 4-4 Ejecución del sistema programado. 46 Figura 4-5 Indicadores temporales. 47 Figura 4-6 Consulta de tabla aplicaciones. 47 Figura 4-7 Consulta tabla estadísticos. 48 Figura 4-8 Segunda consulta a tabla estadísticos. 48 Figura 4-9 Ejecución del script con tráfico malicioso. 48 Figura 4-10 Consulta de logs. 49 Figura 4-11 Consulta en logs de nuevos indicadores. 49 Figura 4-12 Evolución temporal del indicador App-Unknown 50 Figura 4-13 Evolución temporal indicador App-Unknown EMA(∝=𝟎.𝟏) 50 Figura 4-14 Evolución temporal indicador App-Unknown EMA(∝=𝟎.𝟑) 51 Figura 4-15 Evolución temporal del indicador Puertos_destino 51 Figura 4-16 Evolución temporal indicador Puertos_destino EMA( ∝ = 0.1) 52 Figura 4-17 Evolución temporal indicador Puertos_destino EMA(∝ = 0.3) 52 Figura 4-18 Evolución temporal del indicador Puertos_origen 53 Figura 4-19 Evolución temporal indicador Puertos_origen EMA( ∝ = 0.1) 53 Figura 4-20 Evolución temporal indicador Puertos_origen EMA(∝ = 0.3) 53 Figura 4-21 Evolución temporal del indicador num_app 54 Figura 4-22 Evolución temporal indicador num_app EMA( ∝ = 0.1) 54 Figura 4-23 Evolución temporal indicador num_app EMA(∝ = 0.3) 55 Figura 4-24 Evolución temporal del indicador Icmp_destino 55 Figura 4-25 Evolución temporal indicador Icmp_destino EMA(∝ = 0.1) 56 Figura 4-26 Evolución temporal indicador Icmp_destino EMA(∝ = 0.3) 56 Figura 4-27 Captura de tráfico de sondeo de la red con nmap 57 Figura A-0-1 instalación del proyecto. 63 Figura A-0-2 Error en la instalación. 63 Figura B-0-1 Carpeta tfg. 67 Figura B-0-2 Carpeta indicadores. 67 Figura B-0-3 Carpeta IP. 68 Figura B-0-4 Carpeta 1.1.1.1 68 Figura B-0-5 Carpeta indicador aplicaciones. 69 79 1 INTRODUCCIÓN Y OBJETIVOS 1.1 Introducción n una red se realizan múltiples conexiones y son en estas dónde podemos detectar diferentes intrusiones o softwares anómalos. Es por ello por lo que se realizan técnicas de tratamientos matriciales del tráfico. Dichas técnicas ofrecen la posibilidad de realizar estudios matemáticos con el fin de poder detectar anomalías en la información cursante de las redes. El gran número de vulnerabilidades existentes en las diferentes redes justifica la necesidad de un desarrollo continuo de sistemas capaces de llevar a cabo trabajos de detección de las mismas. Figura 1-1 Supervisión de matrices de tráficos ofrecidos en las redes. Un usuario que hace uso de dispositivos conectados a la red realiza una serie de acciones cotidianas que E Creo que los virus informáticos deberían contar como vida. Creo que dice bastante sobre nosotros el hecho de que la única forma de vida que hemos logrado crear sea puramente destructiva. Hemos creado vida basada en nuestra imagen. - Stephen Hawking- Introducción y objetivos 2 pueden ser clasificadas y guardadas como patrones de comportamiento. Sobre estos, pueden llevarse a cabo estudios y toma de decisiones para comprobar la existencia de anomalías. Las técnicas de detección de anomalías se basan en la clasificación y estudio de patrones. Cuando se identifica un patrón que contiene valores que difieren de su modelo, el sistema lo detectará como anómalo, por lo que, a posteriori, se realizará un trabajo de supervisión para comprobar si es un falso positivo o, si por lo contrario, se trata realmente de la detección de una anomalía. Cabe destacar que estos sistemas siempre suelen alertar de falsos positivos, por lo que es muy importante llevar a cabo un buen estudio previo sobre las condiciones de trabajo y así poder configurar e implantar un modelo acorde, tanto a las necesidades como a la escalabilidad y al entorno sobre el que se desea operar. En una red de datos existe un intercambio continuo de flujos. Por ello, en el presente trabajo se exponen modelos estadísticos, así como la clasificación del flujo para la posterior localización de anomalías. 1.2 Motivación Para la detección de anomalías es necesaria la manipulación de una inmensa cantidad de información, de modo que para su procesamiento es necesario el uso de modelos estadísticos adecuados. Resulta imprescindible realizar un estudio profundo de los paquetes que viajan por la red, pues esto permite obtener una información útil y su estudio posibilitará definir los comportamientos habituales de los usuarios. En la actualidad existen diferentes colectores que recogen la información que viaja por la red. En particular hablaremos de NetFlow, un protocolo de red diseñado para recolectar la información sobre tráfico IP, la cual hace posible la monitorización de las redes. Figura 1-2 Funcionamiento de Netflow Debido a las vulnerabilidades existentes en la red, gran parte del tráfico cursado se encuentra cifrado. Por ejemplo, un usuario hace uso de una aplicación web que utiliza el protocolo HTTPS (protocolo seguro de transferencia de hipertexto). Este es un protocolo de transferencia de datos de forma segura, es decir, el contenido que transporta se cifra y esto permite que si un atacante consiguiera hacerse con estos datos, dicho atacante, a priori, no podría interpretar la información substraída. 3 3 Detección de anomalías en los registros de tráfico ofrecidos por IPFIX Figura 1-3 Ubicación en el modelo de capas OSI. Debido a que el tráfico se transporta de forma cifrada resulta interesante realizar una inspección profunda de paquetes, para así poder identificar la aplicación que se encuentra detrás del tráfico cifrado. 1.3 Metodología de trabajo Para el desarrollo del presente trabajo se ha llevado a cabo la metodología de trabajo Scrum. En esta se recoge un conjunto de buenas prácticas para trabajar y llevar a cabo la realización de un proyecto. Esta metodología de trabajo se basa en la división del proyecto en una lista de pequeñas tareas ordenadas por prioridad y puntos de esfuerzos. Estas tareas pasan por distintas etapas hasta la finalización de las mismas. También se ha optado por el uso de GitHub como repositorio del proyecto. Esto hace posible que se pueda llevar un buen control de versiones y cambios en el software desarrollado. A través del siguiente enlace se puede acceder todo el trabajo subido en GitHub https://github.com/agularrom/TFG Para poder unificar GitHub y la metodología de trabajo se ha decidido trabajar con waffle. Se trata de una herramienta de uso libre que permite la planificación de un proyecto así como la sincronización del mismo en GitHub. Figura 1-4 Panel de waffle.io Figura 2-4 Ramsonware 2.2 Detección de anomalías en la red Actualmente existen numerosas aplicaciones, librerías y técnicas para lograr detectar anomalías en el tráfico circulante. Para llevar a cabo esta tarea es muy importante realizar modelos estadísticos de tráfico limpio, ya que un modelo incorrecto implica errores en la detección, pudiendo causar un alto número de falsos positivos o incluso la no detección de positivos. [5] 2.2.1 Redes neuronales Los sistemas inteligentes cada vez sirven más de ayuda para dar solución a problemas cotidianos en todos los campos. Por ejemplo, en el mundo de la ciberseguridad son muy importantes para la detección de anomalías. Actualmente, existen trabajos que hacen uso de redes neuronales para la predicción del tráfico [6], [7]. Esto se consigue a través del entrenamiento de un modelo neuronal del tráfico circulante en una red. Estos sistemas están formados por neuronas divididas en tres capas [8]:  Una primera capa de entrada que introduce los patrones al sistema.  Una segunda capa denominada como ‘capas ocultas’ que son formadas por neuronas interconectadas entre sí formando multicapas.  Por último, una tercera capa constituida por los valores de salidas del sistema. 11 Figura 2-5 Modelo de red neuronal 2.2.2 R&S®PACE 2 PACE es una librería software capaz de detectar múltiples aplicaciones y protocolos de red haciendo uso de diferentes técnicas de detección: [9]  Inspección profunda de paquetes.  Análisis de comportamiento heurístico y estadístico. Esta librería es capaz de detectar aplicaciones y extraer metadatos de tráfico cifrado. Para conseguir todo esto, el software realiza los siguientes pasos: 1. Preparación de los paquetes. 2. Reordenación de los paquetes. 3. Clasificación de paquetes. 4. Decodificación. 5. Tiempo de espera de manejo. Figura 2-6 Diferentes etapas de procesamiento de un paquete en la librería R&S®PACE 2 [9]. Gracias al uso de diferentes técnicas de detección, esta librería consigue minimizar falsos positivos y negativos en la detección. Después de las pruebas realizadas por parte de la empresa del software, la marca afirma la identificación del 95% del tráfico circulante en la red. [9] 2.2.3 Firewall de nivel de aplicación Los firewall han evolucionado mucho en los últimos años y ya son capaces de actuar en la capa de aplicación del modelo OSI. Este tipo de firewall evalúa la capa de aplicación en los paquetes antes de permitir una conexión. También lleva a cabo un seguimiento de las conexiones así como de la secuencia, lo que permite conseguir un buen control de las conexiones e imponer un impedimento a las aplicaciones no deseadas. Estos tipos de cortafuegos son conocidos como Proxy Firewall, ya que son capaces de examinar y evaluar contraseñas, así como solicitudes de servicios que se encuentran en los datos de la capa de aplicación. Aplican, por ejemplo, reglas de segmentación en protocolos tales como HTTP, FTP, Telnet, etc. También existe una variante de estos cortafuegos, denominados firewall DPI. Estos son los más sofisticados y pueden llegar a filtrar tipos de archivos específicos como XML o SOAP.[10] Aunque un firewall de aplicación proporciona bastante seguridad frente a un firewall clásico de filtrado de paquetes, este primero es más lento debido a que el procesamiento de los datos en el nivel de aplicación resulta más costoso. Esto provoca una escasa escalabilidad. [11] ConfigServer Security Firewall (CSF) sería un ejemplo de firewall de nivel de aplicación. Figura 2-7 Concepto de Firewall de aplicación. 2.2.4 IDS/IPS La mayoría de las empresas u organizaciones desean prevenir intrusiones en su red. Los cortafuegos evitan ataques con procedencia del exterior, pero cada vez son más frecuentes los ataques desde el interior de la red. Es por ello por lo que es tan importante la implantación de un sistema de detección de intrusos (IDS). Así como un sistema de prevención de intrusos (IPS) que una vez detecta y aprende un ataque, lo bloquea y 13 genera documentación del mismo. Los IDS detectan ataques aplicando diferentes metodologías [12], [13]:  Basado en firmas: o Realizan comparaciones de ataques con una base de datos de reglas o firmas. o Posee limitaciones a la hora de la detección de nuevos ataques. o Generación de logs.  Basado en anomalías: o Emplea un algoritmo de aprendizaje. o Posibilidad de detectar nuevos ataques con una probabilidad de acierto. o Generación de logs. Figura 2-8 Arquitectura de IDS según la metodología. Snort es un ejemplo claro de IDS que podemos encontrar en la actualidad. Tiene un motor de búsqueda y su metodología está basada en el análisis de firmas. Inspecciona el tráfico de red y permite la generación de alarmas. [14] Figura 2-9 Logo de Snort Snort funciona bajo licencia GPL, es decir, se trata de un software libre. Tiene la característica de ser multiplataforma, puesto que es posible ser ejecutado en Windows y UNIX/Linux. Asimismo, Snort lleva por defecto tanto reglas como patrones de vulnerabilidades y ataques ya conocidos e identificados. 2.2.5 Análisis y conclusiones Según los datos obtenidos por CVE Details [15] podemos observar un aumento de las vulnerabilidades encontradas en los últimos 5 años. Resulta interesante observar el gran aumento de vulnerabilidades que tuvo lugar en el año 2017 respecto al año anterior. Cabe señalar que, a pesar de que han disminuido las vulnerabilidades en el año actual (2018) respecto al año anterior, es cierto que aún siguen existiendo bastantes. Esto se debe a que, actualmente, existe un gran número de dispositivos y tecnologías en el mercado, los cuales amplían el abanico de opciones para la localización y clasificación de nuevas vulnerabilidades. Cabe señalar que a pesar de una pequeña minoría de vulnerabilidades en el año actual a la redacción del presente documento (2018) respecto al año 2017, aún siguen existiendo bastantes. Esto se debe al gran aumento de los diferentes dispositivos y tecnologías existentes en el mercado actual, los cuales hacen que sea de mayor envergadura el abanico de opciones para la localización y clasificación de nuevas vulnerabilidades. Tras analizar estos datos, resulta evidente el hecho de que es necesaria la investigación y el desarrollo de nuevos sistemas que consigan mitigar dichas brechas de seguridad. Por ello, existe un gran un número de organizaciones en los diferentes sectores, tanto públicos como privados, que trabajan e investigan para conseguir desarrollar nuevas técnicas para la detección y mitigación de las nuevas vulnerabilidades. En el siguiente gráfico se muestra una evolución temporal de las vulnerabilidades en los últimos 5 años. Figura 2-10 Gráfico de las vulnerabilidades en los últimos 5 años. Según CVE Details [16] existen 13 tipos de vulnerabilidades, de las cuales las más comunes son las de denegaciones de servicios y la ejecución de código malicioso. Debido a la gran variedad de vulnerabilidades, es muy importante el desarrollo de sistemas inteligentes capaces de detectar aplicaciones y datos no deseados. 0 2000 4000 6000 8000 10000 12000 14000 16000 2013 2014 2015 2016 2017 2018 Vulnerabilidades encontradas en los últimos 5 años Vulnerabilidades 15 Figura 2-11 Vulnerabilidades por tipo [16]. Después de la documentación y análisis de diferentes librerías de software para la detección de aplicaciones en tráfico de red, consideramos que nDPI puede ser la mejor opción. Existe un artículo [17] donde se discuten las diferentes librerías existentes y se puede observar como nDPI resulta ser la mejor, puesto que es una librería de software libre y, aunque a priori no es la librería que más aplicaciones puede detectar, se puede configurar como se desee para poder identificar protocolos y aplicaciones nuevas. Existe una librería comercial llamada PACE que detecta numerosas aplicaciones. Tanto nDPI como PACE se basan en una antigua librería llamada OpenDPI. Es cierto que en sus orígenes nDPI daba numerosos falsos positivos, pero tanto en las actualizaciones como en el desarrollo de nuevas versiones este problema ha sido mejorado considerablemente. A continuación se puede observar una comparativa de las librerías más famosas usadas en la actualidad. Nombre Versión Aplicaciones Software Libre PACE 2 2800 NO nDPI 2.4 185 SI L7-Filter [18] (May 2009) 110 SI NBAR2 [19] (Jun 2013) ~1000 NO Tabla 1 Comparativa de diferentes DPI. Como se ha mencionado anteriormente, los cortafuegos han sufrido un gran cambio en los últimos años. Por ello, resulta muy interesante realizar un análisis y comparativa de los diferentes enfoques que puede tener un firewall. En la tabla que aparece a continuación se puede observar una comparativa de los mismos. Funcionalidad Firewall clásico Firewall stateful Firewall Aplicación Firewall DPI Reglas básicas SI SI SI SI Reglas con relación entre paquetes NO SI SI SI Reglas de aplicación NO NO SI SI Eventos y logs SI SI SI SI Tabla 2 Comparativa de los diferentes cortafuegos. Para finalizar, se ha llevado a cabo un estudio de dos softwares muy usados en la actualidad para la implementación de sistemas de detección de intrusos (IDS). Cabe destacar que ambos poseen características muy similares. Tanto Snort como Suricata pueden usarse como sistemas de prevención de intrusos (IPS) para poder bloquear ataques en tiempo real. A continuación se muestra una comparativa de los softwares mencionados. Nombre Enfoque Software libre Registro de eventos Detección de aplicaciones Versión Multihilo Snort Basado en firmas SI SI SI 2.9.12 NO Suricata Basado en firmas SI SI SI 4.0.5 SI Tabla 3 Comparativa de diferentes IDS. 2.3 Generación de trazas de tráfico: IPFIX y Netflow. IPFIX proviene de las siglas en inglés IP Flow Information Export [20], el cual define un mecanismo estándar de exportación de datos sobre el flujo de red, tanto en conmutadores como en routers. Se puede definir como flujo de red un conjunto de paquetes IP pertenecientes a una misma conexión. La compañía CISCO Systems desarrolló en 1996 una tecnología con el fin de mejorar el encaminamiento de los routers. Esta tecnología denominada Netflow se basa en la identificación de los flujos establecidos entre distintos dispositivos para así poder agilizar el encaminamiento de paquetes IP. [21] Un flujo de datos se caracteriza por la combinación de diversos atributos en un intervalo de tiempo. Estos últimos suelen ser direcciones, puertos, protocolo identificado, servicio, así como la interfaz de entrada. 17 Figura 2-12 Información exportada a través de Netflow.[21] Cuando un router identifica un nuevo flujo, Netflow lo guarda junto a la interfaz de salida asociada al flujo. Esto hace que no sea necesario realizar consultas de encaminamiento para paquetes posteriores correspondientes al flujo, y que se consiga disminuir el coste computacional que implican las consultas a las tablas de encaminamiento. Una gran ventaja que provee esta característica es la posibilidad de realizar mediciones y caracterizaciones del tráfico cursante en tiempo real. Netflow es usado comúnmente para realizar análisis de la calidad del servicio a través de definiciones de métricas. Toda la información que exporta Netflow puede ser enriquecida a través de la inspección profunda de paquetes. 2.3.1 Inspección profunda de paquetes: DPI Las primeras técnicas usadas para la identificación y clasificación de flujos de red estaban basadas, en su mayoría, en el uso de puertos conocidos.[22] Es decir, se analizaban los encabezados de los paquetes para identificar un servicio en base al puerto. Por ejemplo, si llegaba tráfico asociado al puerto 80, dicho tráfico sería clasificado e identificado como HTTP. Este comportamiento presenta debilidades debido a que es impreciso. El tráfico cursante podría ir tunelado [23] consiguiendo así evitar reglas de un firewall. Figura 2-13 Tráfico tunelado. Según un artículo [22], menos del 30% del tráfico es clasificado correctamente haciendo uso de la identificación basada en puertos. Debido a esto, los sistemas han reemplazado la metodología basada en puertos por la inspección profunda de paquetes, consiguiendo así una gran mejora de la precisión. DPI consigue analizar la carga útil de un paquete y encontrar patrones que se identifiquen con un servicio. Cabe destacar, que este tratamiento puede llegar a ser muy costoso, por lo que los patrones son identificados por expresiones regulares, ya que así se consigue disminuir el coste computacional. Figura 2-14 Identificación de patrones usando DPI. Con este tratamiento los ISP [24] pueden proporcionar calidad de servicio a una aplicación en concreto, o realizar cobros según el servicio que se esté utilizando. Como ya se mencionó anteriormente, nDPI es una librería capaz de realizar inspección profunda de paquetes, programada en lenguaje C. Esta librería es multiplataforma, puesto que puede ser usada tanto en UNIX como en Windows. Aunque por defecto es capaz de detectar numerosas aplicaciones, es muy fácil añadir nuevos servicios que no se puedan identificar a priori. Consultando el manual [25] podemos observar un ejemplo de cómo añadir nuevos protocolos para que sean identificados en el flujo de red. Figura 2-15 Añadir protocolos en nDPI. Debido a que actualmente la mayoría de las conexiones se encuentran cifradas, nDPI contiene un decodificador SSL [26], el cual es capaz de extraer el nombre del host del certificado perteneciente al servidor. Esta información se añade a los metadatos del flujo de red, consiguiendo así ser identificado. La librería nDPI implementa el algoritmo de Aho-Corasick para encontrar patrones dentro de un texto con el fin de ser eficiente a la hora de analizar la carga útil de los paquetes circulantes en la red. Este algoritmo implementa un autómata similar a una estructura de datos de tipo árbol. A continuación se muestra un ejemplo del algoritmo cuando los patrones son: {a, ab, bc, bca, c, caa} 19 Figura 2-16 Ejemplo de algoritmo Aho-Corasick. [27] La característica más interesante que posee este algoritmo es la capacidad de poder buscar patrones de forma simultánea. Esta implementación es usada frecuentemente en el mundo de la ciberseguridad, para las bases de datos de virus, por ejemplo. Wireshark es un software usado para analizar protocolos y pasos de mensajes. Esta aplicación permite capturar todos los paquetes de una red con el fin de poder identificar problemas de configuración en las redes de comunicación. Figura 2-17 Logo de wireshark. Esta aplicación ha tenido gran importancia en el estudio realizado, puesto que ha sido utilizada para capturar el tráfico que será usado como entrada al sistema desarrollado. Wireshark posee la posibilidad de ser integrada junto con la librería nDPI en los sistemas UNIX. Esta nueva funcionalidad fue presentada en el SharkFest de 2017 [28]. Y permite la identificación de las aplicaciones en los paquetes capturados. Para hacer esto posible, es necesario descargar de github los ficheros ndpiReader.c junto a ndpi.lua. A continuación se muestra un ejemplo donde se ha capturado tráfico de Google y se puede comprobar cómo se ha añadido la información en el campo protocolo. Además, también se puede realizar filtros para mostrar sólo cierta aplicación. Un ejemplo sería: ndpi.protocol.name == HTTP.Google 3.4 Fase 3: Procesamiento de IPFIX Esta etapa es la más importante, debido a que es la parte central del estudio realizado. Hasta ahora los datos no se habían analizado para detectar anomalías en el tráfico de red. Es en esta fase donde se realiza el tratamiento de la información para la posterior toma de decisiones y detección de comportamientos anómalos. 3.4.1 Lenguaje de programación y librerías El lenguaje de programación utilizado para el desarrollo del trabajo ha sido Python [34], puesto que es el lenguaje más extendido y usado en el mundo de la ciberseguridad. Figura 3-4 Logo de Python [34]. Además, este lenguaje tiene la posibilidad de usar numerosas y útiles librerías que facilitan el trabajo del programador. En la tabla 6 podemos observar las principales librerías utilizadas para el desarrollo. Librería Descripción  Pandas [35] Esta librería permite el análisis de datos de forma eficiente. Ofrece diferentes estructuras de datos como son:  Data Frame.  Series.  Estructuras de datos multidimensionales.  Numpy [36] Destinada para poder realizar operaciones con matrices y vectores.  Datetime [37] Módulo que proporciona clases y objetos para la manipulación de horas y fechas.  Os [38] Permite ejecutar comandos propios del sistema operativo.  Sys [39] Proporciona variables y funcionalidades con el propio intérprete de Python.  mysql.connector [40] Permite la interacción con una base de datos MySQL.  math [41] Dota a Python de operaciones matemáticas.  shutil [42] Proporciona acceso y manipulación de documentos y directorios alojados en el sistema operativo.  ConfigParser [43] Permite el acceso de forma sencilla a ficheros de configuración.  Ipcalc [44] Permite realizar cálculos de subredes IP tanto en IPv4 como IPv6. Tabla 6 Librerías utilizadas. 27 3.4.2 Diseño del sistema En la figura 4-5 se muestra el diseño llevado a cabo para la implementación del sistema desarrollado. Figura 3-5 Diseño del sistema. 3.4.2.1 Diseño de los principals componentes del sistema. Lectura del fichero de configuración Descripción: Obtención de los parámetros definidos por el usuario. Para facilitar la comprensión al usuario, los parámetros se encuentran divididos en 4 secciones:  FECHA  BBDD  ESTADISTICAS  TRATAMIENTO Parámetro Sección Uso y opciones Fecha FECHA Define la fecha y hora que se desee asignar a los indicadores. Este parámetro por defecto es AUTO. En este valor la fecha y hora se asignan automáticamente. En caso de estar realizando pruebas o desarrollando, se puede asignar manualmente en el formato YYYYMMDDHH. Un ejemplo sería: 2018092117, que correspondería con el 21 de septiembre de 2018 a las 17:00. User BBDD Define el usuario miembro de la base de datos. Password BBDD Define la contraseña de la base de datos. Host BBDD Define la dirección IP donde se encuentra alojada la base de datos. Database BBDD Define el usuario miembro de la base de datos. Clean BBDD Si se desea limpiar la base de datos este valor deberá estar a TRUE, en caso contrario deberá estar a FALSE. Capacidad_ventana ESTADISTICAS Define el tamaño de las N últimas muestras que se tienen en cuenta en los cálculos matemáticos realizados. Coeficiente_error ESTADISTICAS Coeficiente de error para la toma de decisión. Normalmente este valor estará comprendido entre 2 y 4. Cuanto más pequeño sea este valor el sistema será más restrictivo. Aprendizaje ESTADISTICAS Este parámetro es muy importante, ya que cuando su valor es igual a TRUE, el sistema se encuentra en modo de aprendizaje. Es decir, el sistema se encuentra en modo de entrenamiento. Todos los datos de entrada serán clasificados como tráfico limpio y valdrán para realizar una modelización del tráfico. Cuando el parámetro se encuentra a FALSE el sistema evaluará todos los indicadores, generando alertas en caso de detectar anomalías. 29 Eliminar_anomalos ESTADISTICAS Si el parámetro se encuentra a TRUE, los valores que provoquen una alarma no se insertarán en la base de datos. Si por lo contrario, se desea que estos valores se inserten en base de datos, el parámetro deberá estar a FALSE. Alertas_nuevas ESTADISTICAS Si se encuentra a TRUE y se detecta un nuevo indicador, el sistema generará una alarma notificando el nuevo indicador. Si no se desea alertar de nuevos indicadores, el valor deberá estar a FALSE. Alpha ESTADISTICAS Parámetro de suavizado de los cálculos estadísticos, este valor suele estar comprendido entre 0.1 y 0.5 network TRATAMIENTO Define el rango de subred de direcciones IP que se desean tener en cuenta para el estudio. Un ejemplo de valor sería: 192.168.0.1/24 dónde se estarían indicando todas las IPs de la subred 192.168.0.1 con máscara 24. Tabla 7 Parámetros del fichero de configuración. Filtrar IPs no deseadas La información exportada en formato IPFIX puede contener flujos de direcciones IPs que no se desean tener en cuenta para el estudio. Es por ello por lo que las direcciones IP origen correspondientes a la subred definida en el parámetro network serán identificadas haciendo uso del campo “L7_PROTO” Este tratamiento se realiza para eliminar el tráfico de direcciones irrelevantes para el estudio así como para facilitar y simplificar el procesamiento de los datos. Tabla 8 Tratamiento de las direcciones IP del tráfico. Generación de indicadores En base al flujo IPFIX filtrado se crean los siguientes indicadores: Indicador Descripción Aplicaciones Recoge las diferentes aplicaciones detectadas en los flujos así como el número de veces que intervienen en ellos. ICMP-destino Muestra el número de veces que se han generados mensajes ICMP[45]. Este indicador puede alertar de ataques de denegación de servicios. IPdestino-origen Informa por cada IP destino el número de veces que se conecta con las diferentes IP origen. IPorigen-destino Informa por cada IP origen el número de veces que se conecta con las diferentes IP destino. Numero-APP Número de veces que aparece cada aplicación en el tráfico de la red. Numero-IP Número de IPs destino distintas. PuertosDestino Registro del número de puertos destino por cada IP origen. PuertosOrigen Registro del número de puertos origen por cada IP origen. Tabla 9 Diferentes indicadores. 31 3.4.3 Cálculo de los indicadores Para crear un modelo estadístico se parte de dos tipos de premisas: 1. Mediante cálculo de la media aritmética móvil[46] y varianza[47]: Figura 3-6 Media móvil. o Como se puede observar en la Figura 3-6, el cálculo realizado corresponde a una media móvil, debido a que se calcula el promedio de las últimas muestras. Este comportamiento se denomina ventana deslizante. Se ha implementado de esta forma para conseguir que el sistema pueda responder a lo largo del tiempo, ya que si no se implementa una ventana deslizante, llegaría un punto en el que la media no variaría y su resultado sería prácticamente constante. o La media aritmética o promedio cuya fórmula es: 𝑋 =1 𝑛∑𝑥𝑖 𝑛 𝑖=1  n Número de la capacidad de la ventana.  𝒙𝒊 Se denota como los valores que toma la variable. o La varianza es una medida de dispersión y la raíz cuadrada de la varianza nos permite calcular la desviación que posee cada indicador. A continuación se muestra la fórmula de la varianza: 𝜎2=1 𝑛∑(𝑥𝑖−𝑋 )2 𝑛 𝑖=1  n Número de la capacidad de la ventana.  𝒙𝒊 Se denota como los valores que toma la variable.  𝑿  Media de la variable. o Cuando se almacena un valor en un indicador, este es evaluado a través de la siguiente ecuación y, si no cumple la condición, el valor es clasificado como anómalo provocando la inserción de un log en la base de datos: 𝜖≤𝑘 × √𝜎2  𝝐 Se define como el error y se calcula de la siguiente manera: 𝜖=|𝑥𝑖−𝑋  |  𝒌 Corresponde con el coeficiente de error. (Este parámetro es configurable por el usuario a través del fichero de configuración). 2. Mediante cálculo de la media exponencial móvil y varianza exponencial móvil: o La media móvil exponencial[48] cuya fórmula es: 𝐸𝑀𝐴(𝑡)={ 𝑥1, 𝑡=1 𝛼×𝑥𝑖+(1−𝛼)×𝐸𝑀𝐴(𝑡−1), 𝑡>1 Figura 3-7 Forma de media exponencial móvil.  𝛼 Corresponde al parámetro de suavizado que puede valer entre 0 y 1.  𝑥𝑖 Valor en el instante t.  La EMA es usado comúnmente para las tendencias de los valores de mercado. Se ha optado por implementar este modelo estadístico debido a los buenos resultados que se obtienen cuando se evalúan indicadores. o La varianza exponencial cuya fórmula es: 𝜎2𝑒𝑥𝑝 =( 𝛼 2−𝛼)×𝜎2  𝛼 Parámetro de suavizado. 33  𝜎2 Valor de la varianza de todo el conjunto de muestras. o Al igual que en el caso anterior de media aritmética, en este también se toma decisiones en base a la siguiente fórmula y en caso de no cumplir la siguiente condicción, el tráfico será clasificado como anómalo provocando la inserción de un log en la base de datos: 𝜖≤𝑘 × √𝜎2𝑒𝑥𝑝  𝝐 Se define como el error y se calcula de la siguiente manera: 𝜖=|𝑥𝑖− 𝐸𝑀𝐴(𝑡)|  𝒌 Corresponde con el coeficiente de error. (Este parámetro es configurable por el usuario a través del fichero de configuración). 3.5 Fase 4: Base de datos Esta última etapa del sistema corresponde a la exportación a una base de datos de toda la información recolectada y procesada. Se ha utilizado MySQL[49] como sistema de gestor para la base de datos. 3.5.1 Diseño de la base de datos Figura 3-8 Diagrama funcional de la base de datos. La base de datos está compuesta por tablas auxiliares. Cada una de ellas contiene la información de un indicador. Por cada uno de ellos se realiza un cálculo matemático y el resultado se inserta en la tabla “estadísticos”. 35 Figura 3-9 Tablas que componen la base de datos. Cada vez que se realiza un cálculo se comprueba que el resultado está dentro del margen de confianza. En caso de no cumplir dicho margen el nuevo valor del indicador no será insertado en la tabla estadísticos, pero sí se insertará un registro en la tabla de logs. Si por lo contrario el valor sí se encuentra dentro del margen de confianza, dicho valor será insertado en la tabla de “estadísticos”. 3.5.1.1 Tablas auxiliares A continuación se detalla el diseño de cada una de las tablas auxiliares que alimentan a la tabla principal que contienen las estadísticas de cada indicador. Aplicaciones Descripción: Tabla que contiene el indicador de aplicaciones. Clave primaria:  ip  aplicacion  num_veces  fecha  hora Atributo Descripción ip Ip versión 4 origen del indicador. aplicacion Nombre de la aplicación identificada en un flujo. num_veces Número de flujos en los que se ha identificado la aplicación. fecha Fecha en formato YYYY-MM-DD al que corresponde el indicador. 79 4 PRUEBAS Y RESULTADOS ste capítulo se dedica a la descripción de las pruebas realizadas, en el cuál podremos encontrar casos reales de detecciones. También se exponen los resultados obtenidos, así como el software usado para la realización de las pruebas. 4.1 Descripción de software usado para la realización de las pruebas Para la realización de las pruebas se ha utilizado VMWare para virtualizar una máquina con las siguientes características: Máquina virtual  Memoria RAM 3 GB  Procesadores 8  Sistema Operativo Ubuntu 16.04.4 LTS Tabla 19 Máquina virtualizaada con vmware. 4.2 Pruebas realizadas A continuación se muestran los pasos llevados a cabo para la realización de las pruebas. Para facilitarle la comprensión al lector se pueden dividir de la siguiente forma: 1. Captación de los datos y exportación IPFIX. 2. Preparación del archivo de configuración. 3. Ejecución del script leer.py 4. Consultas tablas BBDD. 5. Errores. Para finalizar, nos centraremos en varios indicadores y se mostrará la evolución temporal para ver de una manera gráfica el comportamiento del sistema. E El ordenador nació para resolver problemas que antes no existían. - Bill Gates - 4.2.1 Captación de los datos y exportación IPFIX 4.2.1.1 Captura del tráfico Para la realización de la pruebas se ha capturado tráfico de forma local haciendo uso de un dispositivo y una máquina virtual durante 21 días. Para simplificar un poco, las capturas siempre han sido en la misma franja horaria entre las 12:00 y las 13:00 horas. Los días de capturas están comprendidos entre el 1 de Octubre de 2018 y 19 de Octubre de 2018. El tráfico capturado corresponde con el uso normal de un usuarario medio:  Navegación de diferentes páginas web  Diferentes consultas en Google  Accesos a diferentes redes sociales  Video en streaming  Música en streaming  Descarga de ficheros y documentos El sistema también se ha alimentado con tráfico malicioso los días 4, 7, 10 y 14 de octubre de 2018, con el fin de poder comprobar que es capaz de detetectar dicho tráfico.  Tráfico correspondiente al 4 de octubre de 2018: o Además del uso normal como el resto de días, se ha realizado dos ataques de denegación de servicios: 1. A través de un script que ejecuta múltiples veces el siguiente comando: ping <IP> -l 65500 -n 1 2. Se ha instalado la herramienta Hping3 que permite realizar diferentes ataques de tipo DoS. En este caso particular se ha ejecutado el siguiente comando: hping3 -- rand-source --flood <IP> Este comando permite la generación continua de paquetes ICMP con una dirección origen falsa.  Tráfico correspondiente al 7 de octubre de 2018: o Además del uso normal como el resto de días, se ha realizado un nmap a través del siguiente comando: nmap -T4 -A -v <IP>  Tráfico correspondiente al 10 de octubre de 2018: o Además del uso normal como el resto de días, se ha realizado un nmap de sondeo de la red a través del siguiente comando: nmap -sP 192.168.0.*  Tráfico correspondiente al 14 de octubre de octubre de 2018: o Al tráfico de uso normal se le ha añadido tráfico malicioso relacionado con el virus Troyano[50][51]. 4.2.1.2 IPFIX En este paso ejecutamos nProbe pasándole por parámetro el archivo de captura de tráfico. Figura 4-1 Ejecución nprobe para la prueba. 45 Como se puede observar en la Figura 4-1. Le pasamos a nProbe el archivo de captura de tráfico 01.pcapng. Nprobe creará un fichero en formato IPFIX con la información de los flujos IP en la carpeta indicada de nombre flujo. Figura 4-2 Carpeta con los ficheros de flujos IP. A cada hora nuestro sistema capturara tráfico y realizará este paso, creando un fichero de flujos IP en formato IPFIX a cada hora. En la Figura 4-2 se puede observar como el sistema ha creado diferentes ficheros. 4.2.2 Preparación del archivo de configuración Antes de la ejecución del sistema será necesario definir las configuraciones globales, tal y como se puede ilustrar en la Figura 4-3. Primero se debe definir el rango de la subred sobre la que se va a realizar el estudio a través del parámetro network. En este ejemplo la subred sería 192.168.0.0/24 Como es la primera vez que va a ser ejecutado, es muy importante que se defina la variable aprendizaje a valor TRUE. Esto le indica al sistema que se encuentra en modo aprendizaje y que debe tomar los datos que va a procesar para crear un modelo estadístico de tráfico limpio. En este paso es muy importante alimentar al sistema con un buen conjunto de datos, debido a que si no es así, el modelo estadístico será muy deficiente y no tomará buenas decisiones en base al tráfico. Para este ejemplo se ha definido una ventana de tamaño 3, por lo que no resultaría coherente desactivar el modo aprendizaje hasta tener, almenos, 3 exportaciones IPFIX. Cuando el sistema ha sido alimentado y se tienen suficientes datos se desactivará el modo aprendizaje definiendo la variable aprendizaje a valor FALSE. Una vez desactivado este modo, activaremos la generación de alertas nuevas. Esto permite la reportación de un log cuando se ha identificado un indicador que no se encuentra en el modelo estadístico. Cabe destacar que mientras el sistema no se encuentra en modo aprendizaje este sigue aprendiendo con el tiempo. Esto se debe a que el modelo estadístico se crea a través de una ventana deslizante, por lo que los valores de los diferentes indicadores se actualizan con el tiempo. Figura 4-3 Configuración inicial. 4.2.3 Ejecución del script Después de haber finalizado con la configuración, se ejecuta el script del sistema programado. Como se muestra en la Figura 4-4 al script hay que indicarle el fichero de flujo que debe procesar. En este ejemplo se le indica que procese el fichero 01.flows ubicado en la carpeta flujos. Figura 4-4 Ejecución del sistema programado. Después de la ejecución del script se habrán creado ficheros en texto plano en la carpeta indicadores con los diferentes indicadores tal y como se muestra en la Figura 4-5. Estos ficheros son temporales y son creados dinámicamente en cada ejecución del script. 47 Figura 4-5 Indicadores temporales. 4.2.4 Consultas tablas BBDD Después de la ejecución del script deberían existir registros en las tablas de base de datos. Para ello realizamos una consulta en la tabla del indicador aplicaciones y otra en tabla de estadísticos: Figura 4-6 Consulta de tabla aplicaciones. Como se puede observar en la Figura 4-6 en el tráfico circulante en la red se han identificado 23 aplicaciones distintas y 4 de los flujos han sido categorizados como desconocido. Esto resulta ser interesante, ya que si se obtienen numerosas muestras de aplicación desconocida, podríamos estar ante una detección de tráfico malicioso. A continuación en la Figura 4-7 se muestra la consulta (*) de la tabla de estadísticos: Figura 4-7 Consulta tabla estadísticos. (*) NOTA: Debido a la gran dimensión de la tabla se ha tenido que mostrar sólo una parte. Como se observa en la Figura 4-7 los indicadores sólo tienen una muestra, por lo que la varianza tiene valor cero. En la Figura 4-8 se muestra la misma consulta realizada en la Figura 4-7, pero ahora el sistema ha sido alimentado con una segunda captura de tráfico. Figura 4-8 Segunda consulta a tabla estadísticos. Como podemos observar ahora las columnas 5 y 9 que corresponden respectivamente con la varianza y la varianza exponencial poseen valores diferentes a cero. Los valores de esta tabla serán más cercanos a la realidad cuanto mayor sea el número de muestras con la que se alimente al sistema. Si tenemos muy pocos datos, los valores de los indicadores presentarán mucha dispersión, por lo que el sistema no obtendrá buenas decisiones. 4.2.5 Errores Cuando se tienen varias capturas y el sistema posee datos suficientes, desactivamos la variable aprendizaje del archivo configuración y ejecutamos el script pasándole trafico malicioso para verificar que el sistema funciona. Figura 4-9 Ejecución del script con tráfico malicioso. 49 En la Figura 4-10 realizamos una consulta a la tabla de logs para verificar si el sistema ha generado alguna detección en los indicadores. Figura 4-10 Consulta de logs. Como se puede observar, el subindicador Unknown del indicador Aplicaciones ha sido clasificado como tráfico malicioso, tanto en el test de la media móvil como el de la media exponencial móvil. En esta prueba el indicador ha obtenido un valor 30120, esto significa que ha habido 30120 flujos IP que nProbe ha clasificado como desconocido. En base a este resultado podemos afirmar que el sistema funciona correctamente. En ocasiones tendremos casos de indicadores nuevos que no se han tenido en cuenta en la fase de aprendizaje del modelo, por lo que resulta interesante la generación de un log que muestre cuándo ocurren estos casos. Para ello activaremos la variable alertas_nuevas a valor TRUE del fichero de configuración para dotar al sistema de este comportamiento. Para verificar el funcionamiento de esta característica, no tendremos en cuenta los siguientes indicadores en la fase de aprendizaje:  Facebook.  YouTube.  Dropbox.  Skype. Accederemos a Facebook, YouTube, Dropbox y Skype mientras capturamos el tráfico para poner a prueba el modelo y comprobar si es capaz de realizar la detección y categorizarlos como nuevos. Figura 4-11 Consulta en logs de nuevos indicadores. Como se muestra en la Figura 4-11 se puede verificar como, efectivamente, el sistema ha detectado y reportado los nuevos indicadores marcándolos como NUEVO. 4.2.6 Indicador Aplicaciones-Unknown Este subindicador de aplicaciones corresponde al número de flujos marcados como aplicación desconocida. Como vimos anteriormente, este indicador es clave para la detección de anomalías. Es por ello por lo que es seleccionado para realizar las pruebas sobre el Sistema y verificar el funcionamiento del mismo. Figura 4-12 Evolución temporal del indicador App-Unknown Como se puede observar en la Figura 4-12 los días 7 y 14 obtenemos un incremento considerable de la media móvil y la desviación típica del indicador, por lo que el sistema lo detecta y reporta una anomalía en tal indicador. También resulta interesante fijarse en el comportamiento del sistema definiendo la capacidad de la ventana a 3. Se observa cómo el sistema tiene en cuenta las últimas 3 muestras. Figura 4-13 Evolución temporal indicador App-Unknown EMA(∝=𝟎.𝟏) 0 10000 20000 30000 40000 50000 60000 12345678910111213141516171819 Valor del indicador Día App-Unknown.muestra App-Unknown.mean App-Unknown.stdv*2+mean App-Unknown.stdv*3+mean Media móvil (Capacidad_ventana=3) 0 5000 10000 15000 20000 25000 30000 35000 12345678910111213141516171819 Valor del indicador Día App-Unknown.muestra App-Unknown.mean App-Unknown.stdv*2+mean App-Unknown.stdv*3+mean EMA (Alpha=0,1) 51 Figura 4-14 Evolución temporal indicador App-Unknown EMA(∝=𝟎.𝟑) En la Figura 4-13 y en la Figura 4-14 se muestra la evolución temporal del cálculo de la media exponencial móvil del indicador App-Unknown. A través de este gráfico podemos apreciar la importancia del parámetro Alpha. Cuanto mayor sea el valor de este parámetro, más se acercará el valor de la EMA a la última muestra del indicador. En este caso, hemos obtenido detección de anomalías en los días 7, y 14 cuando Alpha tiene valor 0.3. En cambio, cuando Alpha tiene valor 0.1 se obtiene detección en los días 3, 7 y 14. 4.2.7 Indicador Puertos_destino Este indicador corresponde con el número total de puertos destinos abiertos por una misma dirección IP. Figura 4-15 Evolución temporal del indicador Puertos_destino En este indicador obtenemos detección de anomalía en los días 7 y 16 de octubre. Por lo que tenemos falsos positivos el 16 de octubre, este comportamiento se debe a que dichos días hubo un incremento del tráfico capturado. 0 5000 10000 15000 20000 25000 30000 35000 12345678910111213141516171819 Valor del indicador Día App-Unknown.muestra App-Unknown.mean App-Unknown.stdv*2+mean App-Unknown.stdv*3+mean EMA (Alpha=0,3) 0 200 400 600 800 1000 1200 1400 1600 12345678910 11 12 13 14 15 16 17 18 19 Valor del indicador Día Puertos_destino.muestra Puertos_destino.mean Puertos_destino.stdv*2+mean Puertos_destino.stdv*3+mean Media móvil (Capacidad_ventana=3) 13 Bueno 14 Malo Alerta 15 Bueno 16 Bueno Alerta Alerta 17 Bueno 18 Bueno 19 Bueno Tabla 20 Resumen de los datos obtenidos por el sistema Para calcular la fiabilidad del sistema se definen los siguientes conceptos y fórmulas:  Tasa de detección: 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑎𝑡𝑎𝑞𝑢𝑒𝑠 𝑑𝑒𝑡𝑒𝑐𝑡𝑎𝑑𝑜𝑠 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑎𝑡𝑎𝑞𝑢𝑒𝑠 𝑟𝑒𝑎𝑙𝑒𝑠 𝑥 100 (%)  Tasa de falsos positivos: 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑓𝑎𝑙𝑠𝑜𝑠 𝑝𝑜𝑠𝑖𝑡𝑖𝑣𝑜𝑠 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 𝑑𝑒 𝑎𝑐𝑡𝑖𝑣𝑖𝑑𝑎𝑑 𝑛𝑜𝑟𝑚𝑎𝑙 𝑥 100 (%)  Accuracy: 𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑎𝑐𝑖𝑒𝑟𝑡𝑜𝑠 𝑁ú𝑚𝑒𝑟𝑜 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 𝑥 100 (%) App-Unknown Puertos_destino Icmp_destino CD(Tasa de detección) 50% 25% 25% TFP(Tasa de falsos positivos) 7,14% 7,14% 7,14% Accuracy 84,21% 78,95% 78,95% Tabla 21 Fiabilidad de los indicadores 79 5 CONCLUSIONES Y LÍNEAS FUTURAS espués de la investigación llevada a cabo para el estudio realizado, se procede a la exposición de las conclusiones obtenidas en base a los resultados obtenidos. También se aportarán ideas para las posibles futuras mejoras que podrían complementar la presente investigación. 5.1 Conclusiones Tras la investigación y desarrollo llevado a cabo en el presente trabajo, se puede afirmar que se han cumplido los siguientes objetivos fijados:  Se han investigado y probado en profundidad las diferentes tecnologías, aplicaciones y métodos útiles para la detección de anomalías en el tráfico de red.  Investigación de distintas amenazas posibles de vulnerabilidades en la red.  Comparativa de las diferentes tecnologías.  Creación de indicadores que permitan modelar el tráfico de red.  Generación de logs.  Desarrollo de un sistema con capacidad de aprendizaje de patrones de comportamiento en una red para la detección de vulnerabilidades.  El software desarrollado es completamente configurable para el usuario. Es escalable y se adapta a diferentes volúmenes de tráfico.  Profundizaje en el lenguaje Python, el más usado en el mundo de la ciberseguridad.  Instalación y configuración de un escenario real para la validación de pruebas. En base a las pruebas y resultados obtenidos se puede llegar a la conclusión de que el sistema desarrollado funciona correctamente. Se obtienen logs cuando se alimenta al sistema con tráfico malicioso. Analizando la Tabla 20 y tabla 21 se puede llegar a la conclusión de que el sistema posee una buena capacidad de detección, aunque las probabilidades de éxitos podrían verse mejoradas significativamentes poniendo el sistema a prueba en un escenario real, puesto que el tráfico de entrada sería de dimensiones apropiadas para poder tener valores de indicadores con suficiente consistencia. Cabe destacar que el sistema desarrollado es un mecanismo de defensa, el cual permite la detección de posibles nuevas vulnerabilidades que puedan comprometer el buen funcionamiento de una red. Esto es muy importante en la actualidad, pues como hemos visto en la investigación del estado del arte, cada año se obtienen registros de nuevas vulnerabilidades y sistemas como el desarrollado en este estudio, pueden detectar y conseguir así la mitigación de riesgos. D Estudia el pasado si quieres definir el futuro. - Confucio - 94 El sistema desarrollado también podría ser utlizado para monitorizar el tráfico que circula por la red y así poder controlar los accesos de los usuarios de la red. 5.2 Líneas futuras Debido a que el presente trabajo se trata de una primera investigación en la detección de vulnerabilidades existen posibles líneas de mejora que permitirían el avance de la investigación y desarrollo:  Unificar indicadores similares para evitar tener un gran número y así reducir falsos positivos en la detección.  Realizar un estudio similar haciendo uso de redes neuronales.  Realizar comparativa con sistemas que hagan uso de redes neuronales.  Trabajar directamente con la base de datos para reducir el tiempo computacional que implica la generación de ficheros de forma dinámica.  Creación de un dashboard tipo web con la posibilidad de poder configurar el sistema de forma fácil e intuitiva para el usuario.  Combinar el sistema desarrollado con firewall para conseguir un sistema que detecta y corta las posibles nuevas vulnerabilidades.  Añadir nuevas aplicaciones a la librería nDPI para aumentar el abanico de detecciones de aplicaciones.  Diseñar un sistema intermedio de captación del tráfico de forma automatizada y completamente configurable por el usuario  Poner en funcionamiento el sistema sobre una red industrial para poder realizar estudios de fiabilidad del sistema.  Extender el concepto de detecciones de anomalías a través de modelado estadístico a otros campos, como podría ser por ejemplo en las redes eléctricas. 77 79 REFERENCIAS [1] incibe (Instituto Nacional de Ciberseguridad), “Amenaza vs Vulnerabilidad, ¿sabes en qué se diferencian? | INCIBE,” 2017. [Online]. Available: https://www.incibe.es/protege-tu- empresa/blog/amenaza-vs-vulnerabilidad-sabes-se-diferencian. [Accessed: 29-Oct-2018]. [2] P. K. Pateriya and S. S. Kumar, “Analysis on Man in the Middle Attack on SSL,” Int. J. Comput. …, vol. 45, no. 23, pp. 43–46, 2012. [3] R. G. Wiliam, “Trujillo_2016,” p. 177, 2016. [4] INCIBE, “Ransomware: una guía de aproximación para el empresario,” p. 25, 2017. [5] M. Barrionuevo, M. Lopresti, N. Miranda, and F. Píccoli, “red usando imágenes y técnicas de Computación de Alto Desempeño .,” pp. 1166–1175. [6] N. Stivet, T. Álvarez, and L. F. Pedraza, “Redes neuronales y predicción de tráfico Neural networks and prediction of traf fic,” Edición Espec., vol. 15, no. 29, pp. 90–97, 2011. [7] Anonymous, “Detecting Anomalies in Communication Packet Streams Based on Generative Adversarial Networks,” Neuropsychology, vol. 58, no. 6, pp. 1151–1161, 2006. [8] P. Larrañaga, I. Inza, and A. Moujahid, “Tema 8. Redes Neuronales,” Researchgate, p. 19, 2015. [9] R&S, “R & S ® PACE 2 Solution Guide Contents.” [10] T. Firewalls, “Firewalls industriales DPI ¿ Qué es un firewall industrial DPI ? Firewalls industriales DPI,” pp. 1–5. [11] J. J. Dougherty, “Interested in learning more ? In sti tu Au th re ns f rig,” Style (DeKalb, IL), no. Security 401, 2011. [12] E. De La Hoz, E. M. De La Hoz, A. Ortiz, and J. Ortega, “Modelo de detección de intrusiones en sistemas de red, realizando selección de características con FDR y entrenamiento y clasificación con SOM,” Inge Cuc, vol. 8, no. 1, pp. 85–116, 2012. [13] E. Arias, “Instituto Politécnico Nacional,” Cic.Ipn.Mx, pp. 1–80, 2010. [14] L. R. M, “Snort como herramienta administrativa,” no. 5, pp. 74–78. [15] cvedetails, “CVE security vulnerability database. Security vulnerabilities, exploits, references and more,” 2018. [Online]. Available: https://www.cvedetails.com/. [Accessed: 01-Nov-2018]. [16] “Vulnerability distribution of cve security vulnerabilities by types.” [Online]. Available: https://www.cvedetails.com/vulnerabilities-by-types.php. [Accessed: 01-Nov-2018]. [17] L. Deri, M. Martinelli, and A. Cardigliano, “nDPI: Open-Source High-Speed Deep Packet Inspection.” [18] sourceforge, “L7-filter Supported Protocols.” [Online]. Available: http://l7- filter.sourceforge.net/protocols. [Accessed: 01-Nov-2018]. [19] P. Bulletin, “NBAR2 Protocol Library,” pp. 1–47, 2013. [20] R. Hofstede et al., “Flow Monitoring Explained: From Packet Capture to Data Analysis With NetFlow and IPFIX,” IEEE Commun. Surv. Tutorials, vol. 16, no. 4, pp. 2037–2064, 2014. [21] M. De, “Monitorización de una red académica mediante Netflow 1.” [22] R. Antonello et al., “Deep packet inspection tools and techniques in commodity platforms: Challenges and trends,” J. Netw. Comput. Appl., vol. 35, no. 6, pp. 1863–1878, 2012. [23] “Túnel (informática) - Wikipedia, la enciclopedia libre.” [Online]. Available: https://es.wikipedia.org/wiki/Túnel_(informática). [Accessed: 04-Nov-2018]. [24] concepto.de, “¿Qué es ISP?” [Online]. Available: https://concepto.de/isp/. [Accessed: 05-Nov-2018]. 94 [25] E. Lgplv, D. Packet, and I. Library, “nDPI - Quick Start Guide,” no. October, pp. 1–15, 2016. [26] P. Kocher, “Internet Engineering Task Force (IETF) A. Freier Request for Comments: 6101 P. Karlton Category: Historic Netscape Communications,” 2011. [27] A. V. Aho and M. J. Corasick, “Efficient string matching: an aid to bibliographic search,” Commun. ACM, vol. 18, no. 6, pp. 333–340, Jun. 1975. [28] L. Deri SharkFest, “#sf17eu • Estoril, Portugal How to rule the world… by looking at packets! Turning Wireshark into a Traffic Monitoring Tool: Moving from packet details to the big picture.” [29] ntop.org, “nProbe documentation — nProbe 8.5 documentation.” [Online]. Available: https://www.ntop.org/guides/nProbe/. [Accessed: 07-Nov-2018]. [30] http://www.tcpdump.org, “Manpage of TCPDUMP.” [Online]. Available: http://www.tcpdump.org/manpages/tcpdump.1.html. [Accessed: 07-Nov-2018]. [31] “Secure Copy - Wikipedia, la enciclopedia libre.” [Online]. Available: https://es.wikipedia.org/wiki/Secure_Copy. [Accessed: 07-Nov-2018]. [32] web.mit.edu, “Protocolo SSH.” [Online]. Available: https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg- es-4/ch-ssh.html. [Accessed: 07-Nov-2018]. [33] wikipedia, “Valores separados por comas - Wikipedia, la enciclopedia libre.” [Online]. Available: https://es.wikipedia.org/wiki/Valores_separados_por_comas. [Accessed: 07-Nov-2018]. [34] Elvis Pranskevichus, “What’s New In Python 3.7 — Python 3.7.1 documentation.” [Online]. Available: https://docs.python.org/3/whatsnew/3.7.html. [Accessed: 08-Nov-2018]. [35] “pandas: powerful Python data analysis toolkit Release 0.23.4 Wes McKinney & PyData Development Team,” 2018. [36] “Guide to Numpy : Travis E. Oliphant : Free Download, Borrow, and Streaming : Internet Archive.” [Online]. Available: https://archive.org/details/NumPyBook/page/n25. [Accessed: 08-Nov-2018]. [37] “8.1. datetime — Basic date and time types — Python 2.7.15 documentation.” [Online]. Available: https://docs.python.org/2/library/datetime.html. [Accessed: 08-Nov-2018]. [38] “os — Miscellaneous operating system interfaces — Python 3.7.1 documentation.” [Online]. Available: https://docs.python.org/3/library/os.html. [Accessed: 08-Nov-2018]. [39] “28.1. sys — System-specific parameters and functions — Python 2.7.15 documentation.” [Online]. Available: https://docs.python.org/2/library/sys.html. [Accessed: 08-Nov-2018]. [40] “MySQL Connector/Python Developer Guide.” [41] “math — Mathematical functions — Python 3.7.1 documentation.” [Online]. Available: https://docs.python.org/3/library/math.html. [Accessed: 08-Nov-2018]. [42] “10.10. shutil — High-level file operations — Python 2.7.15 documentation.” [Online]. Available: https://docs.python.org/2/library/shutil.html. [Accessed: 08-Nov-2018]. [43] “configparser — Configuration file parser — Python 3.7.1 documentation.” [Online]. Available: https://docs.python.org/3/library/configparser.html. [Accessed: 08-Nov-2018]. [44] “Wijnand Modderman-Lenstra,” 2017. [45] M. U. Y. Valiosa, “CURSO DE TCP / IP : ICMP ( Protocolo de Mensajes de Control de Internet ).” [46] E. W. Weisstein and E. W. Weisstein, “Media aritmética,” MathWorld. [47] wikipedia, “Varianza - Wikipedia, la enciclopedia libre.” [Online]. Available: https://es.wikipedia.org/wiki/Varianza. [Accessed: 15-Nov-2018]. [48] R. G. Brown, Exponential Smoothing for Predicting Demand. Cambridge, Massachusetts: Arthur D. Little Inc., 1956. [49] “MySQL 8.0 Reference Manual - Including MySQL NDB Cluster 8.0.” 77 [50] kaspersky, “Qué es un virus troyano | Amenazas de seguridad en Internet | Kaspersky Lab ES.” [Online]. Available: https://www.kaspersky.es/resource-center/threats/trojans. [Accessed: 16-Jan- 2019]. [51] “Public PCAP files for download.” [Online]. Available: https://www.netresec.com/?page=pcapfiles. [Accessed: 22-Jan-2019]. 79 ANEXO A: INSTALACIÓN DEL PROYECTO  Script de instalación del proyecto: Ejecutamos el script de instalación del proyecto, si no ha habido ningún error el script deberá mostrar YES en todas los pasos realizados. Figura A-0-1 instalación del proyecto. En caso de que ocurra algún error en un paso del script, la instalación se para y muestra ERROR en dicho paso. Figura A-0-2 Error en la instalación. 1. #!/bin/bash 2. # 3. # @Autor: Agustín Walabonso Lara Romero 4. # @Descripción: Instalación del proyecto 5. # 6. 7. ################################################# 8. # Actualización de los paquetes # 9. ################################################# 10. sudo apt-get update -y 11. 12. ################################################# 13. # Instalación de MySQL # 14. ################################################# 15. sudo apt-get install mysql-server -y 16. if [ $? = 0 ] 17. then 18. echo -e "Instalacion mysql-server: \e[92mYES\e[0m" 19. else 20. echo -e "Instalacion mysql-server: \e[0;31mERROR\e[0m" 21. exit 0 22. fi 23. 24. ################################################# 25. # Creación de las tablas de la base de datos # 26. ################################################# 79 ANEXO D: FICHERO DE CONFIGURACIÓN 1. 2. # Fichero de configuraciones globales del programa 3. 4. # Configuraciones de la fecha y hora 5. # en la que se realiza el estudio. 6. # Si se desea que la fecha y hora corresponda 7. # con el archivo de captura realizado, se debera 8. # poner el valor AUTO, en cambio si se desea asignar una hora 9. # y fecha, debe ser en el formato: yyyymmddhh por ejemplo, 10. # 10 de Marzo de 2018 a las 14:00 -> 2018031014 11. [FECHA] 12. fecha = 2018041013 13. 14. # Configuraciones sobre la Base de datos 15. [BBDD] 16. user = wala 17. password = wala 18. host = localhost 19. database = tfg 20. clean = TRUE 21. 22. # Configuraciones llevadas a cabo en las estadisticas 23. # y comportamiento del sistema 24. [ESTADISTICAS] 25. capacidad_ventana = 3 26. coeficiente_error = 3 27. aprendizaje = TRUE 28. eliminar_anomalos = FALSE 29. alertas_nuevas = TRUE 30. alpha = 0.3 31. 32. # Red sobre la que se desea monitorizar 33. [TRATAMIENTO] 34. network = 192.168.0.0/24 79 ANEXO D: CÓDIGO SCRIPT PYTHON 1. """ 2. Importaciones de Librerias necesarias 3. """ 4. import pandas as pd 5. import numpy as np 6. from datetime import datetime, date, time, timedelta 7. import os 8. import sys 9. import json 10. import mysql.connector 11. import math 12. import shutil 13. import ConfigParser 14. import ipcalc as ipc 15. 16. """ 17. Parametros obtenidos por el fichero de configuracion 18. ubicado en configuraciones/configuraciones.conf 19. """ 20. pd.options.mode.chained_assignment = None # default='warn' 21. config = ConfigParser.ConfigParser() 22. config.read('configuraciones/configuraciones.conf') 23. fecha = str(config.get('FECHA', 'fecha')) 24. usuario = str(config.get('BBDD', 'user')) 25. password = str(config.get('BBDD', 'password')) 26. host = str(config.get('BBDD', 'host')) 27. database = str(config.get('BBDD', 'database')) 28. clean = str(config.get('BBDD', 'clean')) 29. capacidad_ventana = int(config.get('ESTADISTICAS', 'capacidad_vent ana')) 30. coeficiente_error = int(config.get('ESTADISTICAS', 'coeficiente_er ror')) 31. alpha = float(config.get('ESTADISTICAS', 'alpha')) 32. aprendizaje = str(config.get('ESTADISTICAS', 'aprendizaje')) 33. eliminar_anomalos = str(config.get('ESTADISTICAS', 'eliminar_anoma los')) 34. alertas_nuevas = str(config.get('ESTADISTICAS', 'alertas_nuevas')) 35. network = str(config.get('TRATAMIENTO', 'network')) 36. 37. def calculaFecha(flow_start): 38. """ 39. Funcion que calcula y devuelve la fecha y hora a la que 40. se ha realizado una captura de flujo IP 41. Parametros: 42. flow_start -- milisegundos transcurridos desde la fecha 1 de julio de 1970 43. a las 01:02:03.123456. 44. (Este parametro es sumado a la fecha mencionada anteriormente 45. y asi poder calcular la fecha y hora de la captura realizada) 46. """ 47. dia_wireshark = datetime.strptime('1970-01-01 01:02:03.123456', '%Y-%m-%d %H:%M:%S.%f') 94 48. dia_wireshark = dia_wireshark + timedelta(milliseconds=flow_start) 49. return str(dia_wireshark.strftime('%Y%m%d%H')) 50. 51. def calcula_var_exp(alpha, varianza): 52. """ 53. Funcion que calcula y devuelve la varianza exponencial 54. Parametros: 55. alpha -- Factor de suavizado para el calculo de la varianza 56. varianza -- Valor de la varianza sobre la que se realiza el 57. siguiente calculo: (varianza_exp = (alpha / (2 - alpha)) * varianza) 58. """ 59. varianza_exp = (alpha / (2 - alpha)) * varianza 60. return varianza_exp 61. 62. def calcula_ema(alpha, lista): 63. """ 64. Funcion que calcula y devuelve la esperanza exponencial 65. Parametros: 66. alpha -- Factor de suavizado para el calculo de 67. la esperanza exponencial 68. lista -- Conjunto de valores sobre la que se realiza 69. el siguiente calculo de la esperanza exponencial: 70. (alpha * lista[i] + (1 - alpha) * EXP[i - 1]) 71. 72. """ 73. ema = [] 74. if(len(lista) > 0): 75. ema.append(lista[0]) 76. for i in range(1, len(lista)): 77. ema.append(alpha * lista[i] + (1 - alpha) * ema[i - 1]) 78. return ema[len(ema) - 1] 79. 80. def insertarBaseDatosIndicadores(carpeta, tabla, colum_name): 81. """ 82. Funcion que inserta valores en base de datos 83. de los distintos indicadores 84. Parametros: 85. carpeta -- Ubicacion de la carpeta donde se encuentra el 86. indicador que se desea insertar en base de datos 87. tabla -- Nombre de la tabla donde se desea insertar 88. los valores del indicador 89. colum_name -- Nombre de la columna de la tabla donde se desea 90. insertar los valores del indicador 91. 92. """ 93 93. 94. if len(os.listdir(carpeta)) > 1: 95. cnx = mysql.connector.connect(user = usuario, pass word = password, host = host, database = database) 96. cursor = cnx.cursor() 97. ficheroIP_aux = carpeta + '/' + os.listdir(carpeta)[0] 98. 99. if 'FicherosProcesados' in ficheroIP_aux: 100. ficheroIP_aux = carpeta + '/' + os.listdir(carpeta)[1] 101. ficheroIP = open(ficheroIP_aux,'r') 102. lines = ficheroIP.readlines() 103. 104. if(lines[0] != 'NO SE ENCUENTRA LA IP'): 105. fecha_aux = lines[0] 106. fecha = fecha_aux[0:8] 107. hora = fecha_aux[8:] 108. ip = lines[1].rstrip('\n') 109. i=0 110. ayuda_indicador = '' 111. 112. if tabla == 'puertos_destino': 113. ayuda_indicador = 'D ' 114. elif tabla == 'puertos_origen': 115. ayuda_indicador = 'O ' 116. elif tabla == 'icmp_destino': 117. ayuda_indicador = 'I ' 118. for linea in lines: 119. if(i >= 2): 120. linea_aux = linea.split(' ') 121. indicador = ayuda_indicado r + linea_aux[0] 122. num_veces = linea_aux[len( linea_aux) - 1] 123. cursor.execute('INSERT INTO ' + tabla + ' VALUES ("' + ip + '", "' + indicador + '", ' + num_veces + ', ' + fecha + ', ' + hora + ')') 124. cnx.commit() 125. i += 1 126. calcularIndicadores(ip, tabla, colum_name, hora, fecha) 127. ficheroIP.close() 128. os.system('cat ' + ficheroIP_aux + ' >> ' + carpeta + '/FicherosProcesados/Historico') 129. os.system('rm ' + ficheroIP_aux) 130. cursor.close() 131. cnx.close() 132. 133. def generarAlerta(ip, nuevoIndicador, indicador, fecha, hora, medi a, varianza, media_anterior, varianza_anterior, nuevo_valor, media_exp, media_exp_anterior, varianza_exp, varianza_exp_anterior): 134. """ 135. Funcion que evalua el valor de un indicador a traves de dos metodos, la media movil exponencial 136. y la media movil. 137. En caso de que el sistema no este en modo aprendizaje y el valor exceda los estandares predefinido 138. se insertara una alerta en la base de datos de la tabla de nombre logs. 94 139. Parametros: 140. ip -- Direccion IP correspondiente al indicador 141. nuevoIndicador -- Bandera que vale uno cuando aun no existe ningun resgistro para el indicador 142. indicador -- Nombre del indicador 143. fecha -- Fecha en formato YYYYMMDD que corresponde al indicador 144. hora -- Hora en formato HH que corresponde al indicador 145. media -- Calculo de la media del indicador 146. incluyendo la ultima muestra 147. varianza -- Calculo de la varianza del indicador 148. incluyendo la ultima muestra 149. media_anterior -- Calculo de la media del indicador 150. NO incluyendo la ultima muestra 151. varianza_anterior -- Calculo de la varianza del indicador 152. NO incluyendo la ultima muestra 153. nuevo_valor -- Valor de la ultima muestra del indicador 154. media_exp -- Calculo de la media exponencial movil del indicador 155. incluyendo la ultima muestra 156. media_exp_anterior -- Calculo de la media exponencial movil del indicador 157. NO incluyendo la ultima muestra 158. varianza_exp -- Calculo de la varianza exponencial movil del indicador 159. incluyendo la ultima muestra 160. varianza_exp_anterior -- Calculo de la varianza exponencial movil del indicador 161. N O incluyendo la ultima muestra 162. 163. """ 164. 165. rellenar = True 166. cnx = mysql.connector.connect(user = usuario, password = p assword, host = host, database = database) 167. cursor = cnx.cursor() 168. 169. if media_anterior == None: 170. media_anterior = media 171. varianza_anterior = varianza 172. media_exp_anterior = media_exp 173. varianza_exp_anterior = varianza_exp 174. 175. if nuevoIndicador and aprendizaje == 'TRUE' and alertas_nu evas == 'TRUE': 176. cursor.execute('INSERT INTO logs VALUES ("' + ip + '", ' + str(fecha) + ', ' + str(hora) + ', "NUEVO", "' + indicador + '", ' + str(nuevo_valor) + ')') 93 177. else: 178. error = abs(nuevo_valor - media_anterior) 179. error_exp = abs(nuevo_valor - media_exp_anterior) 180. if error > coeficiente_error * math.sqrt(varianza_anterior) and aprendizaje == 'FALSE': 181. cursor.execute('INSERT INTO logs VALUES ("' + ip + '", ' + str(fecha) + ', ' + str(hora) + ', "ERROR", "' + indicador + '", ' + str(nuevo_valor) + ')') 182. rellenar = False 183. if error_exp > coeficiente_error * math.sqrt(varianza_exp_anterior) and aprendizaje == 'FALSE': 184. cursor.execute('INSERT INTO logs VALUES ("' + ip + '", ' + str(fecha) + ', ' + str(hora) + ', "ERROR_EXP", "' + indicador + '", ' + str(nuevo_valor) + ')') 185. rellenar = False 186. cnx.commit() 187. cnx.close() 188. return rellenar 189. 190. def rellenarBaseDatosEstadisticos(ip, indicador, hora, media, vari anza, fecha, nuevo_valor, num_muestras, media_exp, varianza_exp): 191. """ 192. Funcion que rellena la tabla Estadisticos, la cual contiene todos los indicadores con 193. los calculos estadisticos realizados. 194. Parametros: 195. ip -- Direccion IP correspondiente al indicador 196. indicador -- Nombre del indicador 197. hora -- Hora en formato HH que corresponde al indicador 198. media -- Calculo de la media del indicador 199. incluyendo la ultima muestra 200. varianza -- Calculo de la varianza del indicador 201. incluyendo la ultima muestra 202. fecha -- Fecha en formato YYYYMMDD que corresponde al indicador 203. nuevo_valor -- Valor de la ultima muestra del indicador 204. num_muestras -- Numero de muestras del indicador 205. media_exp -- Calculo de la media exponencial movil del indicador 206. incluyendo la ultima muestra 207. varianza_exp -- Calculo de la varianza exponencial movil del indicador 208. incluyendo la ultima muestra 209. """ 210. rellenar = True 211. cnx = mysql.connector.connect(user = usuario, password = p assword, host = host, database = database) 212. cursor = cnx.cursor() 213. cursor.execute('SELECT media FROM estadisticos WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND indicador = "' + indicador + '"' + ' order by fecha desc limit 1') 214. media_anterior = cursor.fetchone() 94 215. cursor.execute('SELECT varianza FROM estadisticos WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND indicador = "' + indicador + '"' + ' order by fecha desc limit 1') 216. varianza_anterior = cursor.fetchone() 217. cursor.execute('SELECT media_exp FROM estadisticos WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND indicador = "' + indicador + '"' + ' order by fecha desc limit 1') 218. media_exp_anterior = cursor.fetchone() 219. cursor.execute('SELECT varianza_exp FROM estadisticos WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND indicador = "' + indicador + '"' + ' order by fecha desc limit 1') 220. varianza_exp_anterior = cursor.fetchone() 221. if media_anterior is None or varianza_anterior is None: 222. generarAlerta(ip, True, indicador, fecha, hora, me dia, varianza, None, None, nuevo_valor, media_exp, media_exp_anterior, varianza_exp, varianza_exp_anterior) 223. cursor.execute('INSERT INTO estadisticos VALUES ("' + ip + '", "' + indicador + '", ' + str(hora) + ', ' + str(media) + ', ' + str(varianza) + ', ' + str(fecha) + ' ,' + str(num_muestras) + ' ,' + str(media_exp) + ' ,' + str(varianza_exp) + ')') 224. else: 225. rellenar = generarAlerta(ip, False, indicador, fec ha, hora, media, varianza, media_anterior[0], varianza_anterior[0], nue vo_valor, media_exp, media_exp_anterior[0], varianza_exp, varianza_exp_ anterior[0]) 226. if rellenar : 227. cursor.execute('INSERT INTO estadisticos VALUES ("' + ip + '", "' "'"+ indicador +"'" '", ' + str(hora) + ', ' + str(media) + ', ' + str(varianza) + ', ' + str(fecha) + ' ,' + str(num_muestras) + ' ,' + str(media_exp) + ' ,' + str(varianza_exp) + ')') 228. cnx.commit() 229. cursor.close() 230. cnx.close() 231. return rellenar 232. 233. def calcularIndicadores(ip, tabla, indicador, hora, fecha): 234. """ 235. Funcion que extrae los datos de las tablas auxiliares para 236. llevar a cabo el calculo de los indicadores. 237. Parametros: 238. ip -- Direccion IP correspondiente al indicador 239. tabla -- Nombre de la tabla donde del indicador 240. hora -- Hora en formato HH que corresponde al indicador 241. fecha -- Fecha en formato YYYYMMDD que corresponde al indicador 242. """ 243. eliminar_registro = False 244. cnx = mysql.connector.connect(user = usuario, password = p assword, host = host, database = database) 245. cursor = cnx.cursor() 246. cursor.execute('SELECT DISTINCT ' + indicador + ' FROM ' + tabla + ' WHERE ip="' + ip + '"') 247. Indicadores=cursor.fetchall() 248. for indicador_aux in Indicadores: 249. cursor.execute('SELECT num_veces FROM ' + tabla + ' WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND ' + indicador 93 + ' = "' + indicador_aux[0] + '" order by fecha desc limit '+ str(capacidad_ventana) +'') 250. num_veces = cursor.fetchall() 251. flat_list = [item for sublist in num_veces for ite m in sublist] 252. cursor.execute('SELECT num_veces FROM ' + tabla + ' WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND ' + indicador + ' = "' + indicador_aux[0] + '" order by fecha desc ') 253. num_veces_exp = cursor.fetchall() 254. flat_list_exp = [item for sublist in num_veces_exp for item in sublist] 255. flat_list_exp.reverse() 256. ema = calcula_ema(alpha, flat_list_exp) 257. varianza_exp = calcula_var_exp(alpha, np.var(flat_ list)) 258. cursor.execute('SELECT num_veces FROM ' + tabla + ' WHERE ip= "' + ip + '" AND hora=' + str(hora) + ' AND ' + indicador + ' = "' + indicador_aux[0] + '" order by fecha desc limit 1') 259. nuevo_valor = cursor.fetchone()[0] 260. eliminar_registro = rellenarBaseDatosEstadisticos( ip, indicador_aux[0], hora, np.mean(flat_list), np.var(flat_list), fech a, nuevo_valor, len(flat_list), ema, varianza_exp) 261. if eliminar_registro == False and aprendizaje == ' FALSE' and eliminar_anomalos == 'TRUE': 262. cursor.execute('DELETE FROM ' + tabla + ' WHERE ' + indicador + '='+ "'" + indicador_aux[0] +"'" ' AND hora=' + str(hora) + ' AND fecha=' + str(fecha) + ' AND ip="' + ip + '"') 263. 264. cursor.close() 265. cnx.close() 266. 267. def crearCarpetaIp(carpeta, ipFiltrado, indicador): 268. """ 269. Funcion que crea dinamicamente una carpeta 270. que contiene la informacion de un indicador 271. Parametros: 272. carpeta -- Nombre de la carpeta 273. ipFiltrado -- Direccion IP asociado al indicador 274. indicador -- Nombre del indicador 275. """ 276. if (os.path.isdir( carpeta ) == False): 277. os.makedirs('Indicadores/IP/' + ipFiltrado + '/' + indicador + '/FicherosProcesados') 278. os.system('touch Indicadores/IP/' + ipFiltrado + '/' + indicador + '/FicherosProcesados/Historico') 279. 280. def buscaLinea(palabra, fichero): 281. """ 282. Funcion que busca una palabra en un fichero 283. y en caso de existir, devuelve el numero de linea 284. en el que se encuentra 285. Parametros: 286. palabra -- Palabra que se desea buscar 287. fichero -- Nombre del fichero en el que se busca la coincidencia 288. """ 289. linea = 0 290. for line in fichero : 291. if 'Destino:\t' + palabra in line or 'Origen:\t' + palabra in line: 94 555. IPs_destino = df2.IPV4_DST_ADDR.unique() 556. num_IPs = len(IPs_destino) 557. file.write('\n------------------------------\n') 558. file.write('IP Origen:\t' + ip + '\n') 559. file.write('DISTINTAS' + ' ' + str(num_IPs)) 560. file.write('\n------------------------------') 561. 562. file.close() 563. os.system('sed -i "/dtype:/d" Indicadores/Numero-IP') 564. os.system('sed -i "/\.\./d" Indicadores/Numero-IP') 565. 566. fichero = '/home/anonymus/Escritorio/tfg/Indicadores/Numer o-IP' 567. ficheroNumIP = '/home/anonymus/Escritorio/tfg/Indicadores/ IP/' + ipFiltrado + '/'+ 'Numero-IP' + '/' + fecha 568. crearCarpetaIp('Indicadores/IP/' + ipFiltrado + '/'+ 'Numero-IP', ipFiltrado, 'Numero-IP') 569. tratamientoIP(ipFiltrado,fichero,ficheroNumIP) 570. insertarBaseDatosIndicadores('/home/anonymus/Escritorio/tf g/Indicadores/IP/'+ ipFiltrado + '/'+ 'Numero-IP', 'num_ip', 'ip_aux') 571. 572. def mostrarNumApp(df, ipFiltrado): 573. """ 574. Funcion que genera el fichero del indicador de Aplicaciones 575. y llama a las diferentes funciones para la generacion de numero 576. aplicaciones distintas en la base de datos 577. 578. Parametros: 579. 580. df -- DataFrame del indicador de aplicaciones 581. ipFiltrado -- Direccion IP asociada al indicador 582. """ 583. 584. file = open('/home/anonymus/Escritorio/tfg/Indicadores/Num ero-APP','wr') 585. file.write('############################################## ##################\n') 586. file.write('# Descripcion: Numero de APLICACIONES distintas #\n') 587. file.write('# Fecha: '+ fecha +' #\n') 588. file.write('############################################## ##################\n\n') 589. 590. for ip in df.IPV4_SRC_ADDR.unique(): 591. df2 = df[df.IPV4_SRC_ADDR == ip] 592. aplicaciones = df2.L7_PROTO_NAME.unique() 593. num_app = len(aplicaciones) 594. file.write('\n------------------------------\n') 595. file.write('IP Origen:\t' + ip + '\n') 596. file.write('APLICACIONES' + ' ' + str(num_app) ) 597. file.write('\n------------------------------') 598. 599. file.close() 600. os.system('sed -i "/dtype:/d" Indicadores/Numero-APP') 601. os.system('sed -i "/\.\./d" Indicadores/Numero-APP') 602. 93 603. fichero = '/home/anonymus/Escritorio/tfg/Indicadores/Numer o-APP' 604. ficheroNumApp = '/home/anonymus/Escritorio/tfg/Indicadores /IP/' + ipFiltrado + '/'+ 'Numero-APP' + '/' + fecha 605. crearCarpetaIp('Indicadores/IP/' + ipFiltrado + '/'+ 'Numero-APP', ipFiltrado, 'Numero-APP') 606. tratamientoIP(ipFiltrado,fichero,ficheroNumApp) 607. insertarBaseDatosIndicadores('/home/anonymus/Escritorio/tf g/Indicadores/IP/'+ ipFiltrado + '/'+ 'Numero- APP', 'num_app', 'aplicacion') 608. 609. def limpiarbaseDatos(): 610. """ 611. Funcion que limpia la base de datos 612. """ 613. cnx = mysql.connector.connect(user = usuario, password = p assword, host = host, database = database) 614. cursor = cnx.cursor() 615. cursor.execute('DELETE FROM aplicaciones;') 616. cursor.execute('DELETE FROM puertos_origen;') 617. cursor.execute('DELETE FROM puertos_destino;') 618. cursor.execute('DELETE FROM relacion_ip;') 619. cursor.execute('DELETE FROM num_ip;') 620. cursor.execute('DELETE FROM num_app;') 621. cursor.execute('DELETE FROM icmp_destino;') 622. cursor.execute('DELETE FROM estadisticos;') 623. cursor.execute('DELETE FROM logs;') 624. cnx.commit() 625. cnx.close() 626. 627. # Lectura del fichero en bruto de IPFIX 628. ficheroFlujos = sys.argv[1] 629. df = pd.read_csv(ficheroFlujos) 630. 631. #Comprobacion de rango de subred para cada IP 632. lista_ip_filtrado = [] 633. for ip in df['IPV4_SRC_ADDR'].unique(): 634. if ip in ipc.Network(network): 635. lista_ip_filtrado += [ip] 636. 637. if lista_ip_filtrado: 638. # Identificacion de todas las IP internas a la IP 1.1.1.1 en el campo L7_PROTO 639. df['L7_PROTO'][df['IPV4_SRC_ADDR'].isin(lista_ip_filtrado) ] = '1.1.1.1' 640. df = df[(df.L7_PROTO == '1.1.1.1')] 641. 642. # Obtencion de la fecha inicio de IPFIX 643. vacio = True 644. if len(df) > 0: 645. inicio = df.FLOW_START_MILLISECONDS.unique()[0] 646. vacio = False 647. if fecha == 'AUTO': 648. fecha = calculaFecha(inicio) 649. dia = datetime.strptime(fecha, '%Y%m%d%H') 650. dia = dia.weekday() 651. 652. if vacio == False: 653. # En caso de que la fecha en la que se reciben datos es festivo, el sistema 654. # no procesara nada 655. if dia < 5: 94 656. 657. if clean == 'TRUE': 658. limpiarbaseDatos() 659. print 'Limpieza Base de datos OK' 660. 661. for ipFiltrado_aux in lista_ip_filtrado: 662. mostrarIpPuertosOrigen(df, ipFiltrado_aux) 663. mostrarIpPuertosDestino(df, ipFiltrado_aux ) 664. mostrarAplicaciones(df, ipFiltrado_aux) 665. mostrarIPoIPd(df, ipFiltrado_aux) 666. mostrarIPdIPo(df, ipFiltrado_aux) 667. mostrarDestinoICMP(df, ipFiltrado_aux) 668. mostrarNumIpDistintas(df, ipFiltrado_aux) 669. mostrarNumApp(df, ipFiltrado_aux) 670. mostrarDataset(df, ipFiltrado_aux) 671. else: 672. print 'DIA FESTIVO'