miércoles, abril 04, 2012

Juntando las piezas de un IDS+IPS

Me voy a saltar toda la teoría previa de los IDS e IPS. Lo que interesa saber es lo siguiente. Usualmente, cuando queremos tener un equipo linux seguro en internet, activamos el firewall iptables con politica por defecto DROP y habrimos unos pocos puertos para las comunicaciones que vienen del exterior y van a utilizar los servicios que nuestra máquina.

De forma simplificada, tal cual esto se hace, nos resulta muy complicado cuando alguien se ha dedicado a atacar el servidor ssh o el servidor ftp en busca de un exploit que permita acceder a la máquina. Tenemos que estar revisando logs, etc. Si tenemos mucho tráfico (muchos logs) esto es inviable.

Es en este momento cuando acude en nuestra ayuda Snort, que es un IDS para linux. Snort no es más que un sniffer de red, monitorizando todo el tráfico que pasa por él. En función de un conjunto de reglas que tiene definidas, va analizando el tráfico y generando alertas de posibles ataques, tráfico sospechoso, etc.

Snort va guardando estas alertas en una base de datos (usualmente MySql), tal forma que posteriormente podemos consultarla con otra aplicación, llamada Base, que es una aplicación escrita en PHP que corre sobre un servidor web como Apache. Base es nuestro panel de control para determinar lo que esta ocurriendo en nuestra red.

Como he dicho antes, Snort utiliza un sistema basado en reglas para saber cuando hay algún tipo de ataque. Puesto que los ataques van evolucionando con el paso del tiempo, necesitamos mantener la base de datos de reglas actualizada. De esa función se encarga Oinkmaster, un script escrito en perl encargado de actualizar las reglas cada cierto tiempo. La frecuencia de ejecución de este script se deja en la crontab del sistema.

Hay varios tipos de conjunto de reglas de snort, las reglas de la comunidad disponibles para todo el mundo y las reglas VRT, que han sido certificadas por el equipo de investigación de vulnerabilidades, disponibles para los usuarios de pago. Estas últimas, están disponibles para los usuarios registrados 30 días después de su publicación para los suscriptores. Si nos registramos en la web de snort, obtendremos el oinkcode necesario para descargar las reglas mediante oinkmaster.

Instalación de Snort (junto con mysql)

El primera paso es instalar snort con soporte de mysql
$ apt-get install snort-mysql
Entre las dependencias, apt-get incluira oinkmaster, las reglas por defecto de la comunidad y las librerias comunes. En la instalación nos pedirá una serie de parámetros para la configuración de snort contra el mysql (servidor de bd, nombre de la bd, usuario y password de acceso) como la interfaz donde snort se pondrá a escuchar los paquetes de red. Si no tenemos mysql, procedemos a instalarlo con
$ apt-get install mysql-server
Si levantamos el demonio y hemos hecho bien las tareas de configuración con la orden /etc/init.d/snort start tendremos nuestro IDS activado. Aunque aún no sabremos que esta ocurriendo salvo que nos peleemos con  el mysql consultemos a pelo en las tablas de alerta.

Será ultil, agregar la siguiente linea al fichero de configuracion de snort, pudiendo consultar su alertas en /var/log/auth.log. Además, esto nos vendrá bien para la parte final (el IPS).
output alert_syslog: LOG_AUTH LOG_ALERT

Instalación de Base (junto con Apache+PHP con soporte de mysql)

Toca el turno de Base (Basic Analysis and Security Engine). A diferencia de snort, lo instalamos desde el comprimido tar.gz. Pero lo primero es preparar el sistema para que se pueda ejecutar. Eso implica instalar Apache con PHP y soporte mysql. También instalamos algunas cosas mas para la generación de graficos como la libreria pear.
$ apt-get install apache2
$ apt-get install libapache2-mod-php5 libphp-adodb php-pear php5-adodb php5-cli php5-common php5-gd php5-mysql
$ pear install Image_Graph
Descargamos y descomprimos el fuente de base en /usr/local/base. Y creamos un enlace simbólico para no tener que ir lidiando con la versión y si cuando actualicemos, solo hay que cambiar el enlace simbólico.
$ cd /usr/local/src
$ wget http://sourceforge.net/projects/secureideas/files/latest/download
$ tar xvfz base-version.tar.gz
$ mv base-version /usr/local/
$ ln -s /usr/local/base-version /usr/local/base
Creamos en el apache, en conf.d, la configuración del directorio y el alias para publicarlo. Añadimos algunas directiva de restricción del acceso a la aplicación. Pese a que base viene con sus medidas de seguridad para entrar en la aplicación, no esta demás esta restricción de acceso. La aplicación solo estará disponible para los equipos de la red local.
Alias /base /usr/local/base

<Directory /usr/local/base>
Options +FollowSymLinks
AllowOverride None
order allow,deny
allow from 192.168. 127.0.0.1

AddType application/x-httpd-php .php

<IfModule mod_php5.c>
php_flag magic_quotes_gpc Off
php_flag short_open_tag On
php_flag register_globals Off
php_flag register_argc_argv On
php_flag track_vars On
# this setting is necessary for some locales
php_value mbstring.func_overload 0
#php_value include_path .
</IfModule>

DirectoryIndex index.php
</Directory>
El siguiente paso será reinicar el apache y lanzar desde el navegador la siguiente url
http://ip-equipo-base/base/setup/
El setup realizará las comprobaciones necesarias y nos pedirá los datos de la base de datos mysql donde guardan la información snort. Seguimos la línea de baldosas amarillas que nos marca el asistente. Uno de esos pasos será la creación de un usuario administrador en la aplicación. Para la generación de los gráficos tenemos que tener bien indicado la ruta (directiva include_path) de includes de PHP para que pueda encontrar la libreria Image_Grapth de pear. La aplicación Base nos lo dirá si no puede encontrarla.

