miércoles, 4 de julio de 2012

Instalación de Snort 2.9.2 en Ubuntu 10.04


Para poder hacer pruebas con un IDS en tu propia casa no es necesario disponer de un fortigate. Existen soluciones de software libre que podemos instalar en equipos tanto Windows como Linux. Googleando encontré que uno de los más conocidos es Snort, así que me puse a ojear el manual oficial de instalación en Ubuntu. La topología que ellos recomienda para el uso de ésta herramienta la podemos ver en la Figura 1.

Figura 1: topología recomendada.
La topología que yo he montado la podemos ver en la figura 2. El snort lo he montado en una máquina virtual en VMWare Workstation. Para poder monitorear el tráfico con snort necesitaremos un switch que soporte port mirroring o span (como lo llama Cisco Switched Port Analyzer). Yo he utilizado un switch cisco de la serie 2900XL. Las configuraciones de la máquina vitural y del switch las comentaré más adelante.




Topología
Figura 2: topología implementada.



Nota: el puerto espejo o port mirroring es utilizado con un switch de red para enviar copias de paquetes de red vistos en un puerto del switch (o una VLAN entera) a una conexión de red monitoreada en otro puerto del switch. Esto es comunmente utilizado para aplicaciones de red que requieren monitorear el tráfico de la red, tal como una intrución-detección al sistema.


Configurar la máquina virtual.

Configuramos en VMWare una red de tipo bridge con conexión externa a la tarjeta de red y desactivamos la configuración del DHCP (lo podemos ver en la figura 3). Esto lo hacemos en el menú "Edit/Virtual Network Editor".

Figura 3: configuración de red tipo bridge.
La conexión de red de la tarjeta de la máquina virtual debe ser "Custom: specific virtual network/ VMnet1" (figura 4). 

Figura 4: configuración del adaptador de red.
Yo he realizado una instalación de ubuntu nueva. Ahora explicaré los pasos que he seguido para instalar snort ( pasos del manual oficial de la página de snort).

Instalación de paquetes necesarios

Necesitamos instalar los siguientes paquetes: nmap, nbtscan (escaner de red), apache2, php5, php5-mysql, php5-gd, libpcap0.8-dev, libpcre3-dev, g++, bison, flex, libpcap-ruby. Las instrucciones que debemos  ejecutar son las siguientes:

sudo apt-get install nmap
sudo apt-get install nbtscan
sudo apt-get install apache2
sudo apt-get install php5
sudo apt-get install php5-mysql
sudo apt-get install php5-gd
sudo apt-get install libpcap0.8-dev
sudo apt-get install libpcre3-dev
sudo apt-get install g++
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libpcap-ruby

La instalación de estos paquetes no es complicada, sólo hay que ejecutarlas y pulsar la tecla "Y" en el caso de que nos pida confirmación. Una vez que hemos teminado la instalación procederemos a realizar la instalación del servidor de bases de datos, que para nuestro caso es el mysql.

sudo apt-get install mysql-server
sudo apt-get install libmysqlclient16-dev

Cuando ejecutamos la primera instrucción " sudo apt-get install mysql-server " nos pedirá que introduzcamos la contraseña que utilizará el administrador para conectarse a mysql (figura 5).


Figura 5: contraseña de acceso para el administrador en mysql.
Nos pedirá la confirmación de la contraseña para comprobar que no se ha producido un error en la escritura de la misma (figura 6).  La ejecución de la segunda instrucción no necesitará ningún tipo de configuración.

Figura 6: repetir la contraseña del administrador.
Instalar actualizaciones

Después de esto nos aseguramos que ubuntu tiene las últimas actualizaciones, para ello ejecutamos las siguientes intrucciones:

sudo apt-get update
sudo apt-get upgrade

Instalación del Snort Report

Snort report nos va a proporcionar una interfaz web para poder visualizar las alertas de seguridad que se han prouducico en nuestra red. Tambien nos mostrará un diagrama en forma de queso mostrandonos los porcentajes de los tipos de ataque.

JPgraph

Para que en la interfaz web se muestre el diagrama en forma de queso necesitamos instalar la librería jpgraph. Puede que haya algún tipo de incompatibilidad si descargamos otra version. La que yo he utilizado es la 1.27.1 que la podemos descargar de aquí. Las instrucciones necesarias para la descarga, descompresión e instalacion de esta librería son las siguientes:

sudo wget http://hem.bredband.net/jpgraph/jpgraph-1.27.1.tar.gz
sudo mkdir /var/www/jpgraph
sudo tar zxvf jpgraph-1.27.1.tar.gz
sudo cp -r jpgraph-1.27.1/src /var/www/jpgraph/


Snort Report

