Proyecto Fin de Carrera 3. 3.1. Departamento de Ingenierı́a Telemática nDPI Vista general del proyecto En este apartado se va a explicar la organización interna del proyecto, es decir, se van a explicar los ficheros y directorios que obtenemos al realizar el clone del servidor remoto. Una vez realizado el clone, lo que nos encontramos es lo siguiente: [ root@redBorder−S t r o n g h o l d redBorder−ndpi ]# l s fwboot nDPI http . c NDPI−README i n s t a l l −redBorder−S t r o n g h o l d . sh patch i n s t a l l −t r a f f i c g e n . t x t PROYECT README iptables −1.4.7 redBorder−ndpi−s o u r c e . sh linux −2.6.32 −431.11.2. el6 . i686 El directorio iptables-1.4.7 contiene las fuentes de iptables modificadas para el proyecto redBorder-ndpi. Es importante mencionarlo puesto que se requieren las fuentes de iptables para adaptar la herramienta del espacio de usuario al nuevo contexto de Netfilter. El directorio linux-2.6.32-XXXX contiene las fuentes del kernel especificada por la versión XXXX ası́ como las modificaciones del core de Netfilter que dan soporte a las nuevas capacidades. El directorio nDPI contiene las fuentes de la herramienta de inspección profunda a nivel de aplicación con las modificaciones pertinentes. Además de modificar tanto el espacio de usuario y el espacio del kernel ha sido preciso modificar el funcionamiento del helper de ndpi para iptables de acuerdo al contexto a nivel de aplicación nuevo. El directorio fwboot contiene ficheros de configuración de reglas de iptables, ficheros de configuración y scripts para automatizar el servicio redBorder-ndpi en el arranque del sistema. El directorio patch contiene el parche para la versión del kernel modificada ası́ como los módulos adicionalmente requeridos para el correcto funcionamiento de Netfilter tras la modificación intrusiva. El script install-redBorder-Stronghold.sh permite instalar las fuentes del kernel, parchearlo y actualizar los módulos de Netfilter. De esta manera, el sistema estarı́a preparado para cargar redBorder-ndpi. Es el script que debe ejecutarse para instalar el servicio completo. El script redBorder-ndpi-source.sh permite recrear las condiciones de desarrollo en el sistema. Este script solamente debe usarse cuando se quiera volver a tareas de desarrollo y en ningún caso para instalar el servicio. El fichero http.c es un fichero modificado del proyecto nDPI que resuelve conflictos con librerı́as y definiciones antiguas. La explicación detallada de los problemas resueltos se detalla en el fichero adjunto NDPI-README. Por último, el fichero PROYECT README es un fichero que da una visión global del proyecto, explica el contenido y la función de todos los elementos involucrados y sirve de guı́a para la correcta instalación del servicio. 47 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática Centrándonos en la herramienta de inspección en capa 7, nDPI, lo que vemos es lo siguiente: [ root@redBorder−S t r o n g h o l d nDPI]# l s a c l o c a l . m4 i n s t a l l −sh AUTHORS l i b n d p i . pc ChangeLog l i b n d p i . pc . i n config . guess libtool config .h l t m a i n . sh config . h . in m4 config . log Makefile config . status M a k e f i l e . am c o n f i g . sub Makefile . in configure missing c o n f i g u r e . ac ndpi− n e t f i l t e r COPYING NEWS decomp README example README. ntop INSTALL src i n s t a l l n d p i . sh stamp−h1 En este proyecto dentro del proyecto redBorder-ndpi, me compete la autorı́a del script install ndpi.sh y las modificaciones sobre el helper para iptables que se encuentran en el directorio ndpi-netfilter. El script de instalación, ası́ como el proceso de instalación completo, serán analizados en profundidad en el siguiente apartado. Por ahora, vamos a mostrar simplemente las caracterı́sticas más importantes del proyecto nDPI de la misma forma en la que se han expuesto para el proyecto redBorder-ndpi. El script install ndpi.sh instala en el sistema las capacidades de inspección profunda a nivel de aplicación que nos proporciona nDPI, ası́ como el helper de iptables modificado para el nuevo contexto de Netfilter. En el directorio src se encuentran verdaderamente las fuentes de nDPI. Cabe destacar que existe una lista, tal y como se introdujo en el apartado de presentación de nDPI, con los ficheros fuente que realizan la detección de los distintos protocolos a nivel de aplicación. El directorio ndpi-netfilter contiene las fuentes del helper para iptables de la herramienta nDPI. Además contiene las modificaciones sobre esta herramienta de usuario para adaptarla al nuevo contexto de Netfilter. 48 Proyecto Fin de Carrera 3.2. Departamento de Ingenierı́a Telemática Instalación Para la instalación de las capacidades de inspección profunda a nivel de aplicación que proporciona nDPI está pensado el script install ndpi.sh. En este apartado vamos a ver parcialmente el contenido de dicho script pero vamos a ir explicando detalladamente la razón y el sentido de cada orden ejecutada por la consola en lugar de exponer el script directamente. Para ver el resultado final de dicho script se puede consultar la sección 12.3 install ndpi.sh. En primer lugar, hay que instalar las dependencias necesarias para poder compilar nDPI [ root@redBorder−S t r o n g h o l d nDPI]# yum i n s t a l l unzip , z i p , g c c n c u r s e s −d e v e l , i p t a b l e s −d e v e l , k e r n e l −d e v e l , l i b m l n −d e v e l , automake , l i b t o o l , l i b t o o l −l t d l −d e v e l Lo siguiente serı́a descargar las fuentes de nDPI, pero como ya disponemos de ellas pasamos a la instalación de la herramienta. Para ello vamos a alojar las fuentes del proyecto en la ruta /usr/src/ para poder trabajar con ellas: [ root@redBorder−S t r o n g h o l d redBorder−ndpi ]# cp −R . . / redBorder−ndpi / u s r / s r c / [ root@redBorder−S t r o n g h o l d nDPI]# cd / u s r / s r c / redBorder−ndpi /nDPI [ root@redBorder−S t r o n g h o l d nDPI]# . / c o n f i g u r e −−with−p i c −−p r e f i x =/opt / rb / −−s b i n d i r =/opt / rb / b i n / −−exec−p r e f i x =/opt / rb [ root@redBorder−S t r o n g h o l d nDPI]# make [ root@redBorder−S t r o n g h o l d nDPI]# make i n s t a l l Llegados a este punto tenemos en el sistema instalada la herramienta de inspección a nivel de aplicación pero no está relacionada de ninguna manera con el helper de Netfilter iptables. En el estado actual del sistema se pueden hacer llamadas a funciones en C que invoquen la detección en capa 7. Esto tal cual nos es de poca utilidad puesto que lo que se pretende es dar al administrador de la red las facilidades de configurar el firewall a partir de las reglas iptables. Haciendo uso de esa necesidad se incorpora al proyecto nDPI otro proyecto de autorı́a distinta al equipo de ntop y que puede encontrarse fácilmente en GitHub [36] ”heil/ndpi-netfilter” que es a su vez un fork del proyecto original de construcción del helper ndpi. Se tomó el proyecto ”heil/ndpi-netfilter” [36] porque era el fork más reciente probado sobre versiones del kernel 2.6.32. En el siguiente apartado se va a mostrar una visión general del proyecto ndpi-netfilter, de la misma manera que se ha hecho con el proyecto redBorder-ndpi y con el proyecto nDPI, y se va a explicar paso a paso el proceso de instalación para conseguir integrar el helper de iptables dentro del proyecto nDPI, y por tanto dentro de redBorder-ndpi. 49 Proyecto Fin de Carrera 3.3. Departamento de Ingenierı́a Telemática Integración del helper Antes de proceder con la instalación del helper de iptables para ndpi y de probar su funcionamiento, vamos a explicar brevemente la estructura del proyecto en ndpi-netfilter. Haciendo un ”ls” del directorio ndpi-netfilter: [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# l s AUTHORS k e r n e l −patch COPYING Makefile INSTALL README ipt src El directorio ipt contiene el código fuente del helper ndpi para iptables, ”libxt ndpi.c” y un Makefile que permite compilarlo. Es la implementación del espacio de usuario del módulo ndpi para Netfilter. El directorio src contiene las fuentes del helper a bajo nivel, es decir en el espacio del kernel, que realizan llamadas a las funciones ndpi de las que se dispone para realizar la inspección en capa de aplicación. El fichero ”main.c” implementa la integración entre espacio de usuario (libxt ndpi.c) y el módulo ndpi en el espacio del kernel (llamadas al código fuente ndpi) de Netfilter. Incluye además librerı́as y un Makefile que permite la compilación. En el esqueleto del proyecto que implementa el helper ndpi se puede apreciar un detalle que será muy recurrente en lo que resta de memoria. La distinción entre espacio de usuario y espacio del kernel en el core de Netfilter va a suponer el grueso de este proyecto fin de carrera y la principal complejidad a la hora de construir el firewall de aplicación. El proceso de instalación de ndpi-netfilter es algo más laborioso que el proceso de instalación de nDPI. La instalación del helper supone la mitad del script ”install ndpi.sh” el cual puede ser visto en su totalidad en la sección 12.3 install ndpi.sh. Lo primero que debemos hacer, como siempre, es alojar las fuentes en el directorio /usr/src/. En este caso ya están alojadas puesto que el proyecto redBorder-ndpi ya tiene incluido ndpinetfilter en nDPI. Lo siguiente es copiar el fichero http.c del repositorio en la ruta donde se encuentran las detecciones de todos los protocolos de aplicación contemplados e irnos al directorio raı́z del proyecto ndpi-netfilter: [ root@redBorder−S t r o n g h o l d ]# cp −R p r o j e c t / redBorder−ndpi / h t t p . c / u s r / s r c /nDPI/ s r c / l i b / p r o t o c o l s [ root@redBorder−S t r o n g h o l d ]# cd / u s r / s r c /nDPI/ ndpi− n e t f i l t e r A continuación procedemos a compilar el helper con una particularidad. El proyecto ndpinetfilter está pensado para utilizar los Makefile del proyecto nDPI y compilar el helper recompilando parte del código fuente nDPI. Por ello, la llamada al Makefile se realiza desde el raı́z ndpi-netfilter al raı́z nDPI: 50 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# LANG=C NDPI PATH=/u s r / s r c / redBorder−ndpi /nDPI make Copiamos la librerı́a dinámica resultante en el directorio de librerı́as de iptables y copiamos el módulo xt ndpi generado en el directorio /lib/modules/KERNEL VERSION/extra. [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# cp −R i p t / l i b x t n d p i . s o / l i b / x t a b l e s [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# cp −R s r c / x t n d p i . ko . u n s i g n e d / l i b / modules /KERNEL VERSION/ e x t r a / x t n d p i . ko La ruta donde se deja el módulo xt ndpi es una ruta que en la resolución de dependencias automática se consulta previamente a consultar los módulos por defecto del sistema. Está pensado para cargar modificaciones y extensiones del sistema operativo a nivel de módulos del kernel priorizando la funcionalidad extra sobre la funcionalidad por defecto. Las librerı́as estáticas suelen estar en el mismo directorio o directorios cercanos al código fuente, mientras que una librerı́a dinámica está pensada para que un programa sin necesidad de incorporar las librerı́as de forma local pueda hacer uso de las funciones que quedan extraı́das en el fichero .so. De esta manera, un módulo del kernel del core de netfilter podrı́a hacer uso de las funciones de npdi sin necesidad de modificar a nivel de código las librerı́as de las que depende directamente. A continuación procedemos a la resolución automática de dependencias: [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# depmod −a Comprobamos que el módulo se ha insertado correctamente: [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# modprobe x t n d p i Reiniciamos el servicio iptables: [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# service iptables restart 51 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática Y por último comprobamos que el helper ndpi está correctamente integrado: [ root@redBorder−S t r o n g h o l d ndpi− n e t f i l t e r ]# i p t a b l e s −m ndpi −−h e l p . . . [ ! ] −−v e r s i o n −V p r i n t package v e r s i o n ndpi match o p t i o n s : −−f t p Match f o r FTP p r o t o c o l p a c k e t s −−pop Match f o r POP p r o t o c o l p a c k e t s −−snmp Match f o r SNMP p r o t o c o l p a c k e t s −−imap Match f o r IMAP p r o t o c o l p a c k e t s −−dns Match f o r DNS p r o t o c o l p a c k e t s −−i p p Match f o r IPP p r o t o c o l p a c k e t s −−h t t p Match f o r HTTP p r o t o c o l p a c k e t s . . . −−r a d i u s Match f o r Radius p r o t o c o l p a c k e t s −−teamviewer Match f o r Teamviewer p r o t o c o l p a c k e t s −−sap Match f o r SAP p r o t o c o l p a c k e t s −−wgatsapp Match f o r Whatsapp p r o t o c o l p a c k e t s −−l o t u s n o t e s Match f o r L o t u s N o t e s p r o t o c o l p a c k e t s −−r e m ot e s c a n Match f o r Remote Scan p r o t o c o l p a c k e t s No se muestran todos los protocolos, que son más de 165, como es obvio pero obteniendo la salida por pantalla que se muestra se pueden determinar varias cosas: La instalación de la herramienta ndpi se ha realizado de forma exitosa La instalación del helper ha terminado correctamente • Se ha podido cargar la librerı́a libxt ndpi.so de forma correcta puesto que se muestra la ayuda • El módulo xt ndpi funciona con resolución automática de dependencias • Aún falta por probar que verdaderamente la detección funciona al aplicarla sobre una regla 52 Proyecto Fin de Carrera 3.4. Departamento de Ingenierı́a Telemática Pruebas de funcionamiento, incompatibilidades y problemas de seguridad al integrar nDPI Instalada la herramienta de detección profunda en capa 7 y probada la integración del helper ndpi en Netfilter solamente falta verificar que la herramienta ndpi hace su función de manera correcta. Para ello vamos a realizar pruebas de funcionalidad bajo las siguientes condiciones: La polı́tica por defecto del firewall es polı́tica restrictiva Solamente se permite un conjunto limitado de protocolos con habilidad de detección por parte de ndpi Antes de empezar a definir reglas hay que habilitar el forwarding en el equipo que hace de firewall: [ root@redBorder−S t r o n g h o l d ]# echo ”1” >> / p r o c / s y s / n e t / i p v 4 / i p f o r w a r d Vamos a establecer la configuración más básica que se nos ocurra. Por ejemplo vamos a establecer como regla de seguridad que el firewall debe bloquear todo el tráfico que no venga por el puerto 80 y el que venga por el puerto 80 y no sea HTTP. Para ello lo primero que debemos establecer es la polı́tica por defecto restrictiva: [ root@redBorder−S t r o n g h o l d ]# [ root@redBorder−S t r o n g h o l d ]# [ root@redBorder−S t r o n g h o l d ]# [ root@redBorder−S t r o n g h o l d ]# iptables iptables iptables iptables −F −P INPUT DROP −P OUTPUT DROP −P FORWARD DROP Y comprobamos que no existan reglas y que efectivamente se ha aplicado la polı́tica restrictiva: [ root@redBorder−S t r o n g h o l d ]# i p t a b l e s −L Chain INPUT ( p o l i c y DROP) t a r g e t p r o t opt s o u r c e d e s t i n a t i o n Chain FORWARD ( p o l i c y DROP) t a r g e t p r o t opt s o u r c e d e s t i n a t i o n Chain OUTPUT ( p o l i c y DROP) t a r g e t p r o t opt s o u r c e d e s t i n a t i o n Lo siguiente que hacemos es escribir las reglas de aceleración en capa de transporte según el estado de la conexión: [ root@redBorder−S t r o n g h o l d ]# i p t a b l e s −A FORWARD −m s t a t e −−s t a t e ESTABLISHED,RELATED −j ACCEPT Imponemos que solamente dejamos pasar las conexiones que vayan al puerto 80: [ root@redBorder−S t r o n g h o l d ]# i p t a b l e s −A FORWARD −p t c p −−d p o r t 80 −m s t a t e −−s t a t e NEW −j ACCEPT Y a continuación la detección en capa de aplicación: 53 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática [ root@redBorder−S t r o n g h o l d ]# i p t a b l e s −A FORWARD −p t c p −−s p o r t 80 −m ndpi −−h t t p −j ACCEPT i p t a b l e s −A FORWARD −p t c p −−d p o r t 80 −m ndpi −−h t t p −j ACCEPT Si vemos las reglas en su conjunto: i p t a b l e s −A FORWARD −m s t a t e −−s t a t e ESTABLISHED,RELATED −j ACCEPT i p t a b l e s −A FORWARD −p t c p −−d p o r t 80 −m s t a t e −−s t a t e NEW −j ACCEPT i p t a b l e s −A FORWARD −p t c p −−s p o r t 80 −m ndpi −−h t t p −j ACCEPT i p t a b l e s −A FORWARD −p t c p −−d p o r t 80 −m ndpi −−h t t p −j ACCEPT Podemos darnos cuenta de que las reglas de aceleración en función del estado de la conexión enmascaran por completo la inspección en capa de aplicación. Las reglas que involucran al módulo ndpi nunca llegan a cumplirse puesto que primero se aceptan conexiones al puerto 80 y en el siguiente paquete, ya establecida la conexión, siempre se cumple la primera regla. Podemos plantear una solución alternativa que pase por introducir la primera regla justo al final para forzar la ejecución del módulo ndpi y la detección a nivel de aplicación. i p t a b l e s −A FORWARD −p t c p −−d p o r t 80 −m s t a t e −−s t a t e NEW −j ACCEPT i p t a b l e s −A FORWARD −p t c p −−s p o r t 80 −m ndpi −−h t t p −j ACCEPT i p t a b l e s −A FORWARD −m s t a t e −−s t a t e ESTABLISHED,RELATED −j ACCEPT De esta manera se detecta el protocolo http por el puerto 80 y la inspección se realiza de manera correcta. Sin embargo, y a medida que el número de reglas crezca, esta solución está condenada al fracaso puesto que resulta tremendamente ineficiente invocar al módulo ndpi una vez por cada regla. Con esta solución serı́a inviable construir un firewall de aplicación que fuera lo suficientemente rápido como para estar en el borde de una red corporativa. Además, tanto en esta segunda configuración como en la primera, existe un agujero de seguridad provocado por el hecho de ”filtrar” en el nivel de aplicación y aceptar conexiones en el nivel de transporte. Ya hemos visto que aceptar conexiones en el nivel de transporte enmascara la inspección a nivel de aplicación por lo que en el escenario del segundo juego de reglas cabe hacerse la siguiente pregunta ¿Qué ocurre si al acabar las reglas no hay matching? La respuesta a esa pregunta es sencilla, puesto que se aceptan conexiones en capa de transporte, un protocolo desconocido por la herramienta de inspección en la capa de aplicación harı́a matching con la regla de aceleración de conexiones establecidas en capa de transporte y pasarı́a el firewall pese a que tuviéramos definida una polı́tica por defecto restrictiva. 54 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática El hecho de pensar que la herramienta de inspección a nivel de aplicación incrementa la seguridad del sistema puesto que el filtrado es más selectivo no es solo ineficiente sino que es ilusoria. No hay nada más peligroso que la sensación de seguridad cuando además es falsa, ya que protocolos sin identificar pasan el cortafuegos de manera transparente. Cualquier programador habilidoso puede inventarse un protocolo de aplicación y pasar el firewall sin más que esperar a que haga match con la última regla. Este último resultado unido a la ineficiencia de inspeccionar todos los paquetes a nivel de aplicación durante el tiempo que dura la conexión establecida hacen que prácticamente carezca de sentido construir una extensión para iptables para inspeccionar el nivel de aplicación. De hecho, es uno de los grandes motivos por los que no han proliferado los firewall de aplicación basados en Linux. Con el análisis exhaustivo de la integración de ndpi en Netfilter y con un mı́nimo de conocimiento de Netfilter nos preguntamos ¿De verdad funciona la herramienta ndpi?¿Es posible convertir Netfilter en un verdadero firewall de aplicación? La respuesta a la primera pregunta es que sı́, ndpi es una herramienta de detección muy eficiente y con un gran potencial. Es la dinámica de reglas inherente al firewall y a la construcción de Netfilter lo que hace su uso prácticamente inservible en este contexto. De hecho, usando el segundo juego de reglas, si ndpi detecta http en el puerto 80 hace match y si probamos a poner un servidor ssh escuchando en el puerto 80 y tratamos de pasar el cortafuegos, ndpi detecta que el protocolo no es http sino ssh y rechaza la conexión. Las pruebas realizadas y los resultados obtenidos se repiten, se explican detalladamente y se amplı́an en la sección 7.2 Casos de uso. La respuesta a la segunda pregunta es, evidentemente, que sı́. Se puede construir un firewall de aplicación en Linux pero no sin mancharse las manos. Como ya se ha comentado en otras secciones, Netfilter está pensado para ser un stateful firewall a nivel de transporte, y nada más. Para convertir Netfilter en un firewall de aplicación debemos modificar su comportamiento para hacerlo compatible con la herramienta ndpi y eficiente para su uso habitual. Las soluciones propuestas para hacer de Netfilter un firewall de aplicación se presentan en el apartado 4.4 Solución a los problemas y a las incompatibilidades. 55 Proyecto Fin de Carrera Departamento de Ingenierı́a Telemática palabra 56