Instalación de Oinkmaster

El último paso para disponer de nuestro el IDS al completo será ir actualizando las reglas de Snort. El paquete oinkmaster ya estará instalado, sino hacemos un apt-get install oinkmaster y lo tendremos disponible al instante. Queda soliticar el oinkcode en la web de snort. Nos registramos en su web y solicitamos el codigo. Luego lo configuramos en el fichero /etc/oinkmaster.conf
url = http://www.snort.org/pub-bin/oinkmaster.cgi/CODIGO/snortrules-snapshot-2920.tar.gz
Es importante descargar el fichero que corresponde a nuestra version. Si tenemos un snort-2.9.2, entonces la url de descarga para el oinkmaster será el snapshot 2920.
$ /usr/sbin/oinkmaster -C /etc/oinkmaster.conf -o /etc/snort/rules/
Las primera actualizaciones de reglas las haremos de forma manual, así comprobamos que no hay nada que falte. A mi me paso que con la actualización de reglas, habia una serie de variables que utilizaban las reglas que no estaban definidas en el snort, con lo que el snort no se levantaba después. Estas variables se definen en el fichero snort.conf.

Después de la acutalización, oinkmaster informará de que reglas a tocado, podemos lanzar un test de la configuración de snort, levantando nosotros el demonio con el parametro -T. Esto nos dará una pista de lo que pudise pasar en el caso de que pasara algo como lo anterior que he dicho.
$ snort -T -c /etc/snort/snort.conf
Si va todo bien, podemos ir pensando en agregar a la crontab la ejecución del oinkmaster y que se lance cada  varios días la actualizacion de reglas (una semana creo que es lo suyo).

Llegados a esta altura de la pelicula, tenemos un IDS operativo. Nuestro Snort esta vigilando el trafico y si consultamos Base nos llevamos muchos sustos al descubrir muchos alarmas, la mayoria de ellas falsos positivos. Snort es facil de instalar, lo dificil es el trabajo de ajuste para eliminar los falsos positivos. Más si cabe cuando avancemos al siguiente paso, activar Guardian, que será nuestro IPS y nos protegera de todo aquello que Snort considera como un problema. Imaginad el problema de bloquearnos a nosotros mismos el acceso o un cliente por no darnos cuenta de que su tráfico era legítimo.

Guardian es una aplicación escrita en perl, que lee los logs de alertas de Snort. Cuando ve una alerta, entonces genera una regla de iptables bloqueando la comunicación con la ip del atacante. Esta regla la deja durante un tiempo X, pasado ese tiempo, lanza la regla de desbloqueo.

Instalación de Guardian

La aplicación Guardian es muy simple. De tan simple que es, hasta asusta. Procedemos a descargarla y a descomprirla tal como hicimos con Base.
$ wget guardian-version.tar.gz
$ tar xvfz guardian-version.tar.gz
$ mv /usr/local/src/guardian-version /usr/local/
$ ln -s /usr/local/guardian-version /usr/local/guardian
Copiamos el fichero de configuración guardian.conf en /etc. Al estar en un linux con iptables, cambiamos los scripts de bloqueo que estan en /usr/local/guardian/ llamados guardian_block.sh y guardian_unblock.sh por los que tenemos en /usr/local/guardian/scripts/iptables_*. Respectando el nombre
$ cp /usr/local/guardian/guardian.conf /etc/guardian.conf
$ cp /usr/local/guardian/scripts/iptables_block.sh /usr/local/guardian/guardian_block.sh
$ cp /usr/local/guardian/scripts/iptables_unblock.sh /usr/local/guardian/guardian_unblock.sh
Añadimos la directiva donde debe mirar las alertas de snort, en el fichero /etc/guardian.conf
AlertFile       /var/log/auth.log
Aquí vemos el sentido de la directiva de configuración que tocamos en el fichero de configuración de snort (output alert_syslog). Sin ese cambio, guardian sería incapaz de ver las alertas de snort y no podría hacer ningún bloqueo.

Para ejecutar guardiamos, tecleamos
$ /usr/local/guardian/guardian.pl -c /etc/guardian.conf &
Si buceamos en el fuente de Guardian, no encontraremos ningun scripts que nos sirva para ejecutarlo como demonio. No hay problema

El toque final viene de la mano de las daemontools, que son un conjunto de utilidades que nos permiten dejar a Guardian siempre en memoria.

Instalacion de las DaemonTools

Como siempre, descargar y decomprimir
$ cd /usr/local/src
$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
$ tar xvfz daemontools-0.76.tar.gz
$ cd admin/daemontools-0.76
$ package/install
Aunque la instalación de las DaemonTools es un proceso muy conocido, hay un detalle jodido que suele bloquear al personal. En la compilación no hay incluida una biblioteca, generando un error de compilación. Para solucionar el error tenemos que editar la línea de compilación del compilador utilizada por las daemonstools. Editamos el fichero src/conf-cc y agregamos la libreria errno.h al final de la linea gcc.
-include /usr/include/errno.h
El fichero de run utilizado para levantar guardian por la daemons tools tendria este aspecto (cat /service/guardian/run)

#!/bin/bash
export PATH=$PATH:/usr/local/guardian
/usr/local/guardian/guardian.pl -c /etc/guardian.conf
Sobre Daemonstools me podría extender mucho más, pero lo mejor es acudir a su web http://cr.yp.to/daemontools.html que explican mucho mejor que yo como utilizarlas.


No hay comentarios:

Publicar un comentario