Mostrando entradas con la etiqueta Snort. Mostrar todas las entradas
Mostrando entradas con la etiqueta Snort. Mostrar todas las entradas
Entendiendo OSSIM + Cambiar el intervalo de borrado de entradas SIEM!
Hace un tiempo empecé a notar una peculiaridad en los datos que me mostraba OSSIM. Como siempre miro reportes del último día o de la última semana, no me había percatado de que el dato más viejo que poseía era de sólo 5 días atrás! luego de un gran "WTF!?" empecé a buscar la causa.
Googlie hasta hartarme y no encontré nada al respecto, ni en foros ni en listas (a veces resulta muy limitada la información de OSSIM), así que empecé a buscar en todo archivo de configuración de OSSIM.
Desgraciadamente no encontré absolutamente nada en los archivos de configuración, así que tuve que hacer una búsqueda más compleja y empecé a mirar código.
Sabía que los logs de snort están, porque en /var/log/snort tengo logs desde le día que instalé OSSIM. Entonces me pregunté, de dónde lee los datos OSSIM??? si los logs están, es obvio que no los está leyendo de ahí. También sabía que existe una base de datos para snort y que en la tabla acid_events se encontraban los eventos, pero sólo de 5 días. El último dato que tenía es que OSSIM utiliza el programa BASE para mostrar los resultados de snort, el cual a su vez utiliza la base de datos "snort".

Por lo anterior, me dije a mi mismo, si los logs de snort están, entonces por qué no accederlos directamente? pero al abrir uno de estos logs, me encuentro con que están en binario.
Haciendo un "ps ax | grep snort" encontré que snorg se ejecuta con las siguientes opciones:
/usr/sbin/snort_eth0 -m 027 -D -d -l /var/log/snort -u snort -g snort -c /etc/snort/snort.eth0.conf -S HOME_NET=[redes-configuradas-en-snort.debian.eth0.conf] -i eth0
Los parámetros me dicen que se ejecuta como demonio (-D), con usuario snort (-u) y grupo snort (-g); los logs se crean con máscara 027 (-m) y se guardan en /var/log/snort (-l); la configuración la toma de /etc/snort/snort.eth0.conf (-c); se vuelcan los datos de aplicación (-d); la interfaz utilizada es eth0 (-i) y se setea la variable HOME_NET (a partir de los parámetros en snort.debian.eth0.conf).

Ok, eso no me ayuda mucho con mi interrogante. Mirando el archivo de configuración de snort, encuentro que los logs se guardan en formato unified2:
output unified2: filename snort_eth0, limit 128
Y qué es este formato? uno creado por la gente de snort y para el cual no encontré programa que lo muestre por pantalla... Algunas referencias para entender este formato son Understanding Snort's Unified2 output, y Dissecting Snort's Unified Logging Structures.
Entonces, si no encuentro programa para abrir estos logs, cómo lo hace OSSIM? Una vez más, en google no encuentro mucho, así que a revisar código...
Por lo que encontré, OSSIM está escrito en perl, python, bash y php (la mágia del open source, cada uno programa en lo que se le antoja), esto no ayuda mucho a alguien que quiere encontrar algo en el código, pero bueno a buscar.
El código de los agentes los pueden encontrar en /usr/share/ossim-agent/ossim_agent/. El principal es Agent.py, el cual simplemente crea los agentes específicos de cada programa, loguea problemas y queda a la espera de resultados. Los que a mi me interesan son ParserUnifiedSnort.py y ParserSnort.py, en los cuales se hace el parseo. Estos Scripts están pendientes de nuevas entradas en los logs de snort y envían mensajes al server OSSIM para que los agregue en sus tablas. Como notarán, esto hace a snort totalmente independiente de OSSIM, snort simplemente loguea.
Luego de leer bastante código, me di cuenta de que no iba a llegar a ningún lado, a menos de que me pusiera a modificar. Así que retomé la busqueda en la base de datos. Al ser BASE el programa que lee los datos, busqué si era éste el que borraba entradas en la tabla, pero después de varios greps, no encontré consultas DELETE sobre la tabla que me interesa, así que abandoné.

Cuando ya estaba bastante podrido de leer estructuras de tablas y programas en python y php, por suerte Javi me iluminó con algo bastante obvio, pero que no se me había ocurrido. Como el reporte más antiguo que tenía comenzaba exactamente a las 00:00:00 de un dado día, Javi planteó "debe ser un programa que ejecuta cron"... cierto!
Rápidamente hice algunos greps en los directorios del cron y me encontré con el bendito script, éste escrito en perl: /etc/cron.daily/acid-backup

Luego de debuggear un buen rato este script (no hay nada de info en google), encontré lo siguiente:
* OSSIM hace backups de las tablas de la base de datos snort y de la propia OSSIM todos los días y los guarda en el directorio /var/lib/ossim/backup (ja capaz lo iba a encontrar... a quién se le habrá ocurrido meter backups en /var/lib??? es totalmente ilógico!!!)
* los dumps de la base de datos de snort se guardan en archivos llamados insert-.sql.gz
* los dumps de la base de datos ossim se guardan en archivos llamados ossim-backup_.sql.gz
* existe una ventana de tiempo para mantener logs (esto ya lo sabía). Logs más viejos que el intervalo de la ventana se borran utilizando DELETES en las correspondientes tablas. ---> por fin lo encontré!
* los datos del tamaño de la ventana, el path del backup y otros, usados para hacer el backup, los saca de la base de datos. Para encontrar precisamente de dónde, tuve que hacer más greps hasta dar con el archivo /usr/share/ossim/include/classes/Config.inc (este escrito en php), en el cual se ve que toma los datos de la tabla config de la base de datos ossim.
Luego de esto, los sentidos me guiaron hasta la interfaz web, donde encontré que se puede configurar esta ventana desde Configuration -> Main -> Backup
OK problema resuelto, ya sé por qué no tenía logs más antiguos a 5 días y se dónde modificar este comportamiento (Configuration -> Main -> Backup). También se que puedo utilizar los backups diários para levantar la base de datos de cualquier día (/var/lib/ossim/backup/).
En el camino entonces aprendí un poco de cómo es la interacción entre snort y OSSIM, algo que no tenía del todo claro.
Un paper interesante sobre el flujo de datos en OSSIM es OSSIM data flow.

En resumen, final feliz, fue un trabajo interesante, aunque hubiera preferido encontrar alguna documentación al respecto y no tener que andar haciendo de investigador. Por ello, espero que esto le sirva a futuros incursionistas en OSSIM que tengan el mismo problema y que no encuentren información al respecto.
Instalación y configuración de OSSIM (alias "The Perfect Setup")
Después de hacer una introducción a esta interesante herramienta de monitoreo, y ya teniendo en mente los programas que utiliza y qué función desempeña cada uno, podemos comenzar a instalar y configurar el sistema. Para el que se perdió las entregas anteriores, pueden leer el completo review que hice de OSSIM en los siguientes links: Parte I, Parte II, y Parte III.
Si bien la instalación es tan simple como la de cualquier otra distribución, la configuración no lo es tanto. Todo va a depender de la red que estamos monitoreando y de las funciones que deseamos utilizar.
En este artículo voy a plantear la configuración que realicé en el sistema de mi empresa, pero puede que no se adapte a toda red. La realidad es que no existe una receta mágica, y uno se va dando cuenta de lo que necesita alertar y lo que desea obviar una vez que tiene el sistema sniffeando.
Lo que planteo a continuación es una lista de pasos de configuración que realicé, a partir de la observación y la lectura de muchos manuales/artículos/tutoriales. Hace más de dos meses que utilizo OSSIM y todavía queda mucho por aprender. La idea es tener un sistema seguro, que alerte sólo lo que necesitamos.

El artículo inicial lo escribí hace más de un mes, pero como era extremadamente extenso y muchos temas se podían tratar por separado, decidí partirlo en varios artículos genéricos, como el uso de NTP, la activación de HTTPS, la configuración de Snort, las modificaciones a Oinkmaster y las actualizaciones automáticas. En este artículo haré referencia a ellos en el caso que la explicación lo requiera.


Configurar switch para monitorear

Para poder monitorear, primero tenemos que ser capaces de recibir el tráfico que nos interesa. En redes switcheadas, si todo va bien, sólo veremos el tráfico dirigido a la máquina conectada, y el tráfico broadcast. Esto por supuesto no nos sirve si queremos monitorear varios servidores o la red completa.
Por suerte los switchs vienen preparados para realizar monitoreo. No se de otras marcas, pero los Cisco ofrecen dirigir el tráfico de otros ports a un dado port. Es decir, es posible enviar al port donde está conectada nuestra máquina monitor todo el tráfico de otros ports.

