Bastionado, seguridad en sistemas: Mi proyecto de fin de carrera pre { background:#eeeeee; border:1px solid #A6B0BF; font-size:120%; line-height:100%; overflow:auto; padding:10px; color:#000000 } pre:hover { border:1px solid #efefef; } code { font-size:120%; text-align:left; margin:0;padding:0; color: #000000;} .clear { clear:both; overflow:hidden; }

Bienvenido al blog

Bienvenidos al blog de seguridad en sistemas

domingo, 3 de julio de 2011

Mi proyecto de fin de carrera

Este mes hace justamente dos años desde que presente mi proyecto de fin de carrera y por tanto ya es un proyecto libre. El proyecto se basa en NetInVM, ¿qué que es NetInVM? pues es una máquina virtual VMWare con una SUSE a la que llamaremos BASE y dentro de ella corre una red virtual con máquinas Debian y dispositivos de red virtuales empleando la tecnología de virtualización User Mode Linux (UML). 

Realmente las máquinas Debian utilizan el mismo sistema de ficheros al que llamaremos fichero madre. Lo que hace NetInVM es aplicar una configuración durante su primer arranque para adaptarlas al requisito deseado. Las modificaciones efectuadas sobre éstas respecto al sistema de fichero original se guardan en un fichero de copia en escritura COW.

La red virtual UML constaba de tres subredes (externa, dmz, interna) conectadas por un router (linux con iptables). Cada subred disponía de un dispositivo de red de capa 2 donde se le conectaban un total de 6 equipos por subred. Esos equipos eran una Debian 4 con un servicio Web, FTP y SSH. Por cada máquina virtual UML se cargaba una consola base y 3 konsole para interaccionar con ella. Cada consola se lanza en uno de los 8 escritorios del KDE de la SuSE (Base).



El proyecto tenia como objetivo principal modularizar NetInVM permitiendo construir la red virtual en módulos, vamos como si de unas piezas de lego se tratase. Por tanto debía ser capaz de añadir y eliminar módulos que indicaran un elemento de la red: un router, un switch, un host, un servicio, una red etc.

Esto se realizo creando un modelo totalmente modular donde para cada módulo existía un script que permitía añadirlo o eliminarlo comprobando previamente sus dependencias, permitiendo agregar o sustraer las dependencias del módulo. Un diseño a bajo nivel de como se diseño es el siguiente:


A su vez se añadieron los siguientes requisitos adicionales:
  • Soportar más de una red distinta. 
  • Exportar el diseño de la red con un fichero XML. 
  • Exportar la red completa (Sistema base, COW, configuración) o parcial (COW y configuración). 
  • Añadir servicios adicionales como base de datos y servidor de aplicaciones. 
  • Poder seleccionar entre HUB o Switch para la conexión de los equipos de cada sub red. 
  • Firewall a nivel de Host y en router que fuera capaz de configurarse de forma dinámica dependiendo de los servicios que ofreciera.
  • Añadir la funcionalidad al router para generara perdidas de paquetes intencionadamente, para de esta forma, comprender como funcionan los protocolos cuando se producen fallos en la electrónica. 
  • Red de detección de intrusos(NIDS) con una equipo con las sondas Snort y otro equipo con un MySQL más un consola de analista. 
  • Módulo de alta disponibilidad(HA) en modo activo pasivo, de esta forma se podría aprender como funcionan la alta disponibilidad entre equipos forzando una caida de un servidor y viendo como el otro servicio se daba cuenta de la caída y tomaba el control. 
  • Interfaz gráfica que permita facilidad de uso.  
  • Herramientas auxiliares como por ejemplo cargar la red virtual en un sistema de fichero tmpfs (RAM) para aumentar su velocidad, un reconocedor de puertos, un gráfico de recursos de cada una de las máquinas virtuales UML, Sniffer, etc, etc. 
  • Crear documentación automática explicativa de la red en formato HTML. 
  • Independencia real de la red virtual UML con la SuSE (Base) al autoconfigurarse cada host y no depender del DHCP ni del DNS de Base como ocurre en el NetInVM original.  
  • Poder añadir módulos adicionales.
  • Módulo de actualización de la imagen madre UML.
Vamos bastantes cositas... a continuación veremos un ejemplo desde la GUI de como funcionaba el proyecto, todo sea dicho que yo no soy un programador Java pero lo que importaba era lo que había por debajo ya que la interfaz gráfica solo invocaba a los script dependiendo de la selección (y más cuando la interfaz se tuvo que hacer una vez pasado7 meses del inicio del proyecto). Esto es la consola nada más la ejecutábamos:


Podíamos ir pinchando en los dispositivos para ir añadiéndolos o eliminarlos. Veamos el resultado tras añadir una serie de dispositivos:


El nombre que aparece en rojo es el nombre que le ponemos a la red y está en rojo porque no hemos grabado la red, es decir, si cerramos el programa se pierde el diseño creado. Como vemos hemos seleccionado un router, un switch para la red externa y dmz, un hub para la red interna, una máquina en la red externa, una maquina de la red interna y dos máquinas de la red DMZ que aparece en azul su nombre, debido a que ambas máquinas están en alta disponibilidad entre ellas, se ha seleccionado las sondas del NIDS para la red externa y DMZ pero no para la red interna.

Si pinchamos sobre el icono de una máquina, en este caso DMZB, veremos que módulos tiene habilitado. Para el ejemplo vemos el nombre de la máquina y junto al nombre entre paréntesis un número que identifica el escritorio donde se ejecuta NetInVM, en este caso en el escritorio 2 de la SuSE. A su vez se muestra la IP del host, el módulo de servidor de aplicaciones habilitado, base de datos, servidor Web, FTP y adicionalmente se encuentra en alta disponibilidad con DMZA para los servicios Web y FTP donde la IP virtual de la alta disponibilidad es 10.5.1.9:


Otro ejemplo sería pinchar sobre un router, donde podemos configurarlo indicando que tipo de router queremos si con reglas de filtrado habilitadas, que dispositivos de red va a tener cada subred conectada a él, en que escritorio se va a ejecutar y si queremos que se generen perdidas de paquetes para comprobar el funcionamiento de los protocolos cuando esto ocurre:


Una vez configurado si pinchamos sobre él se muestra la configuración de éste:


Este diseño podía ser exportado con unas simples lineas de un fichero XML y llevado a otro NetInVM para que fuera cargado por la interfaz Gráfica:


La red virtual se podía ejecutar desde la propia interfaz web tal donde se irán ejecutando las máquinas virtuales en cada escritorio de la SuSE que se le haya indicado, se muestra en la barra inferior del KDE:


Si por ejemplo vamos al escritorio 8, que es donde hemos indicado que se lancen las máquinas virtuales del IDS, veremos que hay dos máquinas virtuales ( 2 consolas básicas y 6 Konsole). La primera es IDSA que es la máquina con las sondas y IDSF que es la máquina con la base de datos y la consola del analista. IDSA enviará las alertas a la base de datos de IDSF:


Desde la interfaz gráfica se podía parar una máquina en concreto, reiniciarla o forzar un halt (un halt de Unix no de Linux, es decir, tirar del cable) así como parar la red completa. A su vez se podía acceder a cada máquina virtual con un solo clip, obtener los recursos consumidos por la máquina virtual, escanear una máquina virtual, acceder a la consola del IDS, etc:


Os dejo la documentación del proyecto, son algo más de 200 hojas, por si alguien más está interesado:
http://www.megaupload.com/?d=SK9Z3Q9D

Fueron unas 10.000 lineas en shell script (seguí el "lenguaje" en el que había sido desarrollado el proyecto) y unas 12.000 en Java para la interfaz gráfica. Todo sea dicho, yo no era un experto programando y menos en Java, pero el trabajo realizado a bajo nivel creo que era bastante tedioso y más para un chaval de 5º de carrera que nunca había tocado la tecnología UML. Al final le dedique un año completo en exclusiva al proyecto que me permitió obtener una nota de 9.5 sobre 10.

Tengo que indicar que en el primer año después de presentar el proyecto actualice el núcleo UML a 2.6.30, las Debian a Lenny, cambie SuSE por una Kubuntu 9.04 con KDE 4, cambie de VMWare a VirtualBox, actualice la NIDS: Snort 2.8.4.1, Barnyard, Sguil y reglas de Emerging Threats, desplegué el WebGoat en el servidor de aplicaciones y añadí los servicios de DNS y Nagios.

Un año después de haber presentado vi que NetInVM no se había actualizo con mi proyecto (era difícil integrarlo por mi falta de experiencia en estas cosas), que UML empezaba a no estar soportada por el kernel y que cada 5 meses tenía un examen de las certificaciones de SANS por lo que me era imposible poder continuar con el proyecto, pero si que me gustaba despedirme de algo que me costo un año y que creo que estaba muy bien dejando esta pequeña entrada para el recuerdo. Si alguien quiere la última versión comentada con anterioridad me la puede pedir, eso si, ocupa 6GB comprimida en bz2, así como, si alguien quiere continuar con el proyecto que me lo diga y le paso las fuentes sin problemas :)