El siguiente paso es descargar y configurar snort report. La versión que yo he utilizado es la 1.3.3, para descargarla iremos a ésta página y pulsaremos en la sección "Downloads" y allí encontraremos el enlace (figura 7).

Figura 7: descarga de snort report.

Por defecto en ubuntu los archivos descargados se almacenan en la ruta "/home/usuario/Downloads", así que procedemos a descomprimirlo con la siguiente intrucción:

sudo tar zxvf snortreport-1.3.3.tar.gz -C /var/www/ 

Una vez descomprimido necesitamos editar el fichero srconf.php para configurar los datos de conexión a mysql así como la ruta a la librería jpgraph (que se introducirá de forma relativa al directorio donde está instalado snort report, como snort-report está en la carpeta /var/www/snortreport-1.3.3 y jpgraph también la ruta relativa será "../jpgraph" como podemos ver en la figura 8). Los datos de conexión a la base de datos serán: server, user, pass y dbname. Como nombre de usuario y nombre de la base de datos pondremos snort (aunque todavía no existen los pondremos porque lo crearemos más adelante), la contraseña que pondremos será "123456" y en server pondremos "localhost" (Figura 9). Se pueden utilizar los datos que quieras yo he optado por estos en el post para que sea todo más claro.

Para la edición del fichero he utilizado vi, para poder editar el fichero con este editor utilizamos la siguiente instrucción:

sudo vi /var/www/snortreport-1.3.3/srconf.php


Figura 8: ruta a la librería jpgraph.


Figura 9: datos para la conexión a mysql.

Instalación y configuración de Snort

Antes de instalar snort vamos a necesitar instalar una API que se utiliza desde la versión 2.9.0 para obtener  los datos (Data Acquisition API). La versión que he utilizado es la 0.6.2 que la podemos descargar desde aquí

Por defecto en ubuntu los archivos descargados se almacenan en la ruta "/home/usuario/Downloads", así que procedemos a descomprimirlo con la siguiente intrucción:

sudo tar zxvf daq-0.6.2.tar.gz

Para compilarla y configurala ejecutaremos las siguientes instrucciones:

cd daq-0.6.2
sudo ./configure
sudo make
sudo make install

Instalación de libdnet

Libdnet ofrece una interfaz simplificada, portátil con varias rutinas de red de bajo nivel. La versión que he utilizado es la 1.12 y la podemos descargar desde aquí. Las instrucciones para descomprimirlo, compilarlo e instalarlo son las siguientes:

sudo tar zxvf libdnet-1.12.tgz
cd libdnet-1.12/
sudo ./configure
sudo make
sudo make install
sudo ln -s /usr/local/lib/libdnet.1.0.1 /usr/lib/libdnet.1


Instalación de snort

La versión de snort que he utilizado es la 2.9.2 pero si vamos a la web de snort podemos descargar una versión más actualizada. La versión 2.9.2 la podemos descargar desde aquí. Los pasos que voy a describir son para instalar snort en la ruta "/usr/local/snort" pero se puede cambiar a otro directorio, lo que habría que hacer es cambiar la ruta "--prefix" en las instruccion de instación. Las instrucciones son las siguientes:


Nota: recordar que por defecto los archivos descargados se almacenan en el directorio "/home/usuario/Downloads".

sudo tar zxvf snort-2.9.2.tar.gz
cd snort-2.9.2
sudo ./configure --prefix=/usr/local/snort --enable-sourcefire
sudo make
sudo make install

Creamos los directorios para los logs con las siguientes intrucciones:

sudo mkdir /var/log/snort
sudo mkdir /var/snort

Creamos el usuario y grupo snort  con las siguientes instrucciones:

sudo groupadd snort
sudo useradd -g snort snort

Cambiamos de propietario el directorio "/var/log/snort" con la siguiente instrucción:

sudo chown snort:snort /var/log/snort


Con esto ya tendríamos instalado snort, habríamos creado el usuario snort que indicabamos en el archivo de configuración de snort report. Ahora nos faltaría crear la base de datos, darle permisos al usuario snort para utilizarla y asignarle la contraseña que indicabamos en el archivo de configuración de snort report.

Para crear la base de datos usamos la siguiente instrucción:

echo "create database snort;" | mysql -u root -p

Para crear las tablas necesarias en la base de datos usamos la siguiente instrucción:

mysql -u root -p -D snort < ./schemas/create_mysql


Para darle al usuario snort los permisos necesarios sobre la base de datos snort y asignarle una contraseña utilizaremos la siguiente instrucción:

echo "grant create, insert, select, delete, update on snort.* to snort@localhost identified by '123456'" | mysql -u root -p

Nota: la contraseña que ponemos es 123456 porque es la que hemos indicado en el archivo de configuración de snort report.


Instalación de las Snort rules