Los comandos a ejecutar para realizar esta tarea son muy simples. Debemos definir una sesión de monitoreo, y asignar los ports fuentes y el port destino (nuestra máquina monitor).
Suponiendo que tenemos nuestra máquina monitor en el port GigabitEthernet 0/1, y que deseamos monitorear los ports Gi0/4, Gi0/5 y Fa1/7, los comandos a ejecutar serían:
switch(config)# monitor session 1 destination interface G0/1
switch(config)# monitor session 1 source interface Gi0/4, Gi0/5
switch(config)# monitor session 1 source interface Fa1/7
Listo, ya podemos monitorear =)


Instalando OSSIM

OK, el paso más simple será descargar e instalar OSSIM en la máquina destinada a monitoreo.
La descarga la pueden realizar en la sección download de la página de alienvault. La primer decisión que deberán tomar es si instalar la versión de 32 o la de 64 bits. Mi recomendación es que si tienen un procesador de 64bits, instalen la versión de 64bits. Esta versión aprovechará mejor los recursos, y a pesar de la creencia general, las distribuciones de 64bits no ocasionan problemas. Yo utilizo debian de 64bits hace más de 3 años, y no he tenido ningún inconveniente.

El requerimiento de hardware dependerá de la cantidad de hosts a monitorear, y las herramientas de monitoreo que activen. La gente de alienvault recomienda tener una máquina con un mínimo de 2GB de RAM, y por supuesto, una placa de red de 1 Gbit. No hacen ninguna referencia al procesador o al disco, pero por mi experiencia recomendaría como mínimo un Core 2 Duo o un Athlon X2 de 2GHz, y 500GB de disco (realmente se generan muuuuchos logs). Si bien con 2GB de RAM, y desactivando algunos monitoreos, el sistema puede sobrevivir, les recomiendo que se gasten en tener 4GB, así utilizan menos swap y aceleran el sistema.

Los pasos de la instalación son tan simples como el de cualquier distribución basada en debian. Igualmente pueden encontrar una guía en la misma página de OSSIM.


Pasos iniciales

Una vez terminada la instalación, se encuentran con que el sistema inicia en modo consola. Si bien pueden instalar algún entorno gráfico, no creo que valga la pena, simplemente sobrecargarán al ya sobrecargado sistema (a menos que tengan un server con recursos de sobra). Además el sistema funciona completamente por Web, solamente la configuración inicial requerirá que utilicen la consola.

Como bien dije, las herramientas más importantes se visualizan por Web. Por un lado tienen el OSSIM, y por otro Ntop. Si bien Ntop está (al igual que el resto de las herramientas), embebido en las secciones del OSSIM, pueden accederlo directamente a través del port 3000. Ntop no corre sobre apache, sino que ejecuta su propio servidor Web. Les recomiendo que utilicen esta interfaz porque Ntop trae muchísima información que no es desplegada dentro de OSSIM.

Para el resto de la configuración no necesitan estar sentados frente a la máquina monitor, sino que pueden accederlo remotamente a través de SSH, el cual ya viene instalado y funcionando. Claro está que les recomiendo tener siempre un teclado y monitor a mano, porque cuando configuremos el firewall, puede que perdamos la conexión remota =P


Configurar el firewall

OSSIM por defecto trae una configuración de iptables que nos permite acceder a los servicios más importantes (SSL, HTTP y HTTPS), pero obviamente al no conocer de antemano las IPs que tienen permitido el acceso, utiliza una política permisiva que debemos cambiar.
El script que inicia/detiene/reinicia el firewall es /etc/init.d/ossim-firewall. En este script encontrarán que OSSIM realiza un restore de las reglas ubicadas en /etc/ossim_firewall, así que debemos tocar este último archivo.
En ossim_firewall encontrarán, como les anticipé, que las políticas default son ACCEPT. Antes de cambiar esto, debemos modificar las reglas que nos permiten acceso, porque sino, perderemos la conexión (a quién no le ha pasado alguna vez =)).
Para cada servicio utilizado, debemos agregar las IPs desde las que se lo puede acceder. En nuestro caso, remotamente solo accederemos a través de SSH, HTTP, HTTPS, y Ntop, mientras que permitiremos a MySQL que acceda localmente.
Suponiendo que la IP de la máquina monitor es 192.168.1.30 y que permitimos el acceso desde la IP 192.168.1.2, las reglas deberían quedar como las siguientes:
# permitimos ssh
-A INPUT -s 192.168.1.2 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# aceptamos que MySQL se conecte localmente
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -s 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -s 192.168.1.30 -j ACCEPT

# permitimos HTTP
-A INPUT -s 192.168.1.2 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

# permitimos HTTPS
-A INPUT -s 192.168.1.2 -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# permitimos Ntop
-A INPUT -s 192.168.1.2 -p tcp -m state --state NEW -m tcp --dport 3000 -j ACCEPT
Ahora que ya sabemos lo que vamos a permitir, rechacemos todo el resto. Para ello, modificamos las políticas default, cambiando las líneas
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
por
:INPUT DROP [0:0]
:FORWARD DROP [0:0]


Habilitar NTP

Si tenemos una red de mediana a grande, probablemente tengamos configurado algún servidor NTP (sobre todo si están en un entorno Windows Active Directory).
Tal como anticipé en la introducción, hace uno días publiqué cómo configurar el sistema como cliente NTP en el artículo Configurar NTP en GNU/Linux. Se aplica exactamente lo mismo en OSSIM.


Habilitando HTTPS


En la instalación default, OSSIM no provee seguridad para acceder a su interfaz Web, simplemente transmite los datos a través de HTTP. Absolutamente todo fluye a través de HTTP, incluso las credenciales de acceso al server. Por ello, el primer paso a realizar es activar HTTPS.
Al igual que en el caso de NTP, hace un tiempo publiqué un artículo que explica cómo habilitar HTTPS en Apache y sobre cómo forzar el uso de SSL. Me remito entonces a tal artículo porque se aplica lo mismo en este caso: Activar HTTPS en Apache + Forzar SSL.


Deshabilitar servicios

Si bien todas las herramientas tiene su utilidad, puede que no necesitemos todas, y si no las necesitamos, es mejor desactivarlas para que no consuman valiosos recursos.
En mi caso, encontré que las herramientas que detectan servicios en la red no eran necesarias, debido a que conozco los dispositivos que se encuentran conectados, y el gasto de recursos que suponían no valía la pena. Por esto, desactivé las herramientas pads y p0f.
Pads me resultó llamativo por el consumo de CPU. Estando pads activado, la utilización de CPU estaba siempre al 100%, con pads encabezando la lista con alrededor de un 97% de utilización. Realmente este alto consumo no justificaba una funcionalidad que puedo realizar con nmap.
P0f no consume tantos recursos pero si genera muchos logs del tipo "se encontró que una máquina tiene el mismo sistema operativo que antes", es decir, mensajes totalmente inútiles que llenan logs y fastidian la vida de la persona que los lee.
A su vez, dado que el administrador de dominio de la red ya cuenta con otras herramientas para monitorear los hosts, también deshabilité el Nagios.

Para desactivar herramientas, primero eliminamos los links desde los diferentes rc* para que no se inicien cada vez que arrancamos el sistema:
# update-rc.d pads remove
# update-rc.d nagios3 remove
También necesitamos eliminar los servicios de la lista de servicios levantados por OSSIM. Esto lo hacemos comentando las líneas correspondientes en /etc/ossim/agent/config.cfg, en la sección [plugins]:
#p0f_eth0=/etc/ossim/agent/plugins/p0f_eth0.cfg
#pads_eth0=/etc/ossim/agent/plugins/pads_eth0.cfg
La anécdota con este último paso es que si no lo realizamos, cada vez que matamos un servicio, OSSIM lo vuelve a revivir! (servicio Highlander como suele llamarlo Javi).

Ahora sí, estando seguros de que nadie revivirá los servicios, los detendremos con su correspondiente script en /etc/init.d, o bien ejecutamos un kill:
# /etc/init.d/pads stop
# /etc/init.d/nagios3 stop
# killall p0f_eth0


Mantener el sistema actualizado

Algo que es extremadamente importante es mantener el sistema actualizado. Esto permite mantener el sistema seguro, parchando vulnerabilidades.
Tal como les expliqué en el artículo Actualizaciones automáticas de seguridad en GNU/Linux, realizar actualizaciones automáticas pueden provocar inestabilidad y por ello es recomendable aplicar automáticamente sólo actualizaciones de seguridad. En el artículo citado les comento cómo hacer esto con la herramienta unattended upgrades.

Además de las actualizaciones de seguridad, también necesitamos mantener actualizadas las reglas de nuestro snort. Los temas relacionados a la configuración de snort los traté en el artículo Customizando Snort (). Particularmente el tema de actualizar reglas lo pueden encontrar rápidamente en la sección "Mantener Snort actualizado" de dicho artículo.

