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.

4 comentarios:

Anónimo dijo...

muy interesante informacion para tener encuenta

yo tambien estoy trabajando en un proyecto con ossim y es de mucha utilidad tu informacion

saludos de chile

Cristian Carrasco

Anónimo dijo...

En el post se trata sobre el inconveniente de la desaparición de los eventos, pero no está muy clara la parte del cambio de configuración, en mi caso solo se muestran hasta 8 días antes, el resto de eventos ya no se muestra. Estoy utilizando la version 4.3.4-7 open de OSSIM y hay la opción Configuracion>>Administracion>>Copia de Seguridad pero al ingresar a la opción Copia de Seguridad no existe ningún respaldo almacenado.

Por favor si alguien sabe como configurar en la herramienta para que no desaparescan los eventos, me serviría de mucha ayuda alguna explicación

Saludos Cordiales

d3m4s1@d0v1v0 dijo...

No he probado la versión 4 de OSSIM, la que tengo actualmente es la 3.1.
El intervalo de borrado de eventos en la versión que te comento se cambia desde "Configuration -> Main -> Backup", en el atributo "Active Event Window (days)". También hay que tener en cuenta la variable "Active Event Window (events)", dado que si se supera la cantidad de eventos antes de la cantidad de días que pusiste, se borrarán igual los eventos antiguos.
Perdón si no quedó del todo claro en la explicación.

Anónimo dijo...

Muchas gracias d3m4s1@d0v1v0 por tu respuesta,

En la versión 4 existen estas doas opciones:
*Eventos a mantener en BBDD (Número de dias)
*Eventos a mantener en BBDD (Número de eventos)

He cambiado el número de días a 30 y haber como me va..!!

Saludos Cordiales

Publicar un comentario