Lo siguiente que haremos es descargarnos el conjunto de reglas para snort (estás reglas son las que harán que detecten las amenazas), para ello iremos a ésta página. Aquí hay dos secciones diferenciadas "Subscriber Release" y "Registered User Release". La diferencia entre ellas es que el conjunto de reglas para los  usuario registrados no está actualizada, va un mes por detrás. Para poder descargarnos el conjunto de reglas deberemos de registrarnos en la página (figura 10). La versión que yo me he bajado ha sido la 2922.


Figura 10: descargar las reglas.

Una vez descargado ejecutaremos las sisguientes instrucciones:

sudo tar zxvf snortrules-snapshot-2922.tar.gz -C /usr/local/snort
sudo mkdir /usr/local/snort/lib/snort_dynamicrules
sudo cp /usr/local/snort/so_rules/precompiled/Ubuntu-10-4/i386/2.9.2.2/* /usr/local/snort/lib/snort_dynamicrules
sudo touch /usr/local/snort/rules/white_list.rules
sudo touch /usr/local/snort/rules/black_list.rules
sudo ldconfig

Configuración de Snort

Para configurar snort tendremos que editar el fichero "/usr/local/snort/etc/snort.conf", el editor que uso es el vi. La instrucción para editar el fichero es la siguiente:

sudo vi /usr/local/snort/etc/snort.conf

Una vez que estemos editando el fichero deberemos realizar los siguientes cambios:

Buscar en snort.conf   Sustituir por.... 
var WHITE_LIST_PATH /etc/snort/rules

var BLACK_LIST_PATH /etc/snort/rules
var WHITE_LIST_PATH /usr/local/snort/rules

var BLACK_LIST_PATH /usr/local/snort/rules

Buscar en snort.conf   Sustituir por.... 
dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/

dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so

dynamicdetection directory /usr/local/lib/snort_dynamicrules
dynamicpreprocessor directory /usr/local/snort/lib/snort_dynamicpreprocessor/

dynamicengine /usr/local/snort/lib/snort_dynamicengine/libsf_engine.so

dynamicdetection directory /usr/local/snort/lib/snort_dynamicrules

Luego buscaremos la línea:

#output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types

y debajo añadiremos la siguiente línea:

output unified2: filename snort.u2, limit 128

El porque de ésta última instrucción la comentaremos en el siguiente paso. Guardaremos los cambios realizados y ya tendremos configurado snort y sus reglas.

Instalar Barnyard2

En entornos en los que un IDS Snort tiene que procesar una gran cantidad de tráfico es muy posible que su rendimiento se vea afectado y acabe descartando paquetes.

Esto es debido a que Snort no procesa el siguiente paquete hasta que no termina de escribir la alerta en la base de datos. Este proceso de escritura es lento si hablamos de que es necesario una conexión TCP y un insert en la base de datos por cada alerta. 

Para estos casos se puede configurar Snort (/usr/local/snort/etc/snort.conf ) para que escriba las alertas en un fichero local en lugar de hacerlo directamente en red. y esto se consigue con la instrucción anterior ( output unified2: filename snort.u2, limit 128 ). Con esta línea diremos a Snort que escriba las alertas en un fichero con nomenclatura base snort.log. con un tamaño máximo de 128MB cada uno.

Se trata del formato unified2, un formato binario optimizado que permitirá a snort generar alertas más rápidamente.

Pero si tenemos las alertas en un fichero local, ¿cómo las escribimos entonces en la base de datos? Para esta tarea tenemos Barnyard2 (en español "corral"), un intérprete open source de los ficheros de salida en formato unified2. Barnyard2 tendrá como entrada un fichero unified2 y como salida escribirá en nuestra base de datos.

Esta explicación la he sacado de la web www.hackerplayers.com y allí hay muchos más detalles, muchas gracias al autor desde aquí por su trabajo.

Primero descagamos barnyard2, la versión que yo he utilizado es la 1.9, el enlace lo tenemos aquí. Una vez descargado descomprimimos e instalamos con el siguiente conjunto de instrucciones:

sudo tar zxvf barnyard2-1.9.tar.gz
cd barnyard2-1.9
sudo ./configure --with-mysql
sudo make
sudo make install
sudo cp etc/barnyard2.conf /usr/local/snort/etc
sudo mkdir /var/log/barnyard2
sudo chmod 666 /var/log/barnyard2
sudo touch /var/log/snort/barnyard2.waldo
sudo chown snort.snort /var/log/snort/barnyard2.waldo


Ahora vamos a implementar las actualizaciones necesarias en el archivo de configuración de barnyard2, lo editamos con el siguiente comando:

sudo vi /usr/local/snort/etc/barnyard2.conf

Las modificaciones que debemos de hacer son las siguientes:


Buscar en barnyard2.conf  Sustituir por....
config reference_file: /etc/snort/reference.config config reference_file: /usr/local/snort/etc/reference.config
config classification_file: /etc/snort/classification.config config classification_file: /usr/local/snort/etc/classification.config
config gen_file: /etc/snort/gen-msg.map config gen_file: /usr/local/snort/etc/gen-msg.map
config sid_file: /etc/snort/sid-msg.map config sid_file: /usr/local/snort/etc/sid-msg.map
#config hostname: thor config hostname: localhost
#config interface: eth0 config interface: eth0
#output database: log, mysql, user=root password=test dbname=db host=localhost output database: log, mysql, user=snort password=123456 dbname=snort host=localhost


Donde password es 123456 porque es la contraseña para acceder a la base de datos asignada al usuario snort en pasos anteriores. Una vez hechos estos cambios guardamos el archivo y pasamos a configurar la interfaz.

Configuración de la interfaz
Ahora vamos a introducir la configuración de la interfaz de red de la máquina virtual, para ello editamos el archivo "interfaces" con la siguiente instruccion:


sudo vi /etc/network/interfaces

La configuración de la interfaz eth0 debe de ser la siguiente:

auto eth0
iface eth0 inet manual
ifconfig eth0 up


Una vez realizados los cambios guardamos y reiniciamos la configuración con la siguiente instrucción:

sudo /etc/init.d/networking restart

Con esto ya habríamos terminado de configurar snort y la interfaz.

Configuracion de port mirroring

Para configurar como SPAN el puerto 5 de nuestro switch cisco de la serie 2900XL y que se duplique el tráfico de la boca 7 a la boca 5 y así snort pueda analizar el tráfico, ejecutamos las siguientes instrucciones:

Switch>enable
Switch#configure terminal
Switch(config)#interface fa 0/5
Switch(config-if)#port monitor fa 0/7
Pulsamos ctrl+z
Switch#show port monitor

La última intrucción nos muestra los puertos que se están auditando:

Switch#show port monitor
Monitor Port             Port Being Monitored
--------------------- ---------------------
FastEthernet0/5        FastEthernet0/7   

Probar Snort

Para comprobar que la tarjeta de red está capturando el tráfico que se genera en el puerto 7 (y que  funciona el SPAN), me he instalado el wireshark y he realizado una captura por la interfaz eth0 en la máquina virtual. Viendo el origen de los paquetes compruebo que funciona bien. Esta comprobación es importante, porque podemos pensar que snort no funciona bien cuando en realidad la tarjeta no está capturando el tráfico.

Arrancamos el snort con la siguiente instrucción:

sudo /usr/local/snort/bin/snort -u snort -g snort -c /usr/local/snort/etc/snort.conf -i eth0

Lo siguiente es abrir el navegador en la máquina virtual y acceder a la dirección "http://localhost/snortreport-1.3.3/". Aquí vemos la interfaz gráfica de snort report (figura 11), que es el lugar donde se nos mostrarán las alertas detectadas.

Figura 11: interfaz snort report.

Navegamos desde el pc conectado a la interfaz 7 e intentamos generar tráfico para que salte una alerta en el snort report. Podemos realizar escaneos de puertos, intentar hacer un POD (ping de la muerte), descargar  el emule y ejecutarlo, entre otras cosas. La opción más sencilla es visitar la web testmyids. Esto hará que se nos muestre una alerta. Después de hacer estas cosas en la parte de la página web donde aparece "No Data" aparece un diagrama en forma de queso con un porcentaje con los tipos de alertas detectadas (figura 12).

Figura 12: alertas en snort report.

Configurar el arranque de snort de forma automática

Para configurar el arranque automático editaremos el fichero rc.local con la instrucción:

sudo vi /etc/rc.local

Y añadiremos al final del fichero las siguientes instrucciones:

ifconfig eth1 up
/usr/local/snort/bin/snort -D -u snort -g snort \
-c /usr/local/snort/etc/snort.conf -i eth1
/usr/local/bin/barnyard2 -c /usr/local/snort/etc/barnyard2.conf \
-G /usr/local/snort/etc/gen-msg.map \
-S /usr/local/snort/etc/sid-msg.map \
-d /var/log/snort \
-f snort.u2 \
-w /var/log/snort/barnyard2.waldo \
-D

Una vez guardados los cambios reiniciamos ejecutando la siguiente instrucción:

sudo /etc/init.d/rc.local start

De esta forma si reiniciamos la máquina virtual, snort arrancará de form automática.

Estós son los pasos que he seguido para instalar este IDS de software libre, espero que no se me haya escapado nada, ahora que lo tengo instalado probaré a hacer más cosas con él y ya os iré contando. Si hay algún error o posible mejora estoy abierto a sugerencias :).

No hay comentarios:

Publicar un comentario