Cuando se actualizan las reglas de snort, si queremos que OSSIM las detecte debemos ejecutar un script en perl que mapea reglas con entradas en la base de datos del OSSIM (ver Install Oinkmaster and update snort rules):
perl /usr/share/ossim/scripts/create_sidmap.pl /etc/snort/rules/
Esto lógicamente hay que ejecutarlo cada vez que se agregan/actualizan/eliminan reglas, es decir, cada vez que Oinkmaster hace su trabajo. Por ello podemos agregar una entrada en cron que cada día actualice la base de atos:
# rebuild the sid database of ossim
perl /usr/share/ossim/scripts/create_sidmap.pl /etc/snort/rules/ 2>&1 | logger -t ossim-snort
Si leen el artículo sobre snort, encontrarán que ya había creado un script para cron que ejecute tareas relacionadas a la actualización de reglas, así que tranquilamente pueden la línea anterior a dicho script.


Acceso a la interfaz Web OSSIM

Cuando utilicen por primera vez la interfaz Web de OSSIM, se encontrarán con que les pide credenciales que ustedes nunca crearon. Pues bien, esta información la pueden encontrar rápidamente en la guía de OSSIM, pero para ahorrarles el trabajo les comento que las credenciales default son admin:admin.
Cuando se logueen por primera vez usando las credenciales anteriores el sistema les pedirá que cambien el password.


Administración de ntop

Luego de instalar OSSIM, ntop ya se encuentra en funcionamiento y podemos ver las estadísticas que arma a partir de los paquetes observados. Pero si quieren ingresar a la sección "Admin", no van a poder porque requiere un password que nunca asignamos. El password lo podemos asignar desde la consola ejecutando el comando:
# ntop -A
En particular, necesité acceder a las preferencias de la sección Admin para setear el path al programa dot, el cual se encarga de graficar la conexión entre nodos. El gráfico lo pueden ver en "IP -> Local -> Network Traffic Map", eso si, si logran entender algo, es un milagro =P


Corregir Nagios

Si decidieron utilizar Nagios, se van a encontrar con un problema. No investigué demasiado, pero alguno de los programas que descubren hosts, los va agregando automáticamente a Nagios para poder realizar el seguimiento. El problema está en que no realiza correctamente la configuración, porque los agrega en un archivo pero no crea la definición del host.
Por ejemplo, el programa descubre un host que escucha en el port 445, entonces agrega el host a hostgroup-services/port_445_Servers.cfg. Ese archivo define grupos de host que escuchan en el port 445. Hasta aca todo bien. Pero como no crea una definición para el host, cuando Nagios intenta leer la configuración, arroja un error del estilo "Error: Could not find any host matching '<IP>' (config file '/etc/nagios3/conf.d/ossim-configs/hostgroup-services/port_445_Servers.cfg', starting on line 1)".
Para que Nagios vuelva a funcionar debemos, o bien quitar de port_445_Servers.cfg la IP del host, o bien crear una definición para el Host. Las definiciones de Hosts están agrupadas en /etc/nagios3/conf.d/ossim-configs/hosts/. Pueden agarrar algún archivo de host ya configurado como base, copiarlo y cambiar la IP. El formato de los archivos que definen hosts es:
define host{
host_name <IP>
address <IP>
use generic-host
}
Deberán generar uno de estos archivos por cada host que tengan en la red. También pueden agregar varias definiciones en un mismo archivo, lo de separarlos es por seguir el funcionamiento de OSSIM.


Desactivar alertas molestas

Como menciono al principio del artículo, OSSIM funciona bien apenas lo instalamos, pero es necesario customizarlo para que nos alerte lo que necesitamos. Las configuraciones default nunca son buenas, y este no es un caso especial. Apenas conecten la máquina a la red para monitorear, van a notar una montaña de alertas con falsos positivos. En mi caso, en dos días monitoreando 8 servidores el log creció 40GB! así no hay disco que aguante. Lo bueno es que uno puede reconocer rápidamente cuáles son los falsos positivos más recurrentes y desactivarlos.

Recuerden que en OSSIM se muestran las alertas de todas las herramientas que corren por debajo, como ser snort, OSSEC, p0f, pads, arpwatch, etc. Por supuesto que el que genera la mayor cantidad de alertas es snort. El segundo en generar alertas molestas es OSSEC. Por ello voy a tratar estas dos herramientas en particular.


Configurar snort

Snort es probablemente la herramienta más importante dentro de OSSIM, pero también la más compleja. Con ella perdi la mayor cantidad de tiempo, monitoreando alertas, buscando y aprendiendo lo que reportaban y desactivando lo que no necesito.

En el artículo Customizando Snort traté todos los temas relacionados a esta herramienta, incluída la desactivación de alertas y la configuración de preprocesadores. Me remito entonces a tal artículo.
Lo único que deben tener en cuenta al leer el artículo es que OSSIM genera un archivo de configuración por cada interfaz de red que utilicemos para monitorear. Por ejemplo, si deseamos monitorear con la interfaz eth0, OSSIM genera y utiliza el archivo de configuración /etc/snort/snort.eth0.conf en lugar del clásico snort.conf. A su vez, como explico también en el artículo de snort, los paquetes snort de debian utilizan las variables configuradas en snort.debian.conf, que en OSSIM están en archivos dependientes de la interfaz (tomando como ejemplo eth0, el archivo se llamará snort.debian.eth0.conf).

Algo que también me llamó la atención es el hecho de tener dos binarios para el snort. Por un lado tenemos el común "snort", y por otro uno llamado "snort_eth0". En el caso de tener más placas de red, tal vez OSSIM habría creado un tercer binario llamado snort_eth1, pero no pude encontrar información al respecto, así que no puedo asegurarlo. No descubrí diferencias entre los binarios snort y snort_eth0, incluso calculé los hashes md5 y dan igual... si alguien tiene idea de cuál es el sentido de tener dos binarios, agradeceré comentarios. La teoría de Javi es que esta distinción entre nombres es para que cuando se listan procesos (por ejemplo usando top), uno pueda ver rápidamente en qué interfaz está escuchando cada proceso de snort.


Personalizar alertas en OSSEC

OSSEC se mostró incordioso con los errores en los logs. Básicamente OSSEC busca expresiones regulares en los logs y cuando detecta patrones extraños, los reporta. También posee otras funcionalidades, pero ésta es la que más se utiliza por default en OSSIM.
Luego de observar un rato los alertas en OSSIM, descubrimos rápidamente el error "Unknown problem somewhere in the system" por destacarse en cantidad de apariciones. Este error para nada descriptivo lo arroja OSSEC cuando detecta la presencia de palabras como error, failure, failed, en los logs, y no existe alguna regla que entienda el error. Esto es, una regla detecta la palabra error, si no existe otra regla que detecte un patrón conocido en esa línea, se arroja el error "Unknown problem somewhere in the system" porque no sabe con qué está lidiando, sólo sabe que es un error.

En el caso de mi monitor, encontré que había muchos errores del tipo "Error reading channel stat information. Missing key" en syslog, y por ello saltaba la alerta. La regla que dispara esta alerta está ubicada en /var/ossec/rules/syslog_rules.xml y tiene el siguiente formato:
<rule id="1002" level="2">
<match>$BAD_WORDS</match>
<options>alert_by_email</options>
<description>Unknown problem somewhere in the system.</description>
</rule>
donde $BAD_WORDS es "core_dumped|failure|error|attack|bad |illegal |denied|refused|unauthorized|fatal|failed|Segmentation Fault|Corrupted". Como no me interesa llenar mi pantalla de monitoreo con este tipo de errores, decidí crear una regla que se abstenga de reportar.

Escribir reglas para OSSEC es relativamente sencillo, posee un poderoso motor de expresiones regulares, así que podemos crear reglas complejas. El formato es XML, así que cualquiera puede adaptarse rápidamente.
Al igual que snort, poseemos un archivo donde agregar reglas definidas por nosotros, el cual es /var/ossec/rules/local_rules.xml.
La regla que definiré no reportará el error si la expresión regular coincide con el error "Error reading channel stat information. Missing key" y el programa que la reporta es nfsen:
<rule id="101002" level="2">
<if_sid>1002</if_sid>
<program_name>^nfsen</program_name>
<regex>Error reading channel stat information. Missing key \s+</regex>
<options>no_email_alert</options>
</rule>
Como observan, el nuevo id es diferente al original. De esta forma, primero matchea la primer regla, pero como hay una regla que dice no alertar estos casos, entonces no lo hace.

Pueden leer más sobre customizar reglas OSSEC en Why does ossec send me so many emails?. Me resultó interesante la frase que citan en el mismo: "To keep ossec useful and yourself sane you need to do some tunning to keep the signal to noise ratio high" =)

Para aprender más sobre OSSEC, vean el FAQ donde pueden encontrar mucha ayuda.


FIN (fin?)

