Un script para correlarlos a todos

En esta entrada vamos a hablar de la herramienta Simple Event Correlator (SEC), un script que realiza tareas de correlación cogiendo como fuentes cualquier tipo de log que podamos recibir en nuestros sistemas. Sus puntos fuertes son que no consume demasiados recursos en su ejecución y está escrita íntegramente en Perl, sin necesidad de librerías adicionales a las incluidas en la instalación por defecto de este lenguaje, por lo que podremos utilizarlo casi en cualquier plataforma.

El flujo de procesamiento que realiza se divide en tres partes: especificar qué logs queremos monitorizar, definir una serie de reglas que se comprobarán con cada nueva entrada en el log y, si aparece alguna correspondencia, se realizará automáticamente una acción definida previamente.

Las reglas están formadas por una serie de atributos para definir las acciones a realizar. Hay varios tipos de reglas que se pueden crear: detección de patrones, ya sean escritos en la propia regla (Single) o en un script (SingleWithScript), emparejar dos eventos independientes (Pair), o basadas en una hora y/o fecha específicas (Calendar) son varios ejemplos de lo que nos podemos encontrar entre todas sus opciones.

Dependiendo del tipo de regla que vayamos a crear, será necesario emplear unos parámetros determinados. Por ejemplo, los que necesita una regla de tipo Single de manera obligatoria son los siguientes:

  • type: El tipo de regla. En este caso, “Single”. No distingue entre mayúsculas y minúsculas.
  • ptype: El tipo de patrón utilizado en el campo pattern.
  • pattern: El patrón a emplear para que salte la regla.
  • desc: La descripción del evento detectado.
  • action: La acción que se va a ejecutar una vez se detecta el evento.

Es posible añadir parámetros adicionales a las reglas, como comentarios adicionales (rem) o una segunda acción si la primera no se ejecuta correctamente (action2), todo ello dependiendo de la regla que estemos usando.

Para terminar, vamos a mostrar un caso práctico de aplicación. Supongamos que tenemos un servidor personal donde hemos instalado inicialmente fail2ban y cambiado el puerto de las conexiones SSH al 2552, pero además queremos hacer un registro tanto de las direcciones IP que se bloquean como de las desbloqueadas. Echando un vistazo rápido a los logs de fail2ban, nos encontramos con líneas como las siguientes:

2015-05-17 08:04:15,948 fail2ban.actions: WARNING [apache-fail2ban] Unban 151.80.129.118
2015-05-17 14:43:08,815 fail2ban.actions: WARNING [apache-fail2ban] Ban 74.208.225.40

A continuación escribiremos dos reglas muy similares para que cada una filtre un tipo de evento y lo escriba en su fichero correspondiente. Como ambas van a aplicarse contra el mismo log, solamente necesitaremos un único fichero, el cual llamaremos fail2ban.sec.

type=Single
ptype=RegExp
pattern=(.*)s(?:.*)sfail2ban.actions:sWARNINGs[apache-fail2ban]sBans(.*)
desc=$0
action=write /var/log/bans.txt $1 $2

type=Single
ptype=RegExp
pattern=(.*)s(?:.*)sfail2ban.actions:sWARNINGs[apache-fail2ban]sUnbans(.*)
desc=$0
action=write /var/log/unbans.txt $1 $2

Ya solo nos queda lanzar el programa indicando en los parámetros el fichero de reglas que va a aplicar, los logs a monitorizar y especificar que se ejecute como un demonio:

perl sec.pl -conf=fail2ban.sec -input=/var/log/fail2ban.log –detach

Con un poco de paciencia y tiempo tendremos una pequeña base de datos a explotar, como por ejemplo realizar un script para contar cada IP que ha sido bloqueada y si en total suma más de X apariciones pasar a bloquearla indefinidamente. Esto ya depende de las necesidades (y la imaginación) de cada uno.

En resumen, una herramienta sencilla con más potencial del que aparenta a primera vista, tanto por todas las opciones que encontramos en su documentación que es capaz de realizar como la sinergia que posee para ser utilizada junto a otros programas en proyectos más grandes.