Una simple alerta de exceso de correo en cola con OSSEC

Vamos a crear una alerta para OSSEC que se dispare cuando el número de correos en la cola supere un límite determinado. El proceso lo dividiremos en tres pasos:

  • Crear un script que compruebe el número de emails en cola a intervalos determinados y guarde el resultado en un fichero log si éste supera el límite impuesto.
  • Crear un decoder para OSSEC que lea el log generado por el script y devuelva un determinado valor (flag) indicando que hay que lanzar la alerta.
  • Crear una regla para OSSEC que establece el id de la alerta, su nivel, su grupo y el mensaje que recibiremos por correo.

Script para comprobar el número de correos en cola

Se ha desarrollado para funcionar con QMail pero debería ser fácilmente adaptable a Postfix u otras MTA. Su funcionamiento se basa en obtener el número de correos totales (locales + remotos) haciendo uso de la utilidad qmhandle, aunque podemos usar qmail-qstat u otro obteniendo el mismo resultado:
#!/bin/bash

PROGNAME=vigila-cola-qmail
LOG=/var/log/lon-cola-qmail
LIMIT=100
FLAG=alert
cola=$(/usr/bin/qmhandle.pl -l | grep "Total messages" | awk '{ print $3 }')
if [ "$cola" -ge "$LIMIT" ]; then
     data=$(date +%s | awk '{ printf("%s", strftime("%h %d %H:%M:%S", $1)); }')
     echo $data $HOSTNAME $PROGNAME":" $cola [limite: $LIMIT]" "$FLAG >> $LOG
fi
El script simplemente invoca a qmhandle con el parámetro -l (obtener número de correos en cola), filtra la línea donde aparece el total y recoge éste. A continuación comprueba si el total obtenido es igual o mayor que el límite señalado y si es así graba una línea en formato syslog indicando la fecha y hora, el nombre del programa, el del host, el valor obtenido, el límite y el indicador (flag) que en este ejemplo es la cadena alert. A continuación creamos un cron para que se ejecute por ejemplo cada 5 minutos:

crontab -e

y añadimos

*/5 * * * * /path-al-script/vigila-cola-qmail

Decoder OSSEC para leer las alertas

El decoder, que añadiremos a /ossec/etc/decoder.xml, lee las nuevas líneas añadidas al log anterior y extrae la cadena del indicador asignándola al parámetro extra_data:

<decoder name="qmail-qeue-size">
<program_name>^vigila-cola-qmail</program_name>
<regex>^\S+ \plimite: \d+\p (\S+)</regex>
<order>extra_data</order>
</decoder>

Regla OSSEC para disparar la alerta

Añadimos una directiva en la sección <ossec_config> de /ossec/etc/ossec.conf para monitorizar el log generado por el script:

<localfile>
  <log_format>syslog</log_format>
  <location>/var/log/lon-cola-qmail</location>
</localfile>

Y para terminar añadimos la siguiente regla con nivel 13 (alta importancia), redefinimos su grupo a spam y establecemos el mensaje que aparecerá en el correo de aviso. El valor del indicador (alert) se especifica en las etiquetas <extra_data> y debe existir para que se dispare la regla:

<rule id="100105" level="13">
<decoded_as>qmail-qeue-size</decoded_as>
<extra_data>alert</extra_data>
<group>spam</group>
<description>QMail: Exceso de email en la cola de correo, posible spam</description>
</rule>

Podemos añadir la regla a un fichero propio /ossec/rules/mis-reglas.xml dentro del grupo syslog (<group name="syslog,"> ... </group>) sin olvidar añadir éste a la lista de includes en /ossec/etc/ossec.conf (<include>mis-reglas.xml</include>) o en local_rules.xml por ejemplo, sin olvidar hacer la copia de seguridad antes. Reiniciamos OSSEC y desde este momento recibiremos un aviso en nuestro buzón si la cola de correo crece más de lo que debería. Entonces podremos tomar medidas manualmente o tener preparado algún otro script que realice algunas acciones previas para mitigar los posibles daños (caso de que nos pille durmiendo).

No hay comentarios:

Publicar un comentario