Ya escribí 4 artículos sobre OSSIM (y 5 más que surgieron durante la configuración) y todavía no se si he finalizado o no de analizar esta distribución. Las herramientas que trae son grandiosas, pero requieren de bastante configuración para que se adapten correctamente a nuestras necesidades.
Sin dudas snort es la herramienta más importante y merece un buen estudio, leyendo sus manuales, aprendiendo sobre sus reglas y preprocesadores. Pero así como es de grandiosa es de molesta. Si no está correctamente configurada, tendremos miles de logs inútiles que nos darán un buen dolor de cabeza. Lo bueno es que el código está ahí, ustedes pueden deshabilitar/modificar/agregar reglas de forma muy simple!

Es claro que la configuración que presenté en este artículo está adaptada a las necesidades de mi empresa, pero creo que es lo suficientemente general para adaptarla a la mayoría de las empresas/instituciones, por lo que espero que les sea de mucha utilidad.
Lo que planteo en este artículo tiene muchas horas de investigación, prueba y error, lectura de manuales/blogs/tutoriales/etc. Muchas horas de enojos cuando algo no sale y satisfacción cuando las cosas andan.

Espero haber brindado con esta seguidilla de artículos una especie de guía, algo que yo no tuve, recopilando información y a la vez aportando experiencias y datos que no encontré en ningún lugar.
Customizando Snort
Como mencioné en la primer parte del review de OSSIM, Snort es el mejor y más completo IDS que existe, pero también es bastante complejo. Lograr que la herramienta reporte lo que deseamos requiere de tiempo de análisis monitoreando alertas, buscando y entendiendo lo que reporta y desactivando lo que no necesitamos.
Configurarlo no es cosa de un día, sino una tarea que haremos mientras lo utilicemos. Uno no puede conocer todas las alertas de antemano (son miles), sino que las va conociendo a medida que reportan algo. Lo bueno es que con una buena configuración inicial, los toques que tendremos que hacer en el día a día son mínimos o nulos.
El siguiente artículo resume el trabajo que realicé a lo largo de casi un mes de lidiar con Snort y espero que les ahorre tiempo al momento en que decidan instalar la herramienta. Si bien la mejor forma de aprender es peleando con el sistema, espero que los consejos que doy en esta especie de "guía de configuración" les evite perder tiempo por no haber tenido en cuenta ciertas cosas, como por ejemplo, una buena configuración de snort.conf.


Información previa a la configuración

Antes de comenzar a configurar snort es necesario que conozcan bien cuáles son sus redes locales, cuáles son las direcciones IP de sus servidores, y en cuáles redes confiamos para que accedan a nuestros servidores.
Si en la red, la salida a internet es a través de uno o varios Proxy, tengan a mano las direcciones IP de estos también, ya van a ver por qué.
También es necesario conocer bien las políticas de la empresa. Por ejemplo, utilizar MSN en algunas empresas está permitido y en otras no. Si está permitido, muchas alertas de snort pueden resultar molestas y hay que desactivarlas.
Tengan a mano el manual oficial de snort: Snort User Manual. Es muy completo y lo van a necesitar para entender cómo funcionan las reglas y los preprocesadores. Creo que la parte más jugosa del manual es la de los preprocesadores porque no son tan simples de entender como las reglas.


Mantener Snort actualizado


Para estar al día con los problemas que van surgiendo necesitamos mantener actualizadas las reglas de nuestro snort. Si recuerdan, snort utiliza un conjunto de reglas y de preprocesadores para analizar el tráfico de red. Las reglas se van actualizando a medida que se descubren ataques, o se crean políticas para evitar ciertos dominios. Por ello, necesitamos actualizar las reglas para estar al día.

Para automatizar la descarga de reglas utilizaremos Oinkmaster. Oinkmaster es un script escrito en perl que nos permite descargar las nuevas reglas de forma automática y realizar algunas acciones sobre ellas, como deshabilitarlas, obviarlas, o incluso modificarlas. Esto es extremadamente útil porque durante la customización de las reglas, puede que modifiquemos reglas, o que las eliminemos y no queremos que al realizar la actualización nos pisen nuestras reglas adaptadas con las nuevas descargadas!
Por suerte el paquete oinkmaster está incluido en debian y derivados, así que simplemente debemos instalarlo:
# apt-get install oinkmaster
Debido a que ahora Snort cobra por las reglas que crean, debemos utilizar el conjunto de reglas realizadas por la comunidad. Si bien estas reglas comunitarias son gratuitas, la gente de Sourcefire (empresa detrás de Snort) requiere que el usuario se registre en su página para obtenerlas. Una vez registrados entramos a la sección "rules" y generamos un Oinkcode. El Oinkcode permite armar la URL desde la cual descargamos las reglas. El formato de la URL es:
http://www.snort.org/pub-bin/oinkmaster.cgi/<oinkcode here>/<filename>
donde filename es el nombre del archivo armado a partir de la versión de snort que tengamos, por ejemplo snortrules-snapshot-2851.tar.gz
Una vez armada la URL, editamos el archivo /etc/oinkmaster.conf colocando nuestra URL de descarga:
url = http://www.snort.org/pub-bin/oinkmaster.cgi/<oinkcode here>/<filename>
Por defecto cuando instalamos oinkmaster no se agrega la entrada correspondiente en cron, así que si queremos que se ejecute diariamente, creamos un script bash en /etc/cron.daily/ que ejecute la actualización del oinkmaster:
#!/bin/bash

# check for snort updates with oinkmaster
oinkmaster -o /etc/snort/rules/ -b /data/snortback 2>&1 | logger -t oinkmaster

# replace rules to reflect a proxy in the lan - comment out if you don't have a proxy y your lan
# /usr/sbin/snort_proxy-fixer 2>&1 | logger -t snort_proxy-fixer
La última línea ejecuta un script que explicaré luego, pero básicamente reemplaza reglas para reflejar que existe un proxy en la red.
Como les mencionaba anteriormente, Oinkmaster nos permite mantener deshabilitadas reglas, o bien deshabilitarlas si las actualiza. Para hacer que la actualización no vuelva a habilitar las reglas que deshabilitamos, podemos agregar en oinkmaster.conf los SIDs de las reglas deshabilitadas. Por ejemplo, si queremos mantener deshabilitada la regla cuyo SID es 1411 (regla public SNMP), agregamos el sid en la línea:
disablesid 1411
Cabe aclarar en este punto que Oinkmaster sólo procesa las reglas que descarga, y si se han modificado con respecto a las que ya tenemos. Es decir, si seteamos para que Oinkmaster deshabilite la regla cuyo SID es 1411, sólo lo hará si el nuevo archivo que contiene dicha regla va a pisar al que ya teníamos. Por lo tanto, si no existen modificaciones en el archivo, Oinkmaster no lo procesa. Les aclaro esto porque Oinkmaster no sirve para deshabilitar reglas, a menos que las reglas se tengan que actualizar.
En resumen, si quieren deshabilitar reglas, haganlo sobre las reglas actuales, y agreguen el SID en disablesid para que Oinkmaster no las habilite cuando las actualiza.

Les resultará útil leer la documentación de Oinkmaster: Oinkmaster README.

Por si alguno no lo leyó, hace un tiempo publiqué una optimización para Oinkmaster que permite agragar rangos de sid en los parámetros disablesid, enablesid y localsid, algo que ahorra tiempo cuando queremos, por ejemplo, desactivar varias reglas dentro de un dado rango. Pueden ver la modificación y la forma de agregarla en el artículo Nueva característica para Oinkmaster.


snort.conf

Lo primero que deben hacer al configurar snort, es prestar mucha atención (si, mucha) al archivo de configuración. En el default de snort, el archivo suele ser /etc/snort/snort.conf, pero si tenemos más de una interfaz de red, conviene crear uno por cada interfaz. Por ejemplo OSSIM mantiene tanto snoft.conf como snort.eth0.conf.
Algo a tener en cuenta en las distribuciones basadas en debian es que el script que inicia snort (/etc/init.d/snort) toma como parámetros las variables configuradas en /etc/snort/snort.debian.conf. En ese archivo se debe especificar cuáles son las redes locales en la variable DEBIAN_SNORT_HOME_NET. Esta variable se utiliza como la variable HOME_NET en snort, la cual indica a las reglas cuáles son las redes locales. Realmente me llamó mucho la atención (y me costó un rato de trabajo) el hecho de configurar las redes locales en snort.debian.conf, cuando esto se suele hacer en el archivo snort.conf. El script de inicio de snort no "presta atención" a la HOME_NET configurada en snort.conf porque directamente pasa por parámetro lo obtenido del archivo snort.debian.conf. Me parece horrible tener dos archivos que definen las mismas variables, porque lleva a confusión. Claro que podemos cambiar esto si editamos el script /etc/init.d/snort.