9 comentarios:

  1. Piensa en la forma de subirlo a Google code y deja que la naturaleza siga su curso xd
    Tremendo proyecto. Muy chulo. Quizás no sacaras matrícula pero te hizo coger mucha skill con bash script :p

    ResponderEliminar
  2. 10.000 Lineas en shell script. Dios es cruel xD

    ResponderEliminar
  3. jeje, me hace sentir pequeño mi proyecto...

    ResponderEliminar
  4. Antes de nada enhorabuena por el trabajo, una pena que se lo quedase el FBI :(, lo dicho comparte en google code o sourceforge, etc.. la comunidad te lo agradecerá :D

    ResponderEliminar
  5. Buen trabajo! Actuaiza el enlace porfavor

    ResponderEliminar
  6. Buen trabajo! Actualiza el enlace de descarga porfavor.

    ResponderEliminar
  7. Exelente trabajo,

    Tal como comentan antes, podrías dejarnos el enlace de descarga?

    Saludos.

    ResponderEliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Muy buen trabajo, si señor, la verdad es que la forma de incluir las maquinas con ese entorno grafico, es una pasada...

    Tal y como comentan los compañero, como podriamos descargar la imagen del proyecto?, en realidad no seria para continuarlo, ya que carezco de conocimientos suficientes en realidad, pero me ha despertado la curiosidad bastante las modificaciones echas... esta muy currado, Un saludo!!

    ResponderEliminar