Existe el caso peculiar de la red 169.254.0.0/16 (o direcciones link-local), la cual está designada para autoconfiguración de las máquinas cuando no existe un servidor dhcp. Si la máquina no tiene IP fija y no encuentra servidor DHCP, se auto-asigna una IP de ese rango (configuración default en los Windows). A estas IPs se las podría considerar como local porque es imposible que llegue un paquete externo con alguna de ellas, dado que los routers no los reenvían. Me ocurrió de tener una altísima cantidad de alertas por una máquina que no se asignó IP y enviaba pedidos al proxy con una link-local. Teniendo esta red en la HOME_NET elimina el problema.

Configurar cuáles son las redes locales es muuuuy importante, porque luego dependiendo de éstas, snort dispara alertas o no. Es decir, no es lo mismo recibir una conexión CIFS (protocolo de compartición de archivos de Microsoft) desde una red local que desde una red externa, la primera es considerada tráfico normal, mientras que la segunda se puede considerar un ataque y se dispara una alerta. Si revisan un poco las alertas de snort, verán que la mayoría de las reglas tienen el formato "$HOME_NET port_orig -> $EXTERNAL_NET port_dest" o bien "$EXTERNAL_NET port_orig -> $HOME_NET port_dest", es decir, se dispara alertas en caso de tráfico interno externo y externo interno.
En el default $EXTERNAL_NET está definido como todo lo que no es $HOME_NET, lo cual encaja con la idea y sirve para la mayoría de los casos. Si en el monitoreo que desear realizar esto cambia, presten atención también a esta variable.


Variables

Habiendo aclarado el tema de los archivos de configuración, veamos un poco las variables que podemos tocar:
- DEBIAN_SNORT_HOME_NET (/etc/snort/snort.debian.conf): es la variable más importante, donde definiremos cuáles son las redes locales.
- HOME_NET (/etc/snort/snort.eth0.conf): al igual que DEBIAN_SNORT_HOME_NET, setea las redes locales, pero como les expliqué, en el paquete de debian el script de inicio obvia esta variable y utiliza en su lugar la otra.
- EXTERNAL_NET (/etc/snort/snort.conf): suele definirse como todo lo que no es la home net. A menos que necesiten explicitar algo distinto, dejen esta configuración como está, es decir "EXTERNAL_NET !HOME_NET".
- DNS_SERVERS, SMTP_SERVERS, HTTP_SERVERS, SQL_SERVERS, FTP_SERVERS, SNMP_SERVERS (/etc/snort/snort.conf): define cuáles son los servidores DNS, SMTP, HTTP, SQL, FTP y SNMP respectivamente. Siempre que quieran definir un grupo de IPs o ports, utilicen corchetes []. Por ejemplo, si decimos que los servidores HTTP son 192.168.1.81 y 192.168.1.82, la notación será HTTP_SERVERS [192.168.1.81, 192.168.1.82]. También pueden definir redes enteras con notación CIDR en estas variables.
- HTTP_PORTS, ORACLE_PORTS, FTP_PORTS (/etc/snort/snort.conf): define los ports en los que escuchan nuestros servidores HTTP, ORACLE y FTP. Algunas reglas toman estos parámetros como indicativo que tráfico de estos protocolos a otros ports son ataques.


Preprocesadores

Teniendo declaradas las variables, pasemos a configurar los preprocesadores.
Como les mencionaba en el artículo donde describí snort, éste provee reglas y preprocesadores. Los preprocesadores permiten modificar o analizar los paquetes de forma más completa que usando reglas.

En mi caso particular necesité modificar la configuración de 3 preprocesadores: ssh, http_inspect, sfportscan y Frag3. Las modificaciones son simples, aunque toma tiempo leer los manuales de los preprocesadores para entender lo que reportan y cómo configurarlos.
Veamos entonces una breve descripción y las modificaciones que realicé en cada preprocesador:

- ssh: busca anomalías en las comunicaciones SSH y las reporta. Tiene varias opciones que permiten detectar distintos tipos de ataques overflow conocidos, y detectar payloads que no cumplen con las especificaciones del protocolo (por ejemplo tamaños, dirección del tráfico, etc).

El problema con este preprocesador es que reporta continuamente el error "ssh: Protocol mismatch", el cual es una alerta disparada en los casos que detecta que la versión SSH del cliente es distinta a la del servidor (SSH v1 o v2). Ejecutando la misma versión en cliente y servidor, esta opción del preprocesador (enable_protomismatch) me seguía alertando, y buscando encontré que hay un bug. Por esto decidí deshabilitarla.
Desactivar la opción es tan simple como borrarla de la configuración. Es decir, ahora el preprocesador debería quedar algo como:
preprocessor ssh: server_ports { 22 } \
max_client_bytes 19600 \
max_encrypted_packets 20 \
enable_respoverflow enable_ssh1crc32 \
enable_srvoverflow enable_protomismatch
donde como ven, no está "enable_protomismatch.
Pueden ver el manual del preprocesador SSH en el README.

- sfPortscan: detecta escaneo de ports buscando cierta cantidad de respuestas negativas en un dado intervalo de tiempo. Si un cliente es "legal" conocerá al port que debe conectarse, mientras que si está haciendo un escaneo, seguramente recibirá muchas respuestas negativas al encontrarse con ports cerrados. Esto es lo que sfportscan reconoce y alerta.

La configuración que realicé sobre este preprocesador es básicamente definir qué "escaneadores" ignorar. Tenía el problema que detectaba a mis servidores DNS, SMTP y Proxy como escaneadores, cuando en realidad no lo son. La razón de la detección puede ser el hecho que tanto el proxy como los servidores DNS y SMTP reciben muchos paquetes TCP con el bit RST encendido, aunque debería investigar un poco más el por qué sucede esto. El bit RST se envía cuando uno de los extremos decide terminar la conexión debido a algún fallo, y es algo que se utiliza cuando un port no está abierto, por ello portscan lo toma como respuesta negativa (alias, port scan) y lo reporta.
Sea como sea, me registraba muchas alertas falsas, así que decidí ignorar estos host. Esto lo podemos hacer agregando la opción "ignore_scanners" y registrando los host separados por coma. Por ejemplo, suponiendo que el Proxy es 192.168.1.80, el DNS 192.168.1.53 y STMP 192.168.1.22, el preprocesador debería quedar algo como:
preprocessor sfportscan: proto  { all } \
memcap { 10000000 } \
sense_level { low } \
ignore_scanners { 192.168.1.80, 192.168.1.53, 192.168.1.22 }


sfPortscan tiene muchas más opciones y probablemente les interesen varias, así que aconsejo leer el README.

- HttpInspect: decodifica el protocolo HTTP para aplicaciones del usuario. Dado un buffer de datos, HttpInspect decodifica el buffer, encuentra los campos HTTP y los normaliza. Este preprocesador permite alertar ante ciertos campos sospechosos en el protocolo HTTP.

El problema que encontré con HttpInspect es que alerta sobre codificaciones sospechosas donde los "afectados" eran servers de la extranet. Los alertas más recurrentes eran "Double decoding attack", "IIS Unicode Codepoint Encoding", "Bare Byte Unicode Encoding", y "Oversize Request URI Directory". La mayoría de los alertas son falsos positivos y se deben al funcionamiento de cada página. Debido a que me interesan sólo ataques sobre mis servers Web, y dada la cantidad de falsos positivos, es necesario modificar la configuración.

HttpInspect permite definir configuraciones diferentes para diferentes servers. Además ofrece configuraciones default llamadas "perfiles" ya personalizadas para cada tipo de server (Apache, IIS, etc). Estas configuraciones personalizadas traen activadas diferentes opciones que tienen en cuenta las características del server. Por ejemplo, hay alertas que tienen sentido si el servidor es Apache y no IIS.

Supongamos entonces que en mi red tengo un servidor Apache 192.168.1.81 y un servidor IIS 192.168.1.82. Por un lado eliminamos los alerts para todo servidor que no esté en nuestra red:
preprocessor http_inspect: global \
iis_unicode_map unicode.map 1252

preprocessor http_inspect_server: server default \
profile all ports { 80 8080 8180 } \
no_alerts
Como pueden observar, en la primer configuración seteo el mapeo unicode a 1252, esto ya viene así por defecto y conviene dejarlo. La parte interesante es donde definimos el comportamiento del preprocesador para cualquier servidor (server default). Seteamos que los posibles ports HTTP son 80, 8080 y 8180, y agregamos la opción "no_alerts" para que no envíe alertas.

Ahora que ya tenemos la configuración default, especificaremos las opciones para los servers de nuestra intranet:
preprocessor http_inspect_server: server { 192.168.1.81 } \
profile iis ports { 80 }

preprocessor http_inspect_server: server { 192.168.1.82 } \
profile iis ports { 80 }
El resultado es que el preprocesador alertará sólo si ve tráfico sospechoso sobre los servers 192.168.1.81 y 192.168.1.82.
Al igual que sfPortscan, HttpInspect provee muchas opciones, logrando alto nivel de customización. Pueden leer sobre el resto en el README.

- Frag3: observa la fragmentación de los paquetes IPs y reporta en casos de encontrar anomalías. Debido a que cada SO interpreta a su manera las secciones ambiguas de los RFC del protocolo IP, existen distintas implementaciones sobre cómo es posible fragmentar un paquete.
Gracias a esto, puede que la fragmentación de paquetes permita bypassear firewalls o IDS. Un paquete que es inválido para un sistema, tal vez es ensamblable por otro, convirtiéndolo en un paquete válido.
Uno de los ataques conocidos es fragmentar los paquetes de forma que un fragmento pise los datos que entregó un fragmento anterior, de forma de cambiar el port orígen o destino.

El problema que encontré con este preprocesador es el recurrente alert "Fragmentation overlap". Al parecer frag3 no funciona correctamente con VPNs basadas en IPSec (tal vez con otras VPNs también). No indagué más profundamente el por qué de los overlap en IPSec, pero da muchos falsos positivos.
La solución que encontré es limitar el preprocesador para que analice los paquetes cuyas IP destino no pertenecen a la VPN. Esto se puede hacer utilizando la opción "bind_to". Con esta opción asignamos las redes/IPs que queremos analizar.

Suponiendo que las IPs de mi red, no pertenecientes a la VPN son del rango 192.168.1.0/24, la configuración quedaría de la siguiente forma:
preprocessor frag3_engine: policy first detect_anomalies overlap_limit 10 \
bind_to 192.168.1.0/24
Para más información sobre Frag3, leer el README.


Desactivar/modificar reglas

OK, terminamos de configurar los preprocesadores, es hora de desactivar reglas!
Cada regla tiene su propósito y fue designada por alguna razón, pero la realidad es que muchas no tienen sentido en todas las redes. Snort les puede llenar un disco en pocas horas si no está configurado correctamente y se obvian alertas que no son necesarias.

Existen distintas formas de desactivar alertas en Snort, las cuales están explicadas en el excelente documento escrito por el creador de Oinkmaster How to stop Snort alerts from being generated / how to (not) ignore traffic.
A mi parecer, la mejor opción es comentar las reglas que no nos sirven y agregarlas en la opcion disablesid del oinkmaster.conf para que no las vuelva a activar en alguna actualización.

Las reglas que desactivé están destinadas a aplicar políticas sobre el tráfico que los usuarios tienen permitido. Como en la empresa que trabajo está permitido el acceso a webmails y el chat, éstas reglas son inútiles dado que reportan continuamente algo que ya asumimos:
- sids 2000571, 2000572, 2003121, 2003122, 2000035-2000039, 2008238-2008242, 2001424-2001426 : ubicadas en /etc/snort/rules/emerging-policy.rules, estas reglas están destinadas a reportar acceso a webmails (AOL, Hotmail, Yahoo), y google docs.
- sids 2002332-2002335, 2001241-2001243, 2001682, 2002192, 2008289, 2009375-2009376, 2001253-2001264, 2002659, 2007066-2007069: ubicadas en /etc/snort/rules/emerging-policy.rules, estas reglas reportan la presencia de programas de chat (MSN, GTalk, Yahoo IM).

Por otra parte tuve que modificar algunas reglas por generar reportes erróneos. El caso es que las reglas destinadas a detectar anomalías en el protocolo SIP (protocolo de voz), no matchean correctamente los campos que deben y generan miles de falsos positivos.
Como pueden ver en el manual de snort, las reglas tienen el formato "acción protocol IPsrc port -> IPdst port (opciones)". Existen distintas acciones posibles, siendo la más común "alert". Si bien no encontré una referencia que me diga qué sucede cuando el protocolo usado es "ip", al parecer este no funciona como los que desarrollaron las reglas SIP creían.
Las reglas que reportan errores en SIP tienen el siguiente formato: alert ip any any -> any 5060 (opciones). La idea creo que era matchear tanto paquetes tcp como udp, porque el protocolo SIP puede trabajar sobre ambos. La versión de Snort que yo tengo [2.8.5.2 (Build 121)], no interpreta las eglas de esta forma.
Por lo explicado anteriormente, y como no quería eliminar estas reglas, lo que hice fue deshabilitarlas en su archivo original (/etc/snort/rules/community-sip.rules), agregar los sids en disablesid de Oinkmaster (100000158-100000163, 100000223), y crear nuevas reglas en el archivo /etc/snort/rules/local.rules. Este último archivo está destinado a eso, para generar reglas propias, y Oinkmaster no lo pisa al realizar actualizaciones.
En local.rules agregué las mismas reglas, pero ahora dividiéndolas en tcp y udp. Por ejemplo, para la regla con sid 100000158, cree una versión tcp con el mismo sid y una versión udp con el mismo sid pero comenzando en 9.
alert tcp any any -> any 5060 (msg:"COMMUNITY SIP INVITE message flooding"; content:"INVITE"; depth:6; threshold: type both, track by_src, count 100, seconds 60; classtype:attempted-dos; sid:100000158; rev:2;)
alert udp any any -> any 5060 (msg:"COMMUNITY SIP INVITE message flooding"; content:"INVITE"; depth:6; threshold: type both, track by_src, count 100, seconds 60; classtype:attempted-dos; sid:900000158; rev:2;)
Lo mismo hice con el resto de las reglas.

Siguiendo con las modificaciones, también tuve que adaptar una regla que reportan anomalías DNS. La regla en cuestión genera el alerta "COMMUNITY SIP DNS No such name treshold - Abnormaly high count of No such name responses" y se encuentra en /etc/snort/rules/community-sip.rules.
La regla dispara la alerta cuando alguno de nuestros servidores DNS ($DNS_SERVERS) retorna varias respuestas del tipo "Not Found" a un dado host en un determinado intervalo de tiempo. En general esto puede significar que algún atacante está haciendo fuerza bruta para determinar qué nombres DNS existen en la red, pero hay excepciones.
Como en la empresa utilizamos el servicio de spamhaus para determinar si una dirección DNS se encuentra en una lista negra (algo que nos permite descubrir Spammers y así rechazar e-mails de Spam), este tipo de alertas surge a menudo. Por diseño las DNSBL (DNS Black List) funcionan retornando "Not Found" si una dirección DNS no se encuentra en la lista negra, y dado que se reciben muchos mails por minuto, se arrojan muchos "Not Found" por minuto, ocasionando que la regla de snort genere muchos alerts.
Además el Proxy que actúa de servidor DNS y de cliente de nuestro servidor de DNS, puede también ocasionar muchos "Not Found", por lo que necesitamos evitar las consultas de estos equipos.
Para evitar esto, al igual que antes, podemos comentar la regla cuyo sid es 100000161 y agregar una nueva en local.rules que tenga en cuenta estos casos.
alert udp $DNS_SERVERS 53 -> ![$DNS_SERVERS,$SMTP_SERVERS,$MONITOR] any (msg:"COMMUNITY SIP DNS No such name treshold - Abnormaly high count of No such name responses"; content:"|83|"; offset:3; depth:1; threshold: type both, track by_dst, count 100, seconds 60; content:!"spamhaus.org"; classtype:attempted-dos; sid:100000161; rev:2;)
Existe una regla casi igual a la anterior, que también debemos modificar. Esta regla se encuentra en /etc/snort/rules/emerging-policy.rules y, al igual que la anterior, alerta cuando ve muchos "Not Found" enviados por algún servidor DNS. La diferencia con la regla anterior es que en este caso, el servidor orígen puede ser cualquiera, y los hosts destinos no deben ser ni nuestros servidores DNS ni los SMTP.
El problema con esta regla es que recibía muchos alertas desde la misma máquina monitor (OSSIM). Esto se debe a que la máquina monitor intenta resolver todas las IPs que ve pasar, y como muchas IPs no tienen resolución inversa, recibe muchos "Not Found".
En este caso, haremos igual que antes, comentamos la regla con sid 2103195 y creamos una nueva en local.rules que sea como la siguiente:
alert udp any 53 -> ![$DNS_SERVERS,$SMTP_SERVERS,$MONITOR] any (msg:"ET POLICY Unusual number of DNS No Such Name Responses"; content:"|83|"; offset:3; depth:1; threshold: type both , track by_dst, count 50, seconds 300; classtype:bad-unknown; reference:url,doc.emergingthreats.net/2003195; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/POLICY/POLICY_DNS_Responses; sid:2103195; rev:5;)
donde $MONITOR es la IP de la máquina monitor.


Reglas con Proxy

La mayoría de las reglas no tienen en cuenta que puede existir un proxy en la red y que todos los accesos Web a internet se realizan a través de este. El formato de las reglas suele ser:
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (opciones)
y en las opciones se especifican los parámetros a matchear en un paquete para descubrir anomalías como accesos a megaupload, uso de Base64 para transmitir credenciales, etc.
Si bien las reglas funcionan correctamente y podemos ver el alert, no podemos ver quién fue el origen. Es decir, como tenemos un Proxy, el pedido de un usuario en la red será al proxy (HOME_NET -> HOME_NET), y la alerta no se dispara. La alerta recién se dispara cuando el Proxy sale a buscar la página a internet (HOME_NET -> EXTERNAL_NET), pero en este caso el orígen del pedido es el Proxy. Como resultado tenemos que todos los alerts parecen causados por el proxy y no tenemos forma de ver quién fue el que hizo el pedido al proxy... es decir, un alert que no nos sirve de nada.

Entre las opciones se me ocurrió sacar al proxy de HOME_NET, quedando entonces en EXTERNAL_NET, por lo que los pedidos de los clientes al proxy quedarían registrados. El problema es que como nuestro proxy forma parte del dominio, utiliza recursos de varios otros servidores (DNS, CIFS, LDAP, etc), y hay muchas reglas que si detectan que un host de la EXTERNAL_NET accede a servicios de la HOME_NET como LDAP, disparan alertas. Es decir, arreglo un problema, pero comienzo a tener un tremendo problema de falsos positivos.

La solución que implementé es reescribir todas estas reglas y que queden con el formato:
alert tcp $HOME_NET any -> $PROXY_SERVERS $PROXY_PORTS (opciones)

Como existen muchas reglas de este estilo, cree un script en bash que automatice el proceso, y lo agregué al script de actualización de reglas de snort que cité en "Mantener Snort actualizado" (ver la última línea snort_proxy-fixer). Este script deberían colocarlo en /usr/sbin para que funcione el script de actualización. La función es simple, revisa todos los archivos con reglas y utiliza sed para reemplazar "tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS" por "tcp $HOME_NET any -> $PROXY_SERVERS $PROXY_PORTS":

#!/bin/bash

######################################################
# Created by: d3m4s1@d0v1v0
# Covered by GPLv2.0
######################################################

SNORT_RULES_PATH="/etc/snort/rules/"

RULES_FILE=$( ls $SNORT_RULES_PATH )

echo "************************************************"
echo "*** snort rules proxy fixer by d3m4s1@d0v1v0 ***"
echo "************************************************"
echo
echo "replacing rules <\$HOME_NET any -> \$EXTERNAL_NET \$HTTP_PORTS> with <\$HOME_NET any -> \$PROXY_SERVERS \$PROXY_PORTS>"
echo "please define the variables \$PROXY_SERVERS and \$PROXY_PORTS in snort.conf. Usual PROXY_PORTS are 8080 (ISA) and 3121 (Squid)"
echo

for FILE in $RULES_FILE
do
FILE=$SNORT_RULES_PATH$FILE
TMP_FILE=$FILE".tmp"
if [ -f $FILE ]
then
sed s/"tcp \$HOME_NET any -> \$EXTERNAL_NET \$HTTP_PORTS"/"tcp \$HOME_NET any -> \$PROXY_SERVERS \$PROXY_PORTS"/ $FILE > $TMP_FILE
cp $TMP_FILE $FILE
rm $TMP_FILE
if [ $? != 0 ]
then
echo "ERROR fixing file!:"$?
else
echo -n .
fi
fi
done

echo "[done]"

Habría que pensar qué otro formato se le puede dar para el caso de tener hosts que no salen por el proxy, pero en mi caso funciona perfecto.


Problema sin solución simple

Encontré un problema con el preprocesador sfPortscan. Si, solucioné el problema inicial con los servers más utilizados (DNS, Proxy, SMTP), pero sigo obteniendo muchos falsos positivos. Tal vez sea la configuración Windows que envía muchos RST cuando no correspondería hacerlo.
Estaré trabajando sobre este problema y si encuentro alguna solución les comento =)


Conclusiones

Snort es un IDS excelente y muy completo, pero algo complejo y que necesitamos utilizarlo un tiempo para entender el funcionamiento y adaptarlo a nuestras necesidades. Como siempre digo, no hay mejor forma de aprender a utilizar snort que leyendo el Snort User Manual. Leerlo toma un tiempo, pero ahorra tiempo de enojo y de buscar qué es lo que pasa cuando algo no anda.

Por suerte una vez customizado tendremos una fuente confiable de lo que sucede en la red, la cual podemos consultar en el momento que deseemos, o incluso configurar para que nos envíe las alertas por mail.
Si bien no hablé sobre activar acciones al ocurrir ciertos alertas, esto es factible y una característica muy interesante que espero estar aprendiendo próximamente. Por ahora utilizo Snort como sistema de reporte de problemas a través de la interfaz Web de OSSIM.

No se desesperen por la cantidad de falsos positivos que ven al principio. Luego del uso diario aprenden a distinguir falsos positivos y a "adaptar" las reglas que los generan para que no siga sucediendo. Por suerte las reglas están escritas en texto plano y son fáciles de entender una vez que leen el manual, o los diversos tutoriales que existen sobre escritura de reglas.
Una vez que aprenden a crear reglas, les resultará muy útil para generar alertas especiales sobre cosas que suceden en la red. La posibilidad de adaptación de Snort a una red es enorme, solo lleva un tiempo.

Como dije al principio, espero que esta Guía los ayude a entender un poco más Snort y no repetir errores que yo cometí, o investigar sobre cosas que ya investigué.
Nueva característica para Oinkmaster
Para el que no lo tenga presente, Oinkmaster es un muy útil script en perl que nos permite mantener las reglas de snort actualizadas. Oinkmaster permite customizar la forma en que las reglas se actualizan, posibilitando que el administrador elija si hay reglas que no desea tocar, si hay reglas que desea modificar y varias cosas más.

El script es relativamente simple, descarga el paquete de reglas desde la página de snort (un tar.gz) a un directorio temporal, lo descomprime y luego, dependiendo de lo especificado en el archivo oinkmaster.conf, copia dichas reglas al directorio de reglas de snort. Si las reglas nuevas cambian con respecto a las que teníamos, copia las nuevas al directorio. Lo bueno es que en oinkmaster.conf podemos definir que si nosotros desactivamos una regla, cuando actualice la mantenga desactivada, además podemos aplicar reglas de modificación, y saltear archivos completos de reglas (es decir para que no los pise con reglas nuevas). Realmente un lujo. Pueden leer más en su web oficial (http://oinkmaster.sourceforge.net/). Próximamente estaré publicando un artículo bastante completo sobre configuración de snort que incluye al oinkmaster.

Una necesidad que surgió durante la desactivación de alertas de Snort es poder agregar rangos de SIDs (id de reglas) para deshabilitar. En el script original, si deshabilitamos las reglas cuyos sid son 2, 3, 4, y 5, tendremos que agregar a oinkmaster.conf la opción "disablesid 2,3,4,5". Con estos numeritos no es tan problemático, pero con los SID kilométricos de algunas reglas, si deseamos desactivar varios SIDs sucesivos, es una molestia tener que escribir uno por uno.
Por ello modifiqué el script perl para poder agregar opciones del estilo "disablesid 2-5" en oinkmaster.conf y así poder deshabilitar varias reglas sin necesidad de escribir todos los SIDs. Ya que estaba, también modifiqué el script para que acepte rangos en la opción localsid (SID de reglas que no debe tocar), y enablesid (SID de reglas que debe activar).

A partir de las modificaciones (nada del otro mundo, cabe destacar), cree un diff que permite parchar el script original, el cual pueden descargar aquí.

Para aplicar el patch simplemente copien el código en un archivo oinkmaster.patch, guardenlo en el directorio donde tienen el script original (suele llamarse oinkmaster.pl u oinkmaster) y parados en dicho directorio, ejecuten lo siguiente:
# patch < oinkmaster.patch
Envié estas modificaciones al autor original (Andreas Östling), el cual me contestó varias semanas después, diciéndome que las modificaciones le parecían muy interesantes y que iba a tratar de incorporarlas, aunque ya no tiene tiempo para trabajar en Oinkmaster, así que no sabía cuándo iba a poder hacerlo.

En fin, espero que les resulte útil como a mi!
Monitoreo de red: OSSIM Review Parte I (OSSIM, Snort y OSSEC)
Hace tiempo en la empresa deseamos instalar un servidor de monitoreo, y por suerte el último mes volvieron realidad mi sueño (si me contento con poco...). Ya tenía en mente cómo sería la máquina para monitorear, tendría un GNU/Linux (tal vez debian o CentOS), y herramientas como ntop, Nessus y snort, pero no mucho más. Pero la cosa cambió cuando Javi me recomendó utilizar la distribución AlienVault OSSIM (Open Source Security Information Management). Esta distribución esta diseñada pensando en el monitoreo, e incluye todas aplicaciones libres destinadas a tal fin, ya configuradas y listas para usar.
La distribución lleva el nombre de la herramienta OSSIM, la cual se encarga de juntar los resultados retornados por las diferentes aplicaciones y mostrarlos en una interfaz Web única, desde donde el administrador puede observar todo lo que sucede en la red.
Si bien la instalación es muy simple y todo sale funcionando en cuestión de minutos, es necesario conocer las aplicaciones que corren de fondo para así entender los resultados retornados, y configurar el sistema para visualizar la información que nos interesa. Esta customización la vengo haciendo hace algunos días, y a partir de ella aprendí para qué sirve cada herramienta.

Como la funcionalidad de OSSIM se basa en las herramientas que corren por detrás, haré un mini-review de cada una. El review lo dividiré en partes porque son varias herramientas y muchas tienen varios componentes por lo que harían el artículo demasiado extenso. En esta primera parte hablaré de OSSIM en sí y de dos de los IDSs que trae, en las próximas examinaré el resto de las herramientas.


OSSIM

Como dije anteriormente, esta herramienta, desarrollada por la gente de AlienVault, se encarga de recolectar los datos entregados por las diferentes aplicaciones de monitoreo y mostrarlos a través de una interfaz Web. Realmente me sorprendió el nivel de integración que tiene OSSIM con el resto de las herramientas (que describiré abajo), logrando abstraer al administrador de lo que sucede de fondo. En lugar de tener que mirar por separado miles de logs, la interfaz Web junta todos los datos en un solo lugar y permite así tener vistas detalladas de cada aspecto de las redes, hosts, servidores, etc.

OSSIM se divide en tres programas: ossim-server, ossim-framework y ossim-agent. Además utiliza una base de datos para almacenar los eventos y la información necesaria para plugins.

- ossim-server: este programa es un demonio que se ejecuta en background y se conecta con la base de datos para obtener/ingresar datos desde los agentes y el framework. El propósito principal de este programa es:
# recolectar datos de los agentes y otros servidores
# priorizar los eventos recibidos
# correlacionar los eventos recibidos de diferentes fuentes
# realizar la evaluación de riesgos y disparar alarmas
# almacenar eventos en la base de datos
# reenviar eventos o alarmas a otros servidores
Pueden leer más en la documentación oficial sobre servidor.

- ossim-framework: es otro demonio que ejecuta tareas misceláneas, no realizables por los agentes, servers o el front-end. Este accede tanto a la base de datos de conocimiento del OSSIM, como a la BD de eventos. El propósito principal de este programa es:
# leer/escribir archivos del filesystem, evitando que el server web lo haga directamente.
# ejecutar comandos externos.
# ejecutar en background tareas que requieran uso intensivo de CPU, para acelerar la visualización y el análisis.
Pueden leer más en su documentación oficial sobre framework.

- ossim-agent: se instala un agente en cada máquina que deseamos utilizar como monitor (llamadas sensores). Los agentes se encargan de recolectar todos los datos enviados por los diferentes dispositivos conectados a la red, estandarizar estos datos para que OSSIM pueda entenderlos, y luego enviarlos al servidor.
Pueden leer más en la documentación oficial sobre agentes.

Dados los tres programas anteriores, la arquitectura de OSSIM se divide en 4 elementos:
1. Sensores
2. Servidor de Administración
3. Base de Datos
4. Frontend
En la configuración default, los sensores se encargan de realizar las tareas de IDS, Vulnerability Scanner, detección de anormalidades, monitoreo de red, recolección de datos de routers, firewalls, e incluso pueden funcionar como firewall. Los sensores se encargan de enviar toda la información al servidor de administración, luego de haberla estandarizado.
Por su parte, el servidor de administración contiene el framework y el servidor OSSIM. Este servidor se encarga de recolectar la información de todos los sensores y normalizar, priorizar, coleccionar eventos, así como realizar análisis de riesgo. Además se encarga de realizar backups, inventarios on-line, y ejecución de escaneos.
La base de datos almacena eventos e información útil para la administración del sistema.
El frontend, como ya mencioné, es una aplicación web donde se puede visualizar todo lo que sucede.

La magia utilizada para estandarizar los datos recolectados de los diferentes programas, se realiza a través de plugins. Cada herramienta que se utiliza, debe tener su correspondiente plugin en OSSIM.
Existen dos tipos de plugins:
- Detectores: encargados de leer los logs creados por las diferentes herramientas y estandarizarlos para que el Agente pueda enviarlos al servidor. Ejemplos típicos de plugins detectores son snort, p0f, arpwatch, pads, etc.
- Monitores: reciben pedidos del servidor OSSIM y los envían a la herramienta correspondiente, obtienen la respuesta y le avisan al servidor si la herramienta acepta lo que se le pide. Ejemplos de monitores son el nmap y tcptrack.

Como ven, OSSIM es un sistema bastante complejo. En la documentación oficial pueden encontrar cómo crear plugins propios, así como también cómo crear políticas para generar alertas y acciones. Realmente vale la pena estudiarlo y utilizarlo.


Snort

Snort es uno de los IDSs utilizados por OSSIM. Por si todavía no conocen este tipo de herramientas, IDS significa Intrusion Detection System, o sistema de detección de intrusos. Los IDSs utilizan distintas técnicas de análisis para alertar al administrador en caso de ver acciones sospechosas. Snort en particular es un NIDS (N de Network) que se encarga de analizar el tráfico de red, inspeccionando el contenido de los paquetes para disparar alertas, o incluso, realizar algún tipo de acción cuando detecta trafico sospechoso. Snort es el IDS más utilizado mundialmente, y es probablemente el más completo de su tipo.
Como bien dice en el FAQ oficial, snort realiza análisis de protocolo, búsqueda/matching de contenido, y puede detectar una gran variedad de ataques y pruebas, como buffer overflows, escaneo sigiloso (stealth) de ports, ataques CGI, intentos de fingerprint de SOs, pruebas SMB, y mucho más.

La idea es simple (implementarla no lo es tanto), Snort sniffea la red y a través de un conjunto de reglas decide si el tráfico es sospechoso. Las reglas contienen la información que debería contener un paquete para considerarlo sospechoso, como ser la IP origen, el port origen, la IP destino, el port destino y el contenido del paquete. En las reglas se pueden utilizar expresiones regulares y se debe incluir un mensaje que describa qué es lo que detecta.
Además del motor de detección, Snort provee preprocesadores. Los preprocesadores permiten a los usuarios y programadores extender la funcionalidad de Snort. El código de los preprocesadores se ejecuta antes del motor de detección, pero después de que el paquete fue decodificado.

Snort es muy flexible y permite al usuario crear sus propias reglas y preprocesadores. Las reglas se almacenan en path/snort/rules/ y tienen una sintaxis simple, los preprocesadores requieren programación. Un artículo interesante para revisar es el de O'Reilly Write Your Own Snort Rules . Por supuesto, la mejor referencia de Snort es la guía de usuario proporcionada por Sourcefire (la empresa detrás de Snort).


OSSEC

Otro de los IDSs provistos por OSSIM, en este caso, un HIDS (H de Host). Un sistema de detección de intrusos basado en el Host se encarga de analizar los datos del host y detectar a través de ellos si el host está siendo víctima de algún ataque. OSSEC realiza esta tarea analizando logs, checkeando integridad, monitoreando la registry de Windows, detectando rootkits, y generando y respondiendo en tiempo real.
Los IDSs basados en análisis de logs son llamados LIDS (L de Log), porque detectan errores (o ataques) usando logs como su fuente de información primaria.

OSSEC (desarrollado por Trend Micro) está formado por un administrador (manager) central de monitoreo, que recibe información desde agentes, syslog, bases de datos y dispositivos sin agentes (agentless).


El manager almacena las bases de datos del chequeo de integridad de archivos, los logs, los eventos, y las entradas de auditoría del sistema. Todas las reglas, decodificadores y configuraciones importantes se almacenan en el manager.
Los agentes son pequeños programas que se instalan en los sistemas que deseamos monitorear, estos coleccionan información en tiempo real y se la envían al manager para ser analizada.
En los sistemas donde no se puede instalar agentes (Agentless), OSSEC puede realizar monitoreo de integridad de archivos.

OSSEC corre en la mayoría de los sistemas (Windows, Linux, OpenBSD/FreeBSD, y MacOS), y el análisis lo realiza a través de reglas escritas en lenguaje XML. Al igual que Snort, estas reglas son relativamente simples de escribir y se basan en la búsqueda de patrones (se pueden usar expresiones regulares) en los archivos analizados. También se pueden crear reglas compiladas, escritas en lenguaje C.

Como se habrán dado cuenta, OSSEC es una herramienta muy potente. Pueden aprender más de OSSEC leyendo el FAQ de la página, donde encontrarán varios tutoriales.


To be continued...

Como dije al principio del artículo, OSSIM posee muchas herramientas, las cuales son complejas y tienen grandes funcionalidades. Entre las herramientas más complejas, me falta escribir sobre Nagios, Ntop, Osiris y OpenVAS. Además me falta describir herramientas más simples en arquitectura pero extremadamente útiles como arpwatch, p0f, tcptrack, pads, spade y Snare. Esperen la próxima entrega, la cual espero no demorar